Выберите в первом кадре все осколки и удалите для твердых тел в 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 »;