$currContactPos='getAttr activeRigidBody.contactPosition[$i]"; Следующие две строки - просто определение цвета искр, которые появятся в месте удара, и затем -порождение 30 искр (переменная SsparkNumber «отвечает» за число порождаемых частиц) в нужном месте и с нужным цветом. Если проиграть анимацию, то при внимательном рассмотрении можно увидеть разноцветные точки, появляющиеся в местах касания кубика плоскости. Не впечатляет. Все-таки «искры» должны разлетаться веером в разные стороны. Наверно, на них тоже должна действовать сила тяжести. Да и выглядеть они должны скорее в виде черточек, а не точек. Все эти недостатки легко поправить, ведь главного результата мы уже добились: появление частиц в местах коллизии кубика и плоскости.
12 . Определим начальные скорость и направление движения рождающихся частиц с помощью правила рождения или начального выражения (creation expression). Для этого, как и раньше, откроем редактор атрибутов для sparkParticles и в секции Per Particle (Array) Attributes в поле velocity из меню, появившегося при нажатии правой клавиши мыши, выберем Creation Expression… Теперь введем несколько строк:
float $magVeloexty=10; vector $initVelocity;
$initVelooity=$magVeloeity*sphrand (1) ; if ($initvelocity.y<0)
$initVelocity=<<$initVelocifcy.x, -$initVelocity.y , $initVelocity.z >>; velocity=$initVelocity ; К сожалению, выражение получилось длинным, хотя действие оно выполняет простое - создает вектор, равномерно распределенный по верхней полусфере радиуса SmagVelocity. Дело в том, что мы не имеем возможности в выражениях напрямую использовать компоненты вектора скорости, например, на запись velocity.y Maya выдаст ошибку: // Error: Attribute not found or variable missing ‘$’: velocity.y //, поэтому приходится использовать вектор-«посредник» $initVelocity.
13 . Вернемся в редактор атрибутов для sparkParticles и изменим время жизни и способ визуализации частиц. В разделе Lifespan Attributes заменим Lifespan Mode с Live forever на Random Range, атрибутам lifespan и lifespanRandom имеет смысл задать небольшие значения, например по 0.5 обоим.
setAttr sparkParticlesShape. lifespanMode 2; setAttr sparkParticlesShape.lifespan 0.5; setAttr sparkParticlesShape.lifespanRandom 0.5;
14 ■ В разделе Render Attribute изменим renderParticleType с Point на Streak. Добавим атрибуты для этого визуализации частиц этого типа (Add Attributes For Current Render Type) и изменим значение появившегося атрибута tailSize на 5.
setAttr sparkParticlesShape.particleRenderType 6; setAttr sparkParticlesShape.tailSize 5.0; Проиграем анимацию (файл emit03c.mb). Действительно, при каждом ударе кубика о плоскость в точке контакта возникает сноп разноцветных «искр-. Но вот незадача! «Искры» продолжают возникать и после того, как кубик прекратит подпрыгивать и прочно утвердится на поверхности. С точки зрения наших выражений, все правильно. Кубик остановился, четыре вершины нижней грани находятся в постоянном контакте с плоскостью и солвер в каждом кадре честно сообщает нам о четырех имеющихся коллизиях. Что и вызывает такой неиссякаемый фонтан частиц. С точки зрения нашего житейского опыта, все происходящее абсолютно неприемлемо. Подковы скачущей лошади высекают искры из гранитной мостовой, но когда эта же лошадь спокойно стоит, никаких искр, конечно, быть не должно.