14 авг. 2010 г.

Particles вместо Rigid Body

Чтобы не считать медленно и мучительно динамику твердых тел в Майке, можно сделать элегантный фэйк. Вместо Rigid Body использовать динамику частиц, и на каждую частичку навесить инстансером соответствующий объект. Коллизии, конечно, будут нечестными, зато таким образом можно провернуть количество геометрии в разы большее, чем при использовании RBD. Прием старый, но действенный!


John Brown, в курсе Alias Maya Techniques™ | Advanced Particle Instancing 2005 года рассказывает о том как этим методом разрушить кирпичную стену, и приводит пару небольших сценариев, написанных им под задачу. Мне этот метод очень понравился и я переписал его, для любого общего случая, немного добавил от себя и собрал в один скрипт.
Выделяем геометрию, с которой хотим работать, а скрипт делает следующее: пройдя по всем объектам, он оставляет в центре каждого партикл, а затем добавляет все объекты в ноду Particle Instancer, и назначает их каждому партиклу в соответствии с их номером, присваивает атрибут .mass в соответствии с объемом габаритного контейнера. И в итоге скрывает оригинальную геометрию. Теперь мы имеем в сцене облако частиц и инстансер. И можем уже управлять ими с помощью полей и выражений.



Подводные камни

Если вы сделали своим объектам Freeze Transformations, а именно Translate, или использовали различные шатеры, то получите набор фрагментов с одинаковыми значениями трансформации. В таком случае инстансер неверно расположит каждый объект относительно партикла. Причем в данной ситуации операция Center Pivot не поможет, так как перемещает лишь Rotation Pivot. Требуется совершить операцию обратную Freeze Translate, восстановить в каналах перемещения фрагментов значения из их мирового положения. Для этого подойдет либо скрипт resetPivot.mel

либо, если вы пользуетесь CGRU, операция Unfreeze Translations

Надеюсь, Тимур Хайрулин не будет против, если я выложу этот его скрипт отдельно, для тех, кто не готов использовать CGRU целиком. tima_unfreezetranslation.mel

Аналогично первому варианту я написал скрипт и для nParticle, в этом случае каждому партиклу назначается еще и радиус, для просчета столкновений между собой и объектами коллизий.

P.S. Конечно есть еще над чем работать, например дополнить систему алгоритмом вычисления точного объема фрагментов, и более гибкого управления радиусом для nParticle.
Использование: выделить все необходимые объекты и выполнить скрипт:
geom2particleInstancer.mel
geom2nParticleInstancer.mel

Комментариев нет:

Отправить комментарий

счетчик посещений