Анимация падающего домино в Maya

Анимация падающего домино в Maya

Меня зовут Тодоров Дмитрий, я учусь на втором курсе МатМеха СПбГУ.

Каждый, наверное, хотя бы раз в жизни видел какой-нибудь рекламный ролик, в котором бы одна за другой падали бы сотни поставленных стоймя доминошек. Сделать это не совсем просто, но ничего суперсложного в этом также нет. От читателя потребуется знание основ майи(включая основы динамики твёрдых тел). Я использовал Maya 8.5 unlimited для подготовки урока.

Шаг 1. Подготовка.

Создайте кубик и плоскость с минимальным количеством сегмента. Плоскость будет полом, поэтому сделайте её достаточно большой, чтобы на ней потом всё поместилось. Кубик отмасштабируйте так, чтобы он стал похож на доминошку.

Допуская вольность по отношениям к правилам перевода и правилам русского языка, я буду называть его прокси. Он будет в дальнейшем использоваться для просчёта вместо реальной модели, которую можно сделать весьма тяжеловесной, главное, чтобы её форма была похожа на форму прокси. Заняться её созданием лучше уже самом конце, в Шаге 6.

Шаг 2. Создание путей.

Создайте текст со шрифтом Comic Sans MS (Create->Text) и поверните его так, чтобы он был строго параллелен полу.

Можно использовать любой шрифт, но у этого меньше острых краёв. После создания текста, отредактируйте его кривые так, чтобы острых углов не было совсем.

Если этого не сделать или сгладить углы слишком слабо, то потом может получиться так, что на изломе падение доминошек прервётся.

Шаг 3. Размещение проксей по путям.

Это можно сделать руками, с помощью стандартных средств(Motion Path + Create Animation Snapshot) или скриптом. Первый способ занимает слишком много времени, второй – творит прямо-таки аномальные вещи с атрибутами объекта, связанными с движением(translate, rotate, глобальные и локальные пивоты и т.д.). Третий способ проще -шil, требует меньше работы руками, надёжнее и позволяет работать с иерархией(хотя в нашем случае это не актуально). Любым способом запустите скрипт(самый простой – скопировать его текст в Script Editor, запустить его, а потом вызвать функцию FEDominoHelper ()).

global proc FEDominoHelper()
{
window -h 100 -title FEDominoHelper;
gridLayout -numberOfColumns 2 -cellWidth 220;
button -aop true -label "Distribute Object Copies Along Path" -c FEDistributeAlongPath;
textField -tx 0.138386 Dist;
button -aop true -label "Replace Proxies With Geometry Instances" -c ProxyReplace;
showWindow;
}

proc ProxyReplace()
{
// Сохраняем выделение
$sel = `ls -sl`;
// Первый выделенный объект - то, на что будем заменять
$objectName = $sel[0];

// Скопируем его, чтобы не трогать оригинал
$tmpsel = `duplicate $objectName`;
$objectName = $tmpsel[0];

// Выбираем shape
select $objectName;
pickWalk -d down;
$tmpsel = `ls -sl`;
$objectShape = $tmpsel[0];

for($i = 1; $i < size($sel); $i++)
{
// Выбираем shape и удаляем её
select $sel[$i];
pickWalk -d down;
delete;

// Приделываем shape приделывем её к анимированному transform nod'у
parent -add -shape $objectShape $sel[$i];
}

delete $objectName;
}

//////////////////////////////// FEDistributeAlongPath

global proc FEDistributeAlongPath()
{
// Узнаюм расстояние
$dist = (float)`textField -q -tx Dist`;

$sel = `ls -sl`;
$count = size($sel);

// Цикл по кривым
for($ii = 1; $ii < $count; $ii++)
{
// Копируем объект
duplicate $sel[0];
$tmp = `ls -sl`;
$objToDistribute = $tmp[0];

// Вычисляем длину кривой и количество объектов на пути
$len = `arclen $sel[$ii]`;
$end= (int) ($len / $dist);

// Создаём Motion Path с стартом в 1 кадре и концом в кадре с номером, равным количеству копий
select $objToDistribute $sel[$ii];
pathAnimation -fractionMode true -follow true -followAxis z -upAxis y -worldUpType "vector" -worldUpVector 0 1 0 -inverseUp false -inverseFront false -bank false -startTimeU 1 -endTimeU $end;

// На каждом кадре копируем объект
for($i=2; $i <= $end; $i++)
{
select $objToDistribute;
currentTime -update true $i;
duplicate;
};

delete $objToDistribute;
}
currentTime -update true 1;
}

Выделите сначала прокси, а потом одну кривую. Введите в единственное поле ввода расстояние по кривой между соседними проксями(его нужно просто подобрать) и жмите Distribute Object Copies Along Path. Теперь выделите прокси и все остальные кривые и опять нажмите на ту же кнопку(не нужно выбирать сразу все кривые т.к. Undo будет работать лишь для первой, что неудобно при подборе расстояния). Вторая кнопка нам понадобиться позднее.

Если кривые были опущены слишком низко, то прокси могут пройти сквозь пол – в этом случае поднимите их. Поднимите и поверните по одному прокси от каждой кривой так чтобы они в дальнейшем вызвали падение следующих(можно конечно, вводить значения моментов вращения и импульсов вручную, но я так предпочитаю, чтобы всё было наглядно).

Удостоверьтесь, что прокси между собой и с полом не пересекаются.

Шаг 4. Симуляция.

В Maya.

Выберите все прокси и сделайте их активными твёрдыми телами. Пол сделайте пассивным твёрдым телом. При выбранных проксях создайте поле гравитации. Попробуйте просимулировать. Если Вы симулируете несколько букв одновременно и видно, что прокси одной из них явно не будут пересекать проксей другой, то сделайте им разные значения Collision Layer – это ускорит вычисления. Если падать начинает не то, что надо, уменьшите Collision Tolerance и, возможно, Step Size в параметрах Rigid Solver’а. Потом подберите подходящие значения для силы гравитации и для атрибутов mass(масса), Dumping(скорость затухания импульса) и Bounciness(способность отскакивать) твёрдых тел. Потом включите кэш в параметрах Rigid Solver’а и просимулируйте до конца. После запеките ключи в анимацию. Для этого выберите пункт меню Edit->Keys->Bake Simulation, поставьте всё так, как на скриншоте и выберите атрибуты движения, вращения и масштаба в Channel Box’е. Теперь жмите Bake.

Симуляция готова и запечена, можно удалить гравитацию и твёрдые тела (выберите пол и прокси, потом Edit->Delete By Type->Rigid Bodies).

В Real Flow.

Выберите все прокси и пол и триангулируйте их (Mesh->Triangulate), иначе RealFlow не сможет их импортировать.

Сделайте так, чтобы панель time range отображала лишь два кадра (чем их больше, тем больше лишней информации экспортируется)

Не снимая выделения, экспортируйте(File->Export Selection) в формате sd. Если его нету в списке, то или у Вас не установлены коннекторы, или не загружен соответствующий плагин (тогда выберите пункт меню Window->Settings\Preferences->Plug-in Manager и поставьте галочку loaded для sdTranslator.mll).

Откройте Real Flow (я использовал версию 4.2.3.0102) и импортируйте созданный sd файл. Удалите камеру, чтобы не мешалась под ногами, прокси и пол сделайте твёрдыми телами (Node Params->Node->Dynamics = Rigid Body). Пол сделайте пассивным(Node Params->Rigid Body->Dyn Motion = No), а прокси – движимыми (Node Params->Rigid Body->Dyn Motion = Yes).

Выберите пункт меню File->Preferences, зайдите на вкладку Simulation, включите Stacking и поставьте Stacking Quality = 10 – это упростит задачу импорта симуляции в майю.

Добавьте гравитацию(Add new daemon to scene->Gravity).


Сделайте для пола примитив просчёта(Node Params->Rigid Body->Primitive) - Plane, А для проксей – Box. Это значительно быстрее по сравнению с остальными вариантами, но подходит лишь в случае простых объектов. На самом деле можно было экспортировать в Real Flow сразу модели доминошек и тоже поставить им примитив просчёта кубик, но иногда это работает не совсем верно, так что лучше называть кубиками лишь настоящие кубики. Сделайте плоскость невидимой (Node Params->Display->Visible = No), чтобы потом случайно не выделить её.

Просимулируйте до кадра, на котором прокси уже упали на пол и устоялись на нём, но ещё не начали валиться. Сделайте те прокси, до которых падение доберётся не скоро и выключите их из симуляции (Node Params->Node->Simulation = Inactive) – это тоже ускорит просчёт.

Также, если Вы хотите, чтобы падало всё лишь в одном направлении, сделайте прокси, ближайший «сзади» к повёрнутому прокси, недвижимым (Node Params->Rigid Body->Dyn Motion = No).

Не забывайте потом, когда падение подберётся достаточно близко, делать соответствующие прокси симулируемыми и движимыми. Симулируйте дальше, когда увидите, что часть проксей более-менее улеглась и шевелиться очень слабо и не затронута падениями следующих проксей, выключите их из симуляции их всех, кроме нескольких, ближайших к ещё не улёгшимся проксям – их сделайте лишь недвижимыми(иначе могут произойти пересечение уже неактивных и ещё не улёгшихся). Мелкие движения сильно замедляют просчёт.

Если в процессе симуляции Вы видите, что есть небольшие пересечения, то можно увеличить количество Min Substeps в опциях симуляции, но это имеет смысл лишь если Вы будете рендерить доминошки вблизи. Никогда не двигайте объекты, на которых есть хотя бы одни кадр симуляции – это может привести к очень странным результатам.

Когда просимулируете до нужного состояния, экспортируйте всё (Export->Export All) и импортируйте в майю файл animation.sd, лежащий в папке objects в папке с созданного в Real Flow проекта.

Шаг 5. Доводка ключей.

Сначала выделите пол и все прокси, потом квадрангулируйте их и очистите историю.

Узнайте, на каком кадре прокси встают на пол, но ещё не начинают валиться. Выберите все прокси и откройте dope sheet (Window->Animation Editors->Dope Sheet). Выберите все ключи до этого кадра (для этого не обязательно прокручивать вниз большой список проксей, достаточно выделить чёрную полоску на линии Dope Sheet Summary) и удалите их.

Потом выберите все оставшиеся ключи и введите в левое поле Stats строку -=<номер кадра>, опуская угловые кавычки. Нажмите enter и все ключи сдвинутся на нужное число кадров назад (такой фокус можно проделывать с половиной полей ввода в майе, кроме оператора -= есть ещё +=, *=, /=).

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

Шаг 6. Замена проксей на модели доминошек.

ыделите любой прокси, скопируйте (не Duplicate Special, а простой Duplicate). Сделайте из него модель доминошки, не трогая угловых вершин. Это на самом деле не обязательно, но помогает понять, где они будут после замены проксей на геометрию доминошек. Если Вы хотите наложить на неё текстуры – делайте это сейчас.

Теперь сначала выберите модель доминошки, а потом все прокси, запустите скрипт и нажмите вторую кнопку. Скрипт заменяет shape прокси на shape доминошки - В результате окажется, что на месте каждого прокси появился анимированный instance геометрии доминошки (в частности, это означает, что нельзя использовать скрипт во второй раз, чтобы заменить уже заменённые однажды доминошки, нужно вернуться к тому месту, где были прокси и заменять их).

Вот и всё, теперь осталось лишь назначить материалы и рендерить!

543 0 850 17
17
2007-09-06
может я что то пропустил но как скрипт называется и где его можно взять.
2007-09-06
2x_Personaj_x - скрипт в маааленьком окошечке, чуть ниже слов "Шаг 3. Размещение проксей по путям.". Вообще окошечко должно быть большим, но видимо, что-тут странное происходит с тегом textarea... Надо будет обсудить с редактором... Вот ещё раз текст скрипта: global proc FEDominoHelper() { window -h 100 -title FEDominoHelper; gridLayout -numberOfColumns 2 -cellWidth 220; button -aop true -label "Distribute Object Copies Along Path" -c FEDistributeAlongPath; textField -tx 0.138386 Dist; button -aop true -label "Replace Proxies With Geometry Instances" -c ProxyReplace; showWindow; } proc ProxyReplace() { // Сохраняем выделение $sel = `ls -sl`; // Первый выделенный объект - то, на что будем заменять $objectName = $sel[0]; // Скопируем его, чтобы не трогать оригинал $tmpsel = `duplicate $objectName`; $objectName = $tmpsel[0]; // Выбираем shape select $objectName; pickWalk -d down; $tmpsel = `ls -sl`; $objectShape = $tmpsel[0]; for($i = 1; $i < size($sel); $i++) { // Выбираем shape и удаляем её select $sel[$i]; pickWalk -d down; delete; // Приделываем shape приделывем её к анимированному transform nod'у parent -add -shape $objectShape $sel[$i]; } delete $objectName; } //////////////////////////////// FEDistributeAlongPath //Первым нужно выделить объект, копии которого нужно расставить по пути, потом - все пути, по которым нужно расставлять копии. //Потом зпустить скрипт. Переменная $dist задаёт расстояние по длине кривой между соседними копиями. global proc FEDistributeAlongPath() { // Узнаюм расстояние $dist = (float)`textField -q -tx Dist`; $sel = `ls -sl`; $count = size($sel); // Цикл по кривым for($ii = 1; $ii < $count; $ii++) { // Копируем объект duplicate $sel[0]; $tmp = `ls -sl`; $objToDistribute = $tmp[0]; // Вычисляем длину кривой и количество объектов на пути $len = `arclen $sel[$ii]`; $end= (int) ($len / $dist); // Создаём Motion Path с стартом в 1 кадре и концом в кадре с номером, равным количеству копий select $objToDistribute $sel[$ii]; pathAnimation -fractionMode true -follow true -followAxis z -upAxis y -worldUpType "vector" -worldUpVector 0 1 0 -inverseUp false -inverseFront false -bank false -startTimeU 1 -endTimeU $end; // На каждом кадре копируем объект for($i=2; $i <= $end; $i++) { select $objToDistribute; currentTime -update true $i; duplicate; }; delete $objToDistribute; } currentTime -update true 1; }
2007-09-07
эээ может я что то упустил, но нафига так извращаться с реал флоу? если майка сама вполне легко справится с такой задачей... кроме того нафига использовать скрипты для расположения доминошек на кривой? а на что Create Animation Snaphot? ведь если его применить грамотно то всё нормально будет... короче для столь тривиальной задачи не зачем лезть в мел и тем более в реал флоу... хм ещё раз перечитал так и не понял зачем тут реал флоу то?
2007-09-07
2 skif: Скрипт для размещения я использовал потому, что create animation shanpshot творит очень странные вещи с атрибутами трансформ ноды - я об этом писал, из за чего(во всяком случае, у меня) не получается нормально впоследствии заменить прокси на детелизированую геометрию. Если же заменять не надо, то можно обойтись и без скрипта. RealFLow я использовал потому что моайа на моей машине часто просто падает при просчёте большого количества объектов, а RF - нет. Кроме того, я хотел показать два разных подхода к решению.
2007-09-07
[quote]Скрипт для размещения я использовал потому, что create animation shanpshot творит очень странные вещи с атрибутами трансформ ноды - я об этом писал, из за чего(во всяком случае, у меня) не получается нормально впоследствии заменить прокси на детелизированую геометрию. Если же заменять не надо, то можно обойтись и без скрипта. RealFLow я использовал потому что моайа на моей машине часто просто падает при просчёте большого количества объектов, а RF - нет. Кроме того, я хотел показать два разных подхода к решению.[/quote] ясно... ответ удовлетворил... ну чтож.. всегда восхищался людьми понимающими мел... если скрипт твой то респект.
2007-09-08
В майе действительно не обойтись без скриптов, чтоб раставить идентичные объекты по пути? А модуля типа Reactor там тоже нет? Если перевести этот тутор на макс, то писать не о чем было бы.
2007-09-08
2Hex: Меня всегда удивляли те люди-максеры, которые просматривают картинки в туториалах по майе лишь для того чтобы найти новый аргумент к тому что майя хуже, чем макс. Если бы Вы удосужились прочитать урок, или хотя бы предыдущие комментарии, таких вопросов бы не возникло.
2007-09-11
Да нет, тут просто как в рекламме эпла и ПС... В Магзе не было бы ваабще проблемм. 1000 доминошек падали бы друг на дружку каждая по своему с небольшими отклонениями, и все что для этого нужно, сделать доминошки, расставить их, сделать обьектом реактора, поставить парочку галочек, запустить симуляцию и типа все готово. Кстати увидев урок я сразу это проделал. Это заняло минут 10. Вот мы и удивляемся. Урок наверное хороший. Если бы я знал мел, не говоря уже о питоне сказал бы точно. А вообще я удивлен. В майке вроде хорошая динамика. Можно ведь было сделать ей не заморачиваясь на скрипты?
2007-09-11
В любом случае я поставил 5, вы ведь тратили свое время что бы помочь людям.
2007-09-11
2 Mr.Absent - метр, Вы, безусловно, кругом правы, но просто и майская динамика и реактор при просчёте не всегда правильно проводят аппрксимацию поверхности (в смысле понимимание софта о том, как выделить из плотной сетки куб может отличаться от Вашего). Также в майе нет такой полезной вещи, как задание прокси меша для просчёта. Фактически, это именно то, что я сделал в уроке. Также, как я уже писал, просчитывать тяжёлые симуляции лучше в RealFlow, тк меньше вероятность падения и потери симуляции.
2007-09-12
[url]http://www.highend3d.com/maya/downloads/plugins/dynamics/Nima--Novodex-for-Maya--3856.html[/url] Есть такая штуковина :). Прикрученная агея к майя. Работает неприлично быстро. На лету создаёт очень классные прокси, для любых конструкций. У майя и правда самая медленная динамика твёрдых тел из всех, что я когда либо использовал. Но не настолько чтобы задействовать внешние программы для кубов. Вероятно в начальной позе происходила коллизия и это вызывало тормоза. ps в новой майя есть такая штука как nCloth. С помощью него тоже можно симулировать ригидные тела. Для быстрых коллизий с полом можно в опциях задать уровень ладшафта. А у самих объектов задать ригидность равную 1. И тогда будут очень даже клёвые кубики с весьма прикольным поведением. И одним очень существенным плюсом: они будут взаимодействовать с воздухом. Т.е. Если ты слепишь бумажный самолётик, то он полетит как настоящий, чего я пока не наблюдал ни в одном другом физ движке. pps надеюсь что в следующей майке всё таки уберут этот очень сомнительный физ двиг.
2007-09-12
Да. Нклоз это супер пупер. Даже завидно. Отсается надесяться что в 2008 магзе перекроят динамику тоже но на это что-то мало надежды...
2007-09-24
Создается такое впечатление, что народ, который перешел на майю просто не знает макс... А слова про майскую динамику, при расчете которой машина падает, просто забавляют. К слову сказать, некоторые майщики совсем недавно предлагали даже снаряжать персонажи с майской динамикой вместо нормального рига!!! Только куда это потом девать? ПАредставленную в уроке анимацию начинающему в максе можно сделать, как минимум, тремя способами: reactor, cloth, dynamics. А можно просто качественно написать анимацию и сделать instance для остальных объектов. Я молчу про использование скриптов. Если что, в максе тоже можно писать скрипты, кто не в курсе... Что касается размещения объектов - это тот же snap shot, spacing tools и тот же maxscript... Урок, безусловно, хороший. Но тема притянута за уши!!! Давайте еще цветокоррекцию в майе начнем делать!!!
2007-09-24
>> А слова про майскую динамику, при расчете которой машина падает, просто забавляют. Почему? Попробуйте просчитать хотя бы одну букву без хитростей где угодно - не думаю, что это будет так уж быстро. >> ПАредставленную в уроке анимацию начинающему в максе можно сделать, как минимум, тремя способами: reactor, cloth, dynamics. Что такое раектор в максе я ещё помню, но что такое dynаmics? К тому же начинающий и в таком случае столкнётся с определённым количеством проблем. >> А можно просто качественно написать анимацию и сделать instance для остальных объектов. Попробуйте потом разместить доминошки на таком расстоянии друг от друга, чтобы не было пересечний или просветов между ними после падения. >> Я молчу про использование скриптов. Если что, в максе тоже можно писать скрипты, кто не в курсе... Как будто кто-то с этим спорил... >> Что касается размещения объектов - это тот же snap shot, spacing tools и тот же maxscript... Мой скрипт как раз дублирует действие spacing tool. Почему он нужен - я уже писал. Давайте еще цветокоррекцию в майе начнем делать!!! >> Майя - программа для анимации (в частности), вот я и расказал, как кое-что из анимации там сделать.
2007-09-25
Не спорь. 3дмакс – это для богов 3д графики. Простым смертным это не понять.
2007-10-09
Спор о том, кто лучше майка или макс уже надоел. Я сам максер от рождения, но из-за кастрированности макса по части динамики, перехожу в ряды майщиков. Мне просто не хватает уже возможностей макса по анимации. Попробуйте сделать что-то приличное, да хотябы тупо проходку персонажа через скажем мячики, которые должные откатываться. Я даже предсталять не хочу-реактор, туда обратно, превью, создать, тут мячик под пол провалился и тд. Как не крути-реактор кривоват, + в новой верси даже не убрали баги, старого+добаились новые.
2015-09-19
Ссылка не найдена ))) [quote=Fiend3d] http://www.highend3d.com/maya/downloads/plugins/dynamics/Nima--Novodex-for-Maya--3856.html Есть такая штуковина :). Прикрученная агея к майя. Работает неприлично быстро. На лету создаёт очень классные прокси, для любых конструкций. [/quote]
RENDER.RU