Первые шаги в Maya. Урок 15. Программно-визуализируемые системы частиц. Часть 2
Примеры внедрения частиц в сцену
Кружащиеся и собирающиеся в стопку кленовые листья
Как было отмечено в предыдущем уроке, поведение частиц зависит не только от параметров настройки эмиттера и системы частиц, но и от внешних воздействий. В первую очередь от разнообразных физических сил (например, турбулентности и гравитации), под действием которых траектория частиц изменяется — данный аспект мы уже рассмотрели. Кроме того, частицы могут сталкиваться с поверхностями объектов сцены и разбиваться при подобных столкновениях на дополнительные частицы, исчезать или вновь появляться на том же самом месте после столкновения. И наконец, частицы могут притягиваться целью (или мишенью) — как статичной, так и движущейся, что в итоге тоже приводит к изменению траектории движения частиц. Изучению простых примеров столкновения частиц и притягивания их мишенью и посвящен данный урок.
Теоретические аспекты
Столкновение частиц
Частицы могут сталкиваться с любыми полигональными или NURBS-объектами (за исключением NURBS-кривых), а с другими частицами — не могут. При столкновениях они отскакивают от поверхности чаще всего с некоторой потерей скорости и либо испускают новые частицы, либо разбиваются на множество дополнительных частиц, либо умирают. Кроме того, при столкновениях возможно возникновение каких-то иных событий, запускаемых с помощью MEL-скриптов. За назначение системам частиц столкновений отвечает команда MakeCollide (Задействовать столкновение) из меню Particles (Частицы). А удалить столкновение можно через редактор динамических связей DynamicRelations, вызываемый командой Window=>RelationshipEditors=>DynamicRelations (Окно=>Редакторы связей=>Редактор динамических связей).
Для примера создайте NURBS-куб и определите его верхнюю грань в качестве источника частиц, выделив ее и применив команду Particles=>EmitfromObject (Частицы=>Испускать с поверхности объекта). Изначально частицы с поверхности испускаются во всех направлениях, поэтому выделите в окне Outliner эмиттер и в окне каналов измените его тип на Surface (параметр Emitter Type) — частицы станут вылетать вверх по нормали к поверхности (рис. 1). Увеличьте параметр Speed, отвечающий за скорость перемещения частиц, примерно до 7 и расширьте поток частиц, чтобы они падали не только прямо вниз на куб, но и по сторонам, повысив значение параметра TangentSpeed (Скорость по касательной), например, до 0,5. Добавьте к данной системе гравитационную силу: активируйте 1-й кадр, выделите в окне Outliner систему частиц и примените команду Fields=>Gravity (Поля=>Гравитация). Назначенная по умолчанию сила гравитации явно велика (все частицы падают вниз, практически не приподнимаясь над поверхностью), поэтому уменьшите степень воздействия гравитационного поля (параметр Magnitude для поля) так, чтобы последние вначале вылетали вверх, немного поднимались и лишь затем падали, — мы остановились на значении 4 (рис. 2).
Рис. 1. Вид частиц при однонаправленном испускании их поверхностью
Рис. 2. Результат назначения частицам гравитационной силы
Создайте под кубом плоскость, с которой по замыслу и должны будут сталкиваться частицы. Проиграйте анимацию — естественно, частицы будут спокойно проходить сквозь плоскость, не замечая ее (рис. 3). Поэтому выделите систему частиц, затем при нажатой клавише Shift — созданную плоскость и примените команду Particles=>MakeCollide (Частицы=>Задействовать столкновение). После этого частицы при столкновении с плоскостью уже станут отталкиваться от нее и подпрыгивать, как резиновые мячики (рис. 4).
Рис. 3. Прохождение частиц сквозь плоскость
Рис. 4. Столкновение частиц с плоскостью
Для тренировки попробуем удалить созданное столкновение. Для этого откройте редактор динамических связей DynamicRelations, воспользовавшись командой Window=>RelationshipEditors=>DynamicRelations. Выделите в его левой части систему частиц, а в правой установите режим Colli sions, отвечающий за управление столкновениями. После этого щелкните на подсвеченной строке с именем NURBS-плоскости, с которой сталкиваются частицы (рис. 5), — строка окажется уже неподсвеченной (а значит, связь будет нарушена) и частицы вновь станут проходить сквозь плоскость (рис. 6). Опять установите связь на столкновение между системой частиц и плоскостью — в данном случае для этого достаточно будет лишь щелкнуть на той же самой строке в редакторе DynamicRelations для ее подсвечивания.
Рис. 5. Вид окна Dynamic Relations с назначенным столкновением
Рис. 6. Результат отмены столкновения частиц с плоскостью
Особенностями столкновения частиц можно управлять посредством параметров Resilience (Упругость) и Friction (Трение) — их значения устанавливаются сразу же при настройке параметров команды MakeCollide либо редактируются позднее через редактор атрибутов. Параметр Resilience характеризует степень упругости частиц и обычно изменяется в интервале от 0 до 1: при значении 0 частицы просто сталкиваются с поверхностью, а при 1 — отлетают после столкновения с первоначальной скоростью. Параметр Friction определяет уровень трения — естественному трению соответствуют значения в интервале от 0 до 1. Если значение параметра Friction равно 0, то поверхность настолько гладкая, что частицы при столкновении с нею вообще не подвергаются воздействию трения, а при значении равном 1 трение оказывается максимальным и приводит к полной остановке частиц. При реальном столкновении воздействие трения, даже при достаточно гладкой поверхности, все равно неизбежно. Чтобы подвергнуть частицы воздействию трения, выделите плоскость, с которой происходит столкновение частиц, откройте редактор атрибутов, переключитесь на вкладку geoConnector и увеличьте значение параметра Friction примерно до 0,5 (рис. 7). Проиграйте анимацию, и вы увидите, что отскакивающие частицы в результате трения стали терять часть своей энергии и отлетают уже с гораздо меньшей скоростью.
Рис. 7. Корректировка параметра Friction
Возможны ситуации (как правило, при повторных столкновениях частиц, изначально имеющих высокую скорость перемещения), когда часть частиц, несмотря на назначение им столкновения с некоторой поверхностью, все равно пролетает сквозь нее. Этого можно избежать, открыв редактор атрибутов и на вкладке particleShape в секции CollisionAttributes увеличив значение параметра TraceDepth, регулирующего уровень обнаружения столкновений, до нужной величины (рис. 8).
Рис. 8. Редактирование параметра TraceDepth
Как уже было отмечено, после столкновения частиц с поверхностью может происходить какое-либо событие: чаще всего столкнувшиеся частицы либо испускают новые частицы, либо разбиваются на множество дополнительных частиц, либо просто умирают. Регулируется это через редактор событий частиц ParticleCollisionEvents, вызываемый командой Particles=>ParticleCollisionEvents (рис. 9). В нем указывается, для каких частиц данной системы частиц должно выполняться событие:
- AllCollisions — событие будет срабатывать для всех частиц, столкнувшихся с определенным препятствием, независимо от номера столкновения;
- Collision Number — событие будет выполняться только для частиц, столкнувшихся с препятствием указанное в данном параметре число раз.
Рис. 9. Окно редактора ParticleCollisionEvents
Кроме того, определяется тип события: Emit или Split. Событие типа Emit означает, что частицы при столкновении будут испускать новые частицы и продолжать двигаться, а в случае события типа Split частицы при столкновении раскалываются на указанное число дополнительных частиц и умирают. Для обоих типов событий предусмотрена настройка следующих параметров:
- Random # Particles — обеспечивает генерацию случайного числа частиц, которое может меняться в интервале от 1 до значения, указанного в параметре Num particles;
- Num particles — задает количество новых частиц, формируемых (путем генерации или раскола) каждой из столкнувшихся частиц;
- Spread — определяет угол разброса новых частиц;
- Target Particle — указывает систему частиц (это может быть как новая, так и уже существующая система частиц), частью которой становятся сгенерированные при столкновении частицы;
- Inherit Velocity — определяет скорость новых частиц, которая задается как доля от скорости частиц, их сгенерировавших; данный параметр может меняться в интервале от 0 до 1: при 0 новые частицы не наследуют скорость старых, при 1 — скорости новых и старых частиц равны.
При необходимости удалить неудачно созданное событие достаточно открыть редактор ParticleCollisionEvents, выделить нужную систему частиц, затем выделить событие (если событие всего одно, то этого делать не требуется) и щелкнуть на кнопке DeleteEvent.
Для примера сделаем так, чтобы каждая частица при столкновении генерировала от одной до трех новых и тут же умирала, при этом новые частицы имели бы достаточно широкий угол расхождения и двигались со скоростью в два раза меньшей, чем породившие их частицы. Откройте окно редактора событий частиц (команда Particles=>ParticleCollisionEvents) и в разделе Event Type включите флажки Split и Random # Particles. Установите параметр Num particles равным 3, а Spread и InheritVelocity — 0,5 и щелкните на кнопке Create Event. В итоге для исходной системы частиц particle1 будет создано событие event1, результатом которого станет появление новой системы частиц particle2 (рис. 10), что и можно будет наблюдать при запуске анимации (рис. 11).
Рис. 10. Окно редактора Particle Collision Events после создания события
Рис. 11. Вид сцены после настройки события (красным цветом отображены старые частицы, зеленым — дополнительно сгенерированные при столкновении)
Притягивание частиц мишенью
Поток частиц может притягиваться мишенью (целью), при этом довольно часто назначение частицам мишени используется для того, чтобы обеспечить их плавное перемещение, которое трудно реализовать другими методами. Мишенью может стать любой объект, кроме кривой на поверхности. Если в качестве мишени определен полигональный объект, то частицы будут стремиться к его вершинам, а если NURBS-поверхность — то к управляющим точкам. Если мишенью является другая система частиц, то частицы привлекаемой системы частиц будут следовать за частицами мишени последовательно, то есть первая созданная в привлекаемой системе частица будет следовать за первой частицей ведомой системы, а последняя — за последней. Правда, данный принцип справедлив лишь при условии, если частицы обеих систем не умирают — в противном случае предсказать порядок их следования невозможно.
За назначение мишени отвечает команда Particles=>Goal (Частицы=>Цель). Сила притяжения объекта мишенью зависит от индивидуального веса, изменяющегося в интервале от 0 до 1: при 0 мишень не оказывает никакого влияния на объект, а при 1 ее влияние максимально. Вес мишени определяется непосредственно при ее создании или регулируется позже через редактор атрибутов. Конкретному объекту может быть назначено несколько притягивающих его мишеней — тогда объект будет стремиться к каждой из мишеней одновременно, максимально приближаясь к той, которая имеет больший вес.
Для примера удалите в рабочей сцене систему частиц particle2 и гравитационную силу, выделив их в окне Outliner и нажав клавишу Del, и уменьшите силу испускания частиц эмиттером до 1 — частицы вновь станут двигаться строго вверх. Создайте сферу и поместите ее на некотором удалении от куба (рис. 12); выделите частицы, затем, при нажатой клавише Shift, — сферу и привлеките частицы к сфере, назначив ее мишенью (команда Particles=>Goal). Просмотрите анимацию — поток частиц станет стремительно двигаться в направлении сферы, окутывая ее со всех сторон (рис. 13). Попробуем уменьшить силу притяжения частиц к мишени, уменьшив целевой вес последней, — выделите частицы, откройте редактор атрибутов, активируйте вкладку particle Shape1 и раскройте свиток GoalWeight and Objects. Уменьшите значение параметра nurbsSphere Shape1 до 0,1 (рис. 14), и частицы станут двигаться к цели, а затем вращаться вокруг нее более плавно (рис. 15). Если влияние мишени необходимо устранить (когда она стала не нужна), можно сделать ее неактивной, выключив в свитке GoalWeightandObjects флажок Goal Active, или вообще удалить.
Рис. 12. Исходный вид сцены со сферой
Рис. 13. Вид движущихся к цели частиц (целевой вес мишени установлен по умолчанию)
Рис. 14. Уменьшение веса мишени
Рис. 15. Привлечение частиц мишенью с меньшим целевым весом
Немного изменим характер притяжения частиц мишенью. Выделите частицы, активируйте 1-й кадр, откройте редактор атрибутов, обнулите значение параметра GoalWeight (Целевой вес) и создайте для данного параметра анимационный ключ, воспользовавшись командой Set Key (Установить ключ), вызванной из контекстного меню (рис. 16). Переключитесь в 50-й кадр, увеличьте целевой вес до 0,05 и создайте ключ. Запустите анимацию (теперь частицы сначала станут испускаться вверх, но постепенно начнут притягиваться мишенью) и обратите внимание на номер кадра, в котором частицы достигнут мишени, — в данном случае это 220-й кадр. Увеличьте для данного кадра значение целевого веса примерно до 0,3 и также создайте ключ анимации, что приведет к тому, что частицы, достигнув шара, начнут стремительно кружиться вокруг него (рис. 17).
Рис. 16. Создание ключа для 1-го кадра
Рис. 17. Вид притягивающихся мишенью частиц на разных стадиях анимации