Выберите в первом кадре все осколки и удалите для твердых тел в Channel Box ключи с атрибута active.

Для наглядности создайте еще один expression следующего вида для любого осколка, например, для rigidBodyl:

if(frame==1) rigidBodyl .active=0;

if (rigidBodyl 7.contactCount>0) rigidBodyl.active=1; Или, в переводес марсианского: «Если кадр первый, сделать осколок (rigidBodyl) пассивным. Если чайник (rigidBodyl7) ударился обо что-то, сделать осколок (rigidBodyl) активным.».

Внимательно следите за именами твердых тел: я намеренно оставил имена по умолчанию, так как при автоматическом создании твердых тел никто обычно не меняет имена нод типа rigid-Body.

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

Дальше все зависит от вашего темперамента. Если не лень, можете написать expression типа:

if(frame==1) {

rigidBodyl .active=0; polySurface9.visibility=0; rigidBody2.active=0; polySurfacel 5.visibility=0;

rigidBody3.active=0; poly5urface21 .visibility=0;

// ....

teapot_Shape.visibility=1;

}

if (rigidBodyl 7.contactCount>0) {

rigidBodyl .active=1; polySurface9.visibility=1; rigidBody2.active=1; polySurfacel 5.visibility=1; rigidBody3.active=1; polySurface21 .visibility=1;

// …

teapot_Shape.visibility=0;

}

Такой expression будет переключать активность у всех осколков, а заодно показывать их на экране только в момент удара, одновременно пряча чайник (файл teapotCrackedDynamicsSwitch-Expression.ma).

Если же написание длинного expression вызывает у вас отвращение, можете просто открыть Connection Editor и соединить атрибут active осколка, проанимированного с помощью expression, со всеми атрибутами active остальных осколков. (Выбрать ноды rigidBody можно в Outliner, включив Display=>Shapes.)

А заодно можно соединить и атрибуты visibility у соответствующих объектов.

Такой файл сохранен как teapotCrackedDynamicsSwitchConnection.ma.

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

Например, если вы хотите в предыдущем примере с непрочным чайником испустить некоторое количество частиц в момент удара точно в месте соприкосновения чайника с плоскостью, надо написать следующий expression:

if (rigidBodyl 7.contactCount) {

vector $col = <<rigidBody17.contactPosition[0].contactX, rigidBodyl 7.contactPosition[0].contactY, rigidBodyl 7. contactPosition[0].contactZ »;


⇐ вернуться назад | | далее ⇒