Render.ru

TimeSlider в Maya8.0 -- баг или фишка?

DemX86

Активный участник
Рейтинг
18
#1
Столкнулся с таким... хм... явлением при анимации: если поставить в TimeSlider довольно большой промежуток анимации (чтобы кадров 100 было видно), то при быстром ручном прогоне анимации (т.е. если мышой протянуть активный кадр в timeline) в заранее нормальной анимации начинают твориться жуткие вещи -- объекты уходять на какие-то свои немыслимые траектории, персонажа скрючивает, и вообще, анимация "разваливается"; в основном этим страдают объекты, анимированные IKметодом. А вся фишка в том, что если прогонять анимацию медленно, то все ok -- анимация проигрывает так, как она и была сделана.
Тоже самое случается, если сразу переходить из кадра там 100го на 150й -- опять чудеса.

Пробовал менять настройки в разделе Preferences -> TimeLine -> Playback, но никаких изменений это не приносит.

При работе жутко раздражает (приходится постоянно медленно протягивать таймслайдер -- анимация довольно громоздкая для моего компьютера, поэтому все происходит мееедленно), может кто-нибудь сталкивался с этим или знает, что это -- баг или это поддается лечению? :)
 

Миша Ершов

Модератор форума
Рейтинг
314
#2
Может быть тяжелая сцена, и IK-решатели просто не успевают решать.
Можно пропробовать потестить - отрубить все IK, к примеру. (evaluate nodes -> IK)
Если найдете причину, то можно бедет попробовать и решить.
 

Ghostfly

Активный участник
Рейтинг
19
#3
Хм... Наверно Миша как всегда прав, и стоит подрулить солверы, дело наверняка именно в них. Хотел просто добавить что стоит заняться оптимайзом, раз уж сцена громоздкая - упростить везде методы решения IK вплоть до ik2Bone solver'a. Их особенности подробно описаны в хелпе.
 

DemX86

Активный участник
Рейтинг
18
#4
Ммм... звучит странно, но выключение всех IK ничего не изменило (странности так и остались) -- я думал, что вся проблема как раз в этом.

Тут вообще какая-то мистика творится:
Если я открываю сцену и ставлю, скажем 240й кадр анимации, то мне показывается вот это (скриншот 1). Но стоит прогнать анимацию немного вперед и вернуться в тот же 240й кадр, то картинка станет уже другая (скриншот 2) -- такая, какая и должна быть. Я просто в недоумении, что происходит...
 

Вложения

DemX86

Активный участник
Рейтинг
18
#6
Решатель
Да есть, но дело в том, что на этом участке анимации они отключены (проанимировал параметр nodeState = Blocking), а включаются потом (nodeState = Normal).
Эпкрешенов 2, нацелены на ходьбу:
> один поднимает и опускает тело персонажа при ходьбе;
> второй перемещает тело вправо/влево/вперед/назад при перемещении ног.

Но разве могут они влиять на анимацию, если они выключены?
 

Denzil

Мастер
Рейтинг
353
#7
Сдается мне все дело в парент констрейне....
Ведь он есть в сцене и влияет на рут?
 

DemX86

Активный участник
Рейтинг
18
#8
Denzil
Эммм... да нет, я Parent Constrain не использовал.
Единственное, что влияет на Root -- те самые два Expression, о которых я говорил ранее.
 

DemX86

Активный участник
Рейтинг
18
#9
Похоже, что все дело в этих самых Expressions -- если их закомментировать (// или вообще удалить), тогда баги с различными позами в одном и том же кадре пропадают.
Но вот только эти выражения нужны -- без них ходьба превращается непонятно во что. Может их можно еще как-нибудь выключить на определенном участке анимации, а потом включить обратно, но способом, отличным от nodeState = Blocking?
nodeState = NoEffect тоже ничего не изменяет.
 
#10
Думается что анимировать nodeState - не самый лучший способ работы с экспрешнами. Вообще они не всегда корректно работают если вот так вот туда-сюда елозить по таймслайдеру. Ничего с этим сделать нельзя.
 

DemX86

Активный участник
Рейтинг
18
#11
Гость
Да уж, в том, что анимировать nodeState -- дело неблагородное, я убедился в полной мере :)
Хотя в книжке "Моделирование и анимация персонажей в Maya" Джае-джина Чои рекомендуется делать именно так.

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

DemX86

Активный участник
Рейтинг
18
#12
Наконец-то сегодня решил проблему и спешу поделиться с вами результатом бессонной ночи :)

Оказывается, все дело было в том, как работают эти самые Expressions.
Например:
Возьмем, создадим обычный полигональный куб -- все его параметры масштабирования (scale) в ChannelBox равны по умолчанию 1. Теперь запишем выражение, которое в определенный момент включает масштабирование этого куба.

if (time*24 > 5) {
cube.scaleX = 2;
cube.scaleY = 2;
cube.scaleZ = 2;
}


То есть на 6м кадре (при 24fps) масштаб куба увеличится в 2 раза.
Смотрим:
[скриншот 1] -- куб в 5м кадре. Scale = 1
[скриншот 2] -- куб в 6м кадре. Сработало выражение, и как положено, Scale = 2
А теперь, внимание, если мы вернемся обратно в 5й кадр, то масштаб останется 2. [скриншот 3]
Вот оно! Именно поэтому при просмотре одного и того же кадра после прокрутки таймслайдера туда-сюда у меня появлялись разные позы персонажа.

То есть тут нужно просто принудительно указать параметры анимируемого тела в те моменты, когда Expression не работает -- чтобы он не вносил свои коррективы.

Т.е.
if (time*24 > 5) {
cube.scaleX = 2;
cube.scaleY = 2;
cube.scaleZ = 2;
}
else {
cube.scaleX = 1;
cube.scaleY = 1;
cube.scaleZ = 1;
}


Вот теперь куб будет возвращаться в свое первоначальное состояние при переходе обратно в 5й кадр.

Итак, после правки имеющихся выражений так, чтобы в то время, когда экпрешшны не действуют, руту принудительно задавались его предыдущие значения, пропали вообще ВСЕ баги -- позы сохраняются; теперь можно крутить таймслайдер как угодно -- все работает как положено.

Поэтому, хочу выразить вам благодарность за помощь в этой проблеме. Я уж было думал, что это баги Maya, а тут, как говорится, дело было не в бобине.... :) Спасибо.


P.S. Кстати, по ходу анимация параметра nodeState ничего плохого в себе не имеет, хотя сейчас я сделал отдельный атрибут у персонажа, который проанимирован в значения 1, 2 и 3. И, соответственно, в зависимости от этих значений в экспрешне либо включается перемещение тела, или просто тупо руту присваиваются его предыдущие параметры.
 

Вложения

Рейтинг
34
#15
Оно, собственно, так и должно работать. Никто ведь не говорил этому кубу, что перед 5-м кадром он почему-то должен обнулить изменения скейла.
 
Сверху