Симуляция ткани в houdini

Предположим, что Вы имеете в наличии геометрию ткани и анимированную геометрию тела персонажа, как сети SOP. Тогда Вы можете настроить симуляцию одевания персонажа, используя инструменты на полке Cloth.

  1. Откройте файл SimpleDressSetup в качестве примера TODO.
  2. Превратите платье в Cloth Object.
  3. Щелкните по инструменту Deforming Collider, чтобы превратить анимированную геометрию тела в объект, с которым может сталкиваться ткань.
  4. Используйте инструмент Attach Cloth to Body tool, чтобы присоединить объект ткани к анимированному телу.
  5. Нажмите кнопку Play на playbar, чтобы наблюдать анимацию.

Ткань Изменение внешнего вида ткани

Параметры Жесткость (Stiffness) и Амортизация ( Damping)

Параметры на вкладке Material управляют внутренними силами модели Cloth Object’s. Вид материала ткани может быть изменен, используя настройки жесткости (stiffness) и амортизации (damping) на вкладке Material узла Cloth Object. Параметры Stiffness (жесткость) управляют тем, как сильно ткань сопротивляется деформации. Параметры Damping (Амортизации) управляют, как быстро ткань теряет энергию в результате коэффициента деформации.

Есть три основных типа деформации: растяжение (stretch), сдвиг (shear), и изгиб (bend). Вместе, свойства Stretch, Shear и Bend определяют поведение ткани. У каждого из этих свойств есть настройки, которыми можно управлять независимо. Stiffness и Damping — самые важные настройки, определяющие поведение ткани.

Damping не должен обычно превышать 1 % Stiffness.

Пример: деформация Stretch (Растяжения)

Увеличение значения Stretch Stiffness сделает ткань менее эластичной во время симуляции. Увеличение Stretch Damping сократит время колыхания ткани, вынуждая симуляцию успокоиться быстрее.

Обычно, параметры жесткости/амортизации работают равномерно в Cloth Object в целом. Однако, Вы можете управлять жесткостью/амортизацией локально, используя атрибуты точек. Эти атрибуты действуют как множители значений, которые определены на Cloth Object. Атрибуты примитивов, которые умножают Stretch (Растяжение), Shear (Смещение), Weak Bend (Слабый изгиб), и Strong Bend (Сильный изгиб) модели:

Параметр Тип Имя
Stiffness (Жесткость) float shellstretchstiffness
Damping (Амортизация) float shellstretchdamping
Shear Stiffness (Жескость сдвига) float shellshearstiffness
Shear Damping (Амортизация сдвига) float shellsheardamping
Weak Bend Stiffness (Жескость слабого изгиба) float shellweakbendstiffness
Weak Bend Damping (Жескость слабой амортизации) float shellweakbenddamping
Strong Bend Stiffness (Жескость сильного изгиба) float shellstrongbendstiffness
Strong Bend Damping (Жескость сильной амортизации) float shellstrongbenddamping

Параметры Stiffness и Damping могут быть анимированы во время симуляции, чтобы изменить поведение ткани во времени. То же самое — истина для атрибутов множителя. Изменение атрибутов множителя должно произойти в геометрии симуляции при использовании SOP солвера в DOPs.

Слабый изгиб по сравнению с сильным изгибом

Есть два типа сопротивления изгиба, которые можгут использоваться одновременно. Weak Bend моделирует сопротивление изгиба тонких материалов ткани, таких как шелк. Этот изгиб модели будет всегда заставлять ткань возвращать свою первоначальную форму. Для более плотных типов ткани (или других материалов) может использоваться Strong Bend. Если жесткость для сильного изгиба увеличена достаточно, то моделируемая ткань должна оправиться из изгиба любой величины. Вы можете смешать сильную и слабую модели изгиба, чтобы моделировать самые разные гибкие материалы от шелков до плотных хлопков, пластмасс, металлов, и чего-либо промежуточного. Модель сильного изгиба подходит для создания ткани, которая очень жесткая и подходит для деформаций материалов, таких как металл, жесткие хлопки, пластмассы, и другие гибкие материалы.

Для симуляции сильного изгиба, такой как швы или кожа, Вы можете захотеть изменить параметр Float Precision на Cloth Solver на Float 64 bit.

Независимость от разрешения (Resolution independence)

Не имеет значения, насколько детализирована ткань, настройки жесткости и амортизация нормализуются, чтобы иметь приблизительно одинаковую силу. Поэтому, Вы должны сможете снова использовать те же самые настройки для жесткости и амортизации, после увеличения разрешения ткани (например используя Subdivide SOP).

Единицы измерения длины (Length Units)

Настоятельно рекомендуется чтбы Вы моделировали ткань в реальном размере. Например, штаны должны быть примерно 1 метр длиной. Если Вы делаете это, то эффекты параметров жесткости и амортизации предсказуемы. Это также делает внешние силы, такие как влияние силы тяжести реалистично с настройками по умолчанию. Если Вы хотите использовать единицы измерения длины, отличающиеся от метров, то Вы должны установить свои единицы длины в Hip File Options прежде, чем Вы создадите свою сеть симуляции. Для всех объектов в DOPs, которые создаются после изменения этих настроек, будут автоматически скорректированны их значения по умолчанию для новых единиц измерения.

Симуляция геометрии

Для симуляции может использоваться сочетание треугольников и квадратов. В случае треугольников, сплетения и направления деформации определены атрибутами UV на ткани. В случае квадратных сеток, определение атрибутов UV является дополнительной опцией. Если на квадратах не будет UV, то направления ребер, как будет предполагаться, будут деформированны направлениями сплетений ткани.

Простая сетка из квадратов, является хорошим примером, чтобы проверить различные способности солвера ткани.

Позиции покоя (Rest Positions)

Позиции покоя (rest positions) вершин играют критическую роль в поведении ткани. Позиции покоя хранятся на геометрии симуляции в rest атрибуте вершины (vertex attribute). Атрибут rest position ‘rest’ может быть или атрибутом точки или атрибутом вершины. Использование атрибута вершины ‘rest’ позволяет Вам создавать многократные куски ткани в пределах единственного объекта ткани. Внутренние силы ткани вычисляются, сравнивая текущую позицию (хранящуюся в P ) с позицией покоя rest . Например, в случае растяжения, солвер сравнивает длины ребер, основанные на P с соответствующими длинами ребер, основанными на rest .

Чтобы приспособить одежду плотно на тело, rest positions может быть немного сокращена от начальных позиций.

Плотность Массы Поверхности (Surface Mass Density)

Этот параметр в Cloth Mass Properties DOP производит нагрузку на ткань, но не явно заметным способом, если Вы корректируете это в DOPs. Это более или менее имеет дело с взаимодействиями тканей, такими как слои тяжелых кусков ткани на более легкой.

Вы не можете видеть эффект, потому что солвер нормализует значения drag относительно Surface Mass Density, так, чтобы Вы могли корректироватьпараметры материала независимо, не волнуясь о том, на сколько они взаимозависимы. Если Вы хотите видеть эффект массы, Вы можете войти в Cloth Drag Properties DOP и удалить ссылки канала или уменьшить свойства drag на вкладке Drag узла Cloth Object.

Другой способ увидеть эффект Surface Mass Densit на drag, это добавить плотность через Attribute Create SOP, так как это работает независимо и не нормализует, drag для плотности.

Cloth

How to create and simulate cloth and other flexible materials.

Subtopics

Getting Started

Next Steps

Troubleshooting

How to

Справка Houdini на русском

Начало работы

New features and changes in Houdini 16.5.

The basics of working with Houdini’s user interface.

How to use and customize the icons on the shelf at the top of the main window.

How to use the network and parameter editors to work in Houdini.

Example files showing how different nodes work.

How to use the online help and document your own tools.

Использование Houdini

How Houdini represents geometry and how to create and edit it.

How to use copies (real geometry) and instances (loaded or created at render time).

How to create and keyframe animation in Houdini.

How to rig and animate characters in Houdini.

How to render images and animation from the 3D scene.

How to assign materials and create custom materials for shading.

Houdini’s compositing networks let you create and manipulate images such as renders.

Digital assets let you create reusable nodes and tools from existing networks.

How to get scene, object, and other data in and out of Houdini.

Using Houdini’s stand-alone image viewer.

Динамика

How to create particle simulations.

How to use Houdini’s dynamics networks to create simulations.

How to simulate smoke, fire, and explosions.

How to set up fluid and ocean simulations.

How to simulate grainy materials (such as sand).

How to create and simulate crowds of characters in Houdini.

Как создавать прически, и добавлять динамику волосам и шерсти.

How to create and simulate deformable objects

How to create and simulate cloth and other flexible materials.

Object nodes represent objects in the scene, such as character parts, geometry objects, lights, cameras, and so on.

Geometry nodes live inside Geo objects and generate geometry.

Dynamics nodes set up the conditions and rules for dynamics simulations.

Render nodes either render the scene or set up render dependency networks.

Channel nodes create, filter, and manipulate channel data.

Composite nodes create, filter, and manipulate image data.

Справочная информация

Explains each of the items in the main menus.

Documents the options in various panes.

Documents the options in various user interface windows.

Houdini includes a large number of useful command-line utility programs.

How to script Houdini using Python and the Houdini Object Model.

Expression functions let you compute the value of parameters.

HScript is Houdini’s legacy scripting language.

VEX — это высокопроизводительный язык выражений, используемый во многих местах в Houdini, например, для написания шейдеров.

Properties let you set up flexible and powerful hierarchies of rendering, shading, lighting, and camera parameters.

You can script custom pane types using Python to create your own UIs.

Houdinibook

Изучаем Houdini на русском языке

Материалы

Часть 4 Подсказки Houdini DOPs

Контекст Houdini’s Dynamics Operators, или DOPs, это мощный модуль для установки сложных симуляций, используя небольшое количество операторов. Houdini 9 также имеет способности создания жидкостей и газов, оригинальной динамики твердых тел (RBD), тканей и проволочных симуляций. Здесь мы рассмотрим способы как гораздо эффективней использовать эти фантастические, забавные инструменты.

Читайте также: Размеры ткани для штор с люверсами

Содержание 4 главы:

Секреты RBD объекта

Основным строительным блоком DOPs является узел RBD Object, который (как вы могли бы предположить) настраивает RBD Object для симуляции. Но этот узел, который как многие DOPs — действительно Houdini Digital Asset (HDA), может сделать большую работу в одном небольшом пакете.

Например, вы можете одновременно установить больше чем один RBD Object в олном операторе. Есть два способа сделать это.

Во первых можно просто увеличить параметр Number of Objects до желаемого количества. Затем вы создадите много копий входящей геометрии. Затем, чтобы они не располагались друг на друге, используйте локальную переменную $OBJID, чтобы расположить каждую инстанцию отдельно. Например, следующее изображение показывает, как создать 9 кубов RBD и расположить их по 3 в 3 строки:

Когда вы создаете одновременно больше чем один объект, вы можете также перечислить больше чем один Surface Operator (SOP) геометрии. Например, следующее изображение показывает установку, которая создает два объекта RBD, один с геометрией от первой сети SOP, и другой от второй. Обратите внимание на изменения в строке Object Name, это, чтобы два объекта назывались уникально. Теперь для дополнительной забавы, увеличьте Number of Objects до 4, и вы получите по 2 из каждой SOP геометрии, чередуясь.

Matrix Affector

Affector Matrix — маленькая часть пользовательского интерфейса (UI). Его вы можете найти в Details View сети DOPs. В матрице разные цвета показывают, как объекты затрагивают друг друга. Есть четыре возможных цвета, которые вы можете видеть. Их значения:

Взаимоотношения (они затрагивают друг друга),

Односторонние отношения. Объект, названный в столбце, затрагивает объект в строке, но не наоборот

Предупреждение. Это предупреждение появляется, когда вы создали взаимоотношения между двумя объектами, которые не используют совместно один и тот же solver (вообще, чтобы объекты были взаимными affectors, они должны быть решены одним и тем же solver). Наиболее распространенная инстанция этого, когда вы строите взаимные affector отношения между двумя различными видами объектов, такими как RBD Object и Cloth Object. В этом случае DOPs приблизит правильный результат при использовании отклика между solvers во время подшагов. Это — симуляция симуляции! Практически, обычно, это оказывается, тем, что вы ожидаете, но не всегда. Желтый цвет предупреждает вас относительно этого.

Мгновенные симуляции

Самый быстрый способ создать симуляцию DOPs в Houdini состоит в том, чтобы зайти во вкладку Rigid Body Dynamics полки инструментов, и щелкнуть по Ground Plane. Это создаст сеть DOPs, в ней создаст объект Ground Plane и добавит Gravity, для притяжения. Это сохраняет много нажатий клавиш.

Теперь все, что вы должны сделать, это создать любую геометрию с полки — скажем, куб — расположите его немного вше по оси Y, затем выберите эту геометрию и щелкните по Rigid Body Object. Это добавит куб к вашей предыдущей сети симуляции. Нажмите кнопку воспроизведения, и объекта упадет на ground plane. Приблизительно в 3 щелчка мышью создана простая симуляция, с которой вы можете начать экспериментировать.

Быстрый доступ к глобальным параметрам

Если вы поместите курсор в область просмотра, в то время как вы находитесь в DOPs, и нажмете клавишу “p”, то вы раскроете плавающее окно параметров для симуляции DOPs в целом. Во вкладке Simulation вы можете найти полезнее параметры, как “Recook Simulation” и параметры управления временем, такие как Time Step и Scale Time.

При этом вам не надо перемещаться назад, на уровень dopnet, чтобы получить доступ к этим параметрам.

Details View

В Details View для DOPs вы можете изменить порядок сортировки tree view на None и затем переместить данные, так, чтобы вы могли видеть различные элементы друг рядом с другом. Что особенно интересно, и полезно, в этом то, что вы можете сделать это на иерархической основе. Таким образом, вы можете установить порядок отображения данных в пределах конкретной цели, одним способом, оставляя порядок отображения остальной части дерева иначе.

Чтобы сделать это, щелкните RMB по названию любой папки в tree view. Если вы сделаете это на названии dopnet, сверху, то вы затронете все дерево. Если вы сделаете это на отдельном объекте или папке, то вы будете изменять настройки только для подобъектов этой папки.

Совокупный шум (Additive Noise)

Вы можете использовать Noise DOP, чтобы добавить шум к силам так же как масштабировать силы. Например, хотите чтобы Uniform Force DOP, изменялся беспорядочно от ноля. Чтобы сделать это, просто установите значения Uniform Force в 1, и затем сверху добавьте узел шума. Это работает с любым видом узлов сил.

Избегайте повторного вычисления SDFs

Когда начинается создание кадров симуляции RBD Object, первое, что делает DOPs, это вычисляет представление объема (SDF). Это представление используется, чтобы вычислить столкновения с другими объектами. В зависимости от геометрии и требуемой точности, этот процесс может быть медленным. Хуже, если геометрия искажается в каждом кадре, и вычисление должно быть исполнено в каждом кадре.

Вы можете избежать этой дополнительной работы, кэшируя данные SDF на диск. Конечно, сначала вы должны отобразить SDF и удостовериться, что получаете то, что хотите. Как только вы сделали это, установите File Mode в Automatic. Данные будут записаны в. Затем, как только файл готов, он будет, использоваться вместо того, чтобы вычислять SDF.

Для деформируемой геометрии, вы должны включать некоторую меру времени в имени файла. Например:

Избегайте повторного вычисления симуляции

Мало того, что вы можете кэшировать данные SDF, но также вы можете кэшировать движение объекта (или целой симуляции объектов) на диск, и затем загрузить это обратно, или использовать снова в другой симуляции, избавляясь от необходимости повторного вычисления. Это делается с помощью File DOP.

Проще всего использовать File DOP, установив его в конце сети DOP. Установите Operation Mode в Automatic, определите локацию File на что-то разумное (такое как $TEMP/baked$SF4.sim) и воспроизведите симуляцию.

При первом воспроизведении, данные будут сохраняться в файл для каждого кадра симуляции. При последующих выполнениях данные о симуляции просто будут считываться с диска и тут же использоваться. Также вы можете записать кэш симуляции на диск используя Dynamics ROP (оператор рендеринга) в редакторе Output.

Отметьте, что, если вы переносите объекты, создаваемые в одной симуляции, в другую, эти объекты не будут существовать за пределами диапазона кадров, в котором они первоначально создавались. Другими словами, если вы введете симуляцию приготовленную до 50 кадра, и затем хотите, чтобы она продолжилась и в 51кадре, то это не получится если вы не установите флаг “Take Ownership Loaded Objects” на этом узле. И если вы сделаете это, знайте, что affector отношений не сохранен в.sim файлах, и таким образом, вы должны будете установить их явно, используя узел Affector.

В стандартном хелпе File DOP есть некоторые хорошие примеры этих ситуаций.

Объяснение именования File Data

File Data DOP позволяет вам сохранять данные объекта на диск, и возвращать их в любую симуляцию. Это очень полезно, и фактически цифровой актив RBD Object, использует этот метод, чтобы сохранить данные SDF на диск. Но если вы создаете один из них, вы могли бы задаться вопросом, почему имя файла по умолчанию — такое сложное выражение. Например это:

./baked$SF4.$OBJID.‘strreplace(chs(“dataname”), “/”, “_”)‘. simdata

Причина состоит в том, что вы можете сохранить любые данные, включая силу тяжести или другие данные о силе. Но помните, что по умолчанию локация силы тяжести — Forces/Gravity, и таким образом, без функции strreplace(), имя файла стало бы:

и оно, вероятно, вызвало проблемы, из-за дополнительного символа “/”. Фактически, вероятней всего ничего не произойдет. Ни файла, ни предупреждения, один беспорядок. Избежать проблемы функции strreplace(), можно изменив символ ‘/’, на ‘_’, и результат становится:

Деление объектов на группы

Довольно распространено использование групп DOPs, чтобы разделить объекты на два набора, и затем применить что-то разное каждой группе. Например, если бы вы хотели остановить движение объектов, скорость которых уменьшилась ниже минимума, то у вас мог бы быть Group DOP тестирующий скорость вражением, как это:

abs(dopfield(“.”, $OBJNAME, “Position”, “Options”, 0, “vely”)) > .1

и затем второй Group DOP с противоположным тестом:

abs(dopfield(“.”, $OBJNAME, “Position”, “Options”, 0, “vely”))

Удобное слияние DOPs

Когда вы сливаете объекты от DOPs симуляции (например, в сеть SOP, которая является частью SOP Solver), вы должны помнить волшебный синтаксис для того, чтобы извлечь эти объекты. Так как я знаю, что вы забыли это, вот он:

‘stamps(“../OUT”, “DATAPATH”, “../. */Geometry”)‘

Проблема в том, что никто не может запомнить это. Так что не пробуйте. Вместо этого поместите узел SOP Network в свою DOPs Network, и затем зайдите внутрь SOP Network, и создайте узел Object Merge. Затем, в линии параметра Object 1, впечатайте вышеупомянутое выражение. Теперь щелкните по иконке с шестеренкой и выберите “Save Preset.” Только назовите это разумно, например “DOP Merge.”

Теперь, всякий раз, когда вы помещаете Object Merge в свою сеть SOP Solver, просто щелкаете по кнопке Presets, дойдите до конца списка и выберите “DOP Merge.”

Повторный DATAPATH (путь к данным)

В предыдущей подсказке мы использовали константу “DATAPATH” в функции stamps(), чтобы указать DOPs, где мы хотели выполнить слияние. Откуда эта волшебная строка, и более важно, другие, о которых мы должны знать? Ну, это прибывает из SOP Solver, и фактически если вы посмотрите хелп для SOP Solver, это объясняет, что DATAPATH — один из нескольких глобальных параметров, которые доступны в сети SOP с stamp() или stamps() функциями выражений. А вот другие:

ST Текущее время симуляции

TIMESTEP Длинна временного шага

OBJID ID вычисляемого объекта

DOPNET весь путь к DOP Network, которая вычисляется.

Хороший пример этого, когда вы хотите использовать выражение dopfield() в SOP Solver. В этом случае, вы обычно не знаете имя или ID объекта, который вы обрабатываете. Так, как же назвать это в выражении dopfield()? Как это:

dopfield(“/obj/dopnet1”, stamp(“../OUT”, “OBJID”, 0), “Impacts”, “Impacts”, 0, “positionx”)

Релевантная часть — выражение stamp(). Предположите, что последний SOP в цепочке вы обрабатываете, добавив “OUT”, затем это выражение поставит новое значение OBJID для каждого объекта, который передается в сеть SOP Solver.

Другие параметры, такие как «Impacts» и «positionx», просто для иллюстрации — вы должны заменить их на названия любых данных, которые вы фактически ищете.

Получение позиций DOPs в POPs

Если вы хотите получить данные о позиции RBD из DOPs в POPs, используйте функцию dopoption() в Position POP (с y и z аналогично):

dopoption(“/obj/dopnet1”, “rbdobj1”, “Position”, “tx”)

Дублируйте это выражение для позиций Y и Z, используя “ty” и “tz” как последний параметр, и затем поместите все это в Position POP.

Получить информацию о вращение требует немного больше усилий. Rotation POP определяет вращение, осью и углом вращения, но DOPs непосредственно не обеспечивает этот формат. Вместо этого DOPs предоставляет информацию о любой ротации как кватернионы (используюя “orientx/y/z/w” вместо tx в вышеупомянутом выражении) или как углы Эйлера (используя “rx/y/z”). К счастью, преобразовать кватернионы в значения угол/ось довольно легко.

Читайте также: Своими руками для дома из подручных материалов из ткани

axis = normalize(orientx, orienty, orientz)

По крайней мере, тригонометрия довольно проста. Чтобы использовать эту информацию в Rotation POP, поместите это выражение в поле Angle:

acos(dopoption(“/obj/dopnet1”, $PT, “Position”, “orientw”))*2

И эти выражения в поля Axis XYZ:

dopoption(“/obj/dopnet1”, $PT, “Position”, “orientx”)

dopoption(“/obj/dopnet1”, $PT, “Position”, “orienty”)

dopoption(“/obj/dopnet1”, $PT, “Position”, “orientz”)

Наконец, вы должны удостовериться, что есть некоторое отображение от объектов DOPs до частиц. В вышеупомянутом примере мы предположили, что есть одна частица для каждого объекта DOP, таким образом, $PT в каждом выражении сошлется на соответствующий объект DOPs. Иначе, вы можете назвать определенные объекты DOPs, например, «rbdobject1».

Отклеивание объектов

Используя Glue Objects, важно понять, что связи клея могут быть разорваны только воздействиями, вызванными столкновениями. Вы не можете сломать объекты сильным ветром, или силой тяжести, или напряжением от искривления. Что же делать, когда вы хотите отклеить объекты без столкновений? Или, так же важно, как контролировать момент, когда объектам надо ломаться?

В этом случае надо изменить Glue Strength самостоятельно, базируясь или на процедурных соображениях, или просто на ключевых кадрах, которые вы устанавливаете, потому что это выглядит лучше всего. Самый легкий способ сделать это используя узел RBD State, чтобы получить доступ к Glue Strength. Установите меню параметра в “Set Always,” и затем установите ключевые кадры на Glue Strength. Когда вы захотите чтобы объект отклеился, измените значение на 0.

Конечно, вы можете базировать это значение на чем-то более, сложном чем keyframes — подойдет любое выражение, включая то, которое смотрит, столкнулся ли этот объект с другим, или прошел определенный момент в пространстве, или что бы то ни было.

Начало с конца

Вы не должны запускать симуляцию сначала каждый раз, когда вы выполняете сцену. Если вы использовали File DOP или Dynamics ROP, чтобы записать .sim (состояние симуляции) файлы, то вы можете использовать их, чтобы начать в середины.

Во-первых, если вы хотите продолжить симуляцию с некоторого кадра, скажем с 201, вы можете использовать File DOP, чтобы считать .sim файл, со смещением 200 (последний успешно моделируемый кадр). Таким образом, параметр имени файла был бы чем-то вроде:

Альтернативно, вы можете использовать конец одной симуляции как начало другой. Вы можете легко сделать это непосредственно во вкладке Simulation узла DOP Network. Там есть параметр, названный Initial State. Просто установите его в соответствующий .sim файл, и все запустится оттуда. Конечно, это работает только если имя объекта и отношения в одной и другой симуляции одинаковы.

Использование Script Solver для состояния (Status)

Script Solver позволяет вам выполнять любые hscript команды во время симуляции DOPs. Эти команды служат, чтобы в могли воплотить любую фантазию в симуляцию. Но вот один простой совет, обеспечивающий механизм для получения информации о состояния запущенной симуляции, особенно если она находится где-нибудь на очереди рендеринга.

Так как DOPs не обеспечивает такое состояние, и так как симуляции могут занять много времени, полезно знать, какие кадры симуляция работают, какой длины кадры и даже если это — все еще живой процесс.

Чтобы сделать это, добавьте multisolver к некоторой части вашей сети, и подключите к нему solver, который вы используете в этой сети. Затем подключите Script Solver и удостоверяясь, что Script Solver — последний вход. В обоих solvers, установите флажок, Unique Data Name, так как по умолчанию, все solvers называются просто «Solver», а вам не нужно два solvers с одинаковыми именами.

Затем создайте два файла. Назовите их statusInit.cmd и status.cmd. Поместите путь к statusInit.cmd в поле Initialization Script узла Script Solver, и путь к status.cmd в поле Solve Script, как показано ниже.

Наконец, вот содержание этих двух “чрезвычайно сложных” файлов:

Файл Init нуждается в проверке первого кадра, потому что файл Init фактически выполняется в каждом шаге времени, в случае, если любые новые объекты создавались в этом шаге. Таким образом, мы проверяем, является ли это началом симуляции, и если да, уберите содержание файла состояния. В любом шаге времени мы пишем только результат команды » date» Houdini в файл. Когда мы выполним симуляцию, содержание file/tmp/status будет примерно таким:

Frame 1: Tue Jan 24 20:36:43 PST 2012

Frame 2: Tue Jan 24 20:36:45 PST 2012

Frame 3: Tue Jan 24 20:36:45 PST 2012

Frame 4: Tue Jan 24 20:36:45 PST 2012

Frame 5: Tue Jan 24 20:36:45 PST 2012

Frame 6: Tue Jan 24 20:36:45 PST 2012

Это говорит нам, сколько времени занимают кадры, что кадры в настоящее время включены, и т.д.

Для себя вы можете скорректировать имя и местоположение файла состояния, и возможно кадров. И конечно, вышеупомянутое описано для Linux, хотя, если вы используете cygwin на Windows, будет очень похоже.

Успокаивание симуляции: Часть 1

Создайте узел RBD State. Теперь задержите мышь над меткой Velocity, и отметьте, что раскрывающееся окно говорит “Parameters: velx vely velz.” Это названия параметров скорости.

Польза знать обо всех таких параметрах состоит в том, что вы можете использовать $name (например, $velx), чтобы обратиться к параметру в пределах узла. Так, если вы поместите выражение:

в параметр X velocity, и сделаете то же самое для Y и Z (конечно используя $vely и $velz,), и затем измените Update Menu параметра Velocity на “Set Always,” то объект (ы), изменяемый тем узлом, замедлятся в течение времени. Каждый кадр скорость будет установлена в 95 % от той, что была в предыдущем кадре.

Таким образом вы можете обратиться к любым параметрам в данном узле, как раз когда вы изменяете другие. Например, вы можете использовать $tx (X position) в поле Y velocity, если у него есть некоторое значение в вашей симуляции.

Успокаивание симуляции: Часть 2

Теперь, когда мы знаем, что можем использовать переменные как $velx, чтобы скорректировать энергию, доступную объекту или набору объектов, следующим шагом создадим дополнительный канал в узле RBD State, и затем анимируем его от 1 до 0 в любом диапазоне кадров, с любой формой. Затем используйте это так:

Снова, сделайте то же самое для Y и Z. И также, наиболее вероятно, для Angular Velocity, который, как видно из всплывающей справки, называется $angvelx, $angvely и $angvelz. Это даст вам даже больше контроля движения ряда объектов, так как теперь вы можете анимировать запасной канал как вам нравится.

Если бы вы захотели, чтобы другие узлы также использовали этот канал, то ссылка, была бы:

предполагается, что вы используетесь имена по умолчанию для узла и запасного канала.

Смещение времени

На вкладке Simulation узла dopnet вы можете сместить время. Первое, что надо знать об этом поле, что оно измеряется в секундах, а не кадрах. Так, если вы хотите сместить свою симуляцию на 10 кадров, вы должны поместить:

Вы можете также использовать отрицательные смещения; например, -10/$FPS начнет вашу симуляцию в кадре -10. Кроме того, имейте в виду, что смещения, не абсолютные значения начала. Так, если вы смещаете свою симуляцию на 10 кадров, объекты, которые создавались в кадре 1, будет создаваться в кадре 11.

Другое, что надо знать, то что, если ваша симуляция смещена, времена создания ваших объектов не будут автоматически изменяться. Так, если ваши объекты все создаются в кадре 1 (как они по умолчанию), и вы смещаете свою симуляцию в 10 кадр, там не будет никаких объектов вообще. Поэтому, когда DOPs начинает симуляцию, это будет кадр 11. Только объекты, кадр создания которых 11 или больше, будут создаваться — остальные упустят этот шанс.

Так что, если вы хотите сместить всю симуляцию на некоторое число кадров, вы должны будете поместить выражение как это:

в параметр создания кадра каждого объекта DOPs. Альтернативно, вы можете создать новую переменную, скажем $OFFSET, и поместить $OFFSET+1 в поле создания кадра каждого объекта, и $OFFSET/$FPS в поле смещения узла dopfield.

Анимация RBD объектов

Как вы знаете, узел RBD State может использоватся, чтобы изменить аспекты RBD Object во время симуляции. Однако важно знать, что использование узла RBD State, для изменения значений Position и Rotation, может вызвать проблемы, если вы также не предпринимаете шаги, чтобы скорректировать значения Velocity (и/или Angular Velocity). Поэтому RBD Solver не будет в состоянии предсказать движение, и таким образом, столкновения, могут оказаться неправильными.

Простой способ избежать проблем не состоит в том, чтобы использовать RBD State DOP для того, чтобы изменить позиции объектов, а вместо этого использовать Motion DOP. У этого узла, по умолчанию есть выражения, которые автоматически вычисляют значения скорости. Убедитесь и также установите значения скорости на “Set Always”, или это не будет правильно работать.

Ускорение симуляции ткани

Симуляции ткани могут вычисляться довольно медленно. Вот несколько советов, чтобы изменить параметры и настройки, для более быстрой симуляции. Конечно, более быстрые средства почти всегда менее точные, так что, используйте эти способы ускорить процесс, приблизительно добившись того, что вы хотите. После того, как вы близки к желаемому, вы можете вернуться к более медленным, более точным симуляциям для окончательного результата.

Self-Collisions (Самостолкновения): Они сильно замедляют процесс. Избегите вычислять их, на сколько это возможно.

Maximum Substeps: Установите это на 16, или даже меньше, чтобы ускорить симуляцию.

Maximum Strain Rate: Уменьшите этот параметр, чтобы увеличить скорость. Попробуйте 0.025 и посмотрите, что получится.

Одно самое большое усовершенствование, которое вы можете сделать, чтобы увеличить скорость, это сократить количество треугольников в вашем объекте(ах) ткани. Попытайтесь создать версию с низким разрешением для предварительного тестирования, а затем переключитесь на модель более высокого разрешения, когда вы будете ближе к результату.

Установка Hair Constraints (Ограничений волос)

Есть два способа ограничить волосы, но безусловно самый простой этот: В сети SOP, которая создает волосы, просто сгруппируйте точки, которые, как предполагается, должны быть ограничены (то есть, корневые точки). Назовите эту группу, например «roots». Затем в сети DOP, используйте узел Wire Glue Group Constraint, и установите «roots» (без кавычек) в поле Point Group. Все осень просто.

Дверные петли и качели

Люди часто хотят создать двери на петлях или качели в DOPs. Это просто — создайте два жестких ограничения в ребре двери. Для двери они должны находиться на одном ребре. Для качелей они находятся на противоположных ребрах. Или, вы можете использовать новый узел RBD Hinge Constraint.

Получение частиц в симуляциях

POP Solver посылает всю геометрию, которая присоединена к объекту (ам), который это вычисляет, в сети POP. Эта геометрия может прибыть из системы частицы, или из RBD Object или любого другого механизма, который присоединил данные Geometry к объекту. Также возможно не посылать геометрию вообще в сеть POP, и только возвратиться с результатами симуляции частицы. В этом случае, вы можете просто присоединить POP Solver к Empty Object, указать POP Solver на вашу сеть POP, и все сделано. Таким образом, допустимо все следующее.

Читайте также: Зародышевая соединительная ткань 9 букв

Мало того, что геометрия является дополнительной, но и POP Network — также. Вы можете ввести геометрию как POP Object, и пока вы удостоверяетесь, что есть скорость у точек, затем вы можете использовать POP Solver без POP Network, и все еще иметь геометрию, реагирующую на другие объекты в симуляции.

Установка Soft Bodies (Мягких тел)

Вы можете использовать частицы в DOPs, чтобы моделировать объекты softbody, как воздушные шары. Основная установка довольно проста:

• Используйте POP Object, чтобы ввести ваш geometry

• Присоедините это к первому входу POP Shape Match DOP

• Соедините это с POP Solver

Затем создайте остальную часть вашей симуляции, с силами и другими объектами. Например, присоедините Gravity к POP Solver, и затем слейте это с Ground Plane. Теперь, корректируя три параметра силы в POP Shape Match, вы можете изменить фактор мягкости.

Синтаксис DOP геометрии

Синтаксис для того, чтобы проникнуть в DOP симуляции и извлечь геометрию, везде в Houdini, будет запрашиваться путь SOP. Так, например, если вы находитесь в POPs и хотите использовать Source POP, чтобы ввести некоторую геометрию из объекта DOPs, с именем ‘ball’, вы можете сделать это непосредственно таким синтаксисом:

Вы можете даже сделать это в Geometry ROP, но предупреждаю: в этом контексте, геометрия, которую вы выписываете, не будет преобразована симуляцией DOP, а вряд ли вы этого хотите. Если вы хотите записать геометрию симуляции DOP на диск, вы должны сначала передать это через Object Merge или DOP Transform SOP, а затем сделать ссылку SOP на ваш Geometry ROP.

Я ударился!

Очень распространена ситуация, в которой нужно знать, когда объект был ударен другим объектом, как сигнал сделать что-то в вашей симуляции (или в другом месте в Houdini, в этом отношении). Это может проверить функция dopnumrecords(). Её использование может быть таким:

dopnumrecords(“/obj/dopnet1”, “objectname”, “Impacts”, “Impacts”)

где вы “objectname” именем интересующего вас объекта, и заменили бы «/obj/dopnet1» именем вашей сети DOPs.

Один запутывающий аспект этого — то, что данные о воздействии существуют только в кадрах, где происходят воздействия. Но пользователи часто хотят знать, происходило ли воздействие когда-либо, а эта информация непосредственно не доступна.

Чтобы получить эту информацию можно использовать Modify Data DOP, чтобы создать логическую переменную и установить ее значение на 1. Затем установите Activation на основе dopnumrecords() — когда у этого будет значение 1 (или больше), переменная будет создаваться, и ничто никогда не будет уменьшать это до 0. Таким образом, вы можете проверить это всюду в симуляции и получить правильный ответ. Вы можете также использовать версию этого метода, чтобы сделать запись номера кадра (или времени), когда произошло воздействие, что является другим распространенным запросом.

Как только вы знаете, что есть воздействия, вы можете использовать команду dopfield(), чтобы получить ID объекта, который вас ударил (если нуждаетесь в этом), или получить размер воздействий, или то, что вы хотите узнать.

Импортирование движения

Что, если у вас есть объект, у которого есть движение на уровне Object transform, и вы хотите импортировать это движение в DOPs? Например, вы хотите чтобы самолет некоторое время летел с помощью обычных ключевых кадров, до момента, когда вы введете его в симуляцию DOPs. Чтобы сделать это, у вас есть несколько вариантов.

1. Оператор Object Position. Он возьмет внешнее движение объекта и импортирует его в каналы объекта DOPs. Чтобы заставить это правильно работать, вы, возможно, должны использовать узел Active Value, удостоверяясь, что, пока движение объекта происходит с помощью ключевых кадров, Active Value — ноль. Затем, когда вы запускаете объект в симуляцию, Active Value установите на один, так, чтобы RBD Solver мог начать вычисления.

2. Оператор Motion. Это версия оператора RBD State, но у него есть некоторые встроенные выражения, чтобы удостовериться, что скорости объекта вычисляются правильно. Вы можете использовать этот узел, и установить значения Position, и/или Rotation, или значения других каналов которые вам нужны. Только удостоверьтесь, что установили режимы параметра на каждом из них на “Set Always.”

3. Узел RBD Keyframe Active. Он позволяет вам устанавливать флаг Active и значения позиции в одном операторе. Когда Positions устанавливается явно (например, она прибывает из за пределов DOPs), Object Active Value должен быть нолем. Вы можете анимировать значения позиции и вращения непосредственно в полях параметра этого узла одновременно. Когда объект — часть симуляции, значение должно быть 1.

Получение переменных DOPs в SOPs

Что, если вы создаете сеть SOP Solver, и решаете, что там необходимо использовать переменную DOPs типа $SF. Проблема в том, что эти переменные (и многие другие) определяются только в контексте DOPs, так что, когда ваша сеть SOP Solver выполняется, они будут не определены. Что можно сделать?

Используйте Modify Data DOP, и добавьте релевантное значение к вашему объекту, в то время как он находится в сети DOP. Затем, в сети SOP Solver, извлеките это снова с помощью выражения функции doprecord().

Например, вот DOP, который вставляет значение $SF в поле, которое является частью записи данных Position. А затем, в сети SOP, эта информация получена этим выражением:

‘dopoption(“/obj/dopnet1”, “label”, “Position”, “sf”)‘

Объяснение функции dopfield()

Может показаться, что сложно понять, как использовать функции dopfield() и dopoption(), чтобы извлечь значения из симуляции DOPs. Вот, как это работает.

Прежде всего, давайте вспомним, на что похожа функция dopfield(). Синтаксис, данный справкой:

dopfield (dopnet, object, subDataName, recordType, recordNum, fieldName)

Где все значения — строковые кроме recordNum, которое является (ждите его), числовым.

Если мы сравниваем это с Details View простой симуляции, с объектом, названным “box,” мы можем просмотреть, как эти параметры выстроены в линию с деревом симуляции.

Хитрость понадобится, когда вы захотите узнать данные, которые являются далее в дереве. Например, скажем, вы хотите извлечь значение Gravity. Вид дерева похож на это:

Затем dopfield() команда, чтобы получить значение была бы:

dopfield(“/obj/dopnet1”, “box”, “Forces/Gravity”, “Options”, 0, “forcey”)

Что относительно recordNum? Ну, главным образом это 0, потому что у большинства данных есть только одна запись. Очевидное исключение из этого — данные Impacts, потому что, когда объекты сталкиваются, часто регистрируется много подвоздействий. Вы можете видеть это на иллюстрации ниже:

Как другая подсказка, вы должны использовать dopoption() и dopoptions() всякий раз, когда можете. Эти выражения идентичны dopfield, но они предполагают, что записываемое имя — “Options”, и номер записи 0. Это почти всегда то, что вы хотите. Таким образом предыдущий пример, упрощается до:

dopoption(“/obj/dopnet1”, “box”, “Position”, “ty”)

который меньше впечатывать и легче читать.

Извлечение данных из DOPs

Есть много способов извлечения информации из DOPs:

• Object Merge может извлечь одни или много данных Geometry.

• DOP Transform SOP может извлечь, информация о трансформации и скорости из DOPs и применить их к существующей геометрии SOP (см. пример справки).

• Выражение dopfield в комбинации с другими выражениями dop (сделайте “help dop”, чтобы узнать все) может получить любую основную информацию, доступную в дереве DOPs, которое строится в области Details View.

• Dynamics Channel Operator (CHOP) может извлечь в значительной степени любые доступные данные через выражения dopfield, но при этом может извлечь целую связку полей, сразу используя wildcards, и может извлечь данные посредством целой симуляции, чтобы создать кривую анимации из любых доступных данных в dopfield. См. файл helpcard в качестве примера для этого CHOP.

• Выражения SOP могут ссылаться на данные геомтрии DOP непосредственно.

• Geometry CHOP может ссылаться на геометрию DOP непосредственно.

• Fetch Object может извлечь трансформацию из данных DOP Position непосредственно.

• POPs, которые берут путь SOP, могут принять путь к данным DOP Geometry.

• Geometry ROP примет путь к данным DOP Geometry.

• Dynamics ROP может сохранить все состояния симуляции на диск. File DOP и File Data DOP позволяют сохранять и загружать все состояния симуляции и отдельные части данных о симуляции, соответственно.

Таким образом, есть много способов извлечь данные DOP. У данных Geometry и Position есть свои специализированные операторы, чтобы помочь в этом извлечении, и есть выражение dopfield и Dynamics CHOP, чтобы позволить вам достигать всего остального (хотя, возможно, с меньшей элегантностью).

Добавление пользовательской геометрии

DOPs работает с данными, и геометрией, которые описывают ваш входящий объект, и это является очень большим количеством данных. Одна интересная особенность DOPs — то, что вы можете ввести объекты с произвольным количеством и видами данных, и затем добавить больше данных, и каждый оператор будет работать только с данными, в которых он нуждается. И будет игнорировать остальные.

Один особый аспект этого — то, что вы можете добавить дополнительную геометрию к своим объектам DOPs, а затем просто перенести эту геометрию туда, где она может использоваться впоследствии. Или она может быть обработано DOPs. Вот несколько простых шагов:

• Создайте Apply Data DOP, и соедините его с вашим объектом.

• Создайте SOP Geometry DOP. Сошлитесь на нужную вам геометрию. Затем измените Data Name на что-то уникальное (в объекте геометрии). По умолчанию, оно именуется Geometry, и означает, что оно будет преобразовано любыми solvers, которые влияют на эту геометрию, чего вы, вероятно, не хотите. Так что, назовите это как-нибудь еще.

• Присоедините узел SOP Geometry к коннектору данных (зеленый) узла Apply Data.

Имя геометрии довольно важно. По умолчанию, любые данные под названием “Geometry” отображаются и выводятся при рендеринге. Другая геометрия, который называна чем-то еще, по умолчанию не отображается и не рендерится. Если вы хотите чтобы ваши другие данные геометрии, были видны в области просмотра, вы должны будете присоединить данные Rendering Parameters к этой геометрии, и соответственно установить значения.

Синтаксис вектора

Чтобы получить векторное значение данных о симуляции DOP, сделайте:

vector(dopoptions(“dopnet”, “object”, “Position”, “t”))

Отметьте, что вы должны использовать dopoptions, а не dopoption, потому что должен строка должна возвращаться в надлежащем векторном формате языка выражений.

Например в Modify Data, чтобы извлечь вектор из одного места и сохранить его в другом, вы назвали бы это «bla», сказали бы, что его тип 3Vector, и затем использовали это выражение в строке значения.

Чтобы легко получить вектор в этом поле, вы сделали бы это:

Чтобы извлечь часть вектора, чтобы создать новый, вы сделали бы это:

float y = dopoption(“.”, $OBJID, “Position”, “vely”);

  • Свежие записи
    • Балкон в многоквартирном доме: является ли он общедомовым имуществом?
    • Штраф за остекление балкона в 2022: что это и как избежать наказания
    • Штраф за мусор с балкона: сколько заплатить за выбрасывание окурков
    • Оформление балконного окна: выбираем шторы из органзы
    • Как выбрать идеальные шторы для маленькой кухни с балконом
Sunny Lady