Главная » Статьи » Учебник: теория

Управление анимацией. Часть2.
Составные (Multi-part) персонажи.

Иногда может потребоваться собрать персонажа из нескольких частей. В этом случае части должны содержать одноимённые кости, которыми они будут прикрепляться друг к другу. Например, у нас есть робот состоящий из корпуса и ног, и мы желаем приклеить эти ноги к талии. В этом случае, ноги должны иметь кость «талия» и корпус тоже должен иметь кость «талия». Загружается это всё следующим образом:


nodePath = Actor.Actor({
'legs':'RobotLegs.egg',
'torso':'RobotTorso1.egg',
},{'legs':{'dance':'RobotLegs-Dance.egg'},
'torso':{'dance':'RobotTorso1-Dance.egg'}})
nodePath.attach('torso','legs','waist')

Составные анимированные модели достаточно сложны. Каждая часть загружается из отдельного egg файла и каждая имеет свой собственный набор анимаций. Для загрузки анимации нам так же нужны отдельные файлы для каждой части.
При загрузке составного персонажа необходимо указывать список частей в виде словаря. Список анимаций имеет более сложную структуру в виде вложенных словарей. Внешний словарь указывает имя части к которой применяется анимация, а внутренний — имя анимации и файл.
Вот ещё пример:


myactor = Actor(

# part dictionary
{"head":"char/dogMM/dogMM_Shorts-head-mod",
"torso":"char/dogMM/dogMM_Shorts-torso-mod",
"legs":"char/dogMM/dogMM_Shorts-legs-mod"},

# dictionary of anim dictionaries
{"head":{"walk":"char/dogMM/dogMM_Shorts-head-walk",
"run":"char/dogMM/dogMM_Shorts-head-run"},
"torso":{"walk":"char/dogMM/dogMM_Shorts-torso-walk",
"run":"char/dogMM/dogMM_Shorts-torso-run"},
"legs":{"walk":"char/dogMM/dogMM_Shorts-legs-walk",
"run":"char/dogMM/dogMM_Shorts-legs-run"}
})

Кроме того, необходимо указать соединения в виде родитель-потомок:


myactor.attach("head", "torso", "joint-head")
myactor.attach("torso", "legs", "joint-hips")

Attach() прикрепляет часть, указанную первым параметром к части, указанной вторым параметром в узле, указанном третьим параметром. Перед закреплением нужно вызвать метод actor.exposeJoint() для актуализации положения узлов с положением скелета.
После вызова attach(), закреплённые части будут наследовать анимацию от узла, к которому они прикреплены.
Анимация составных персонажей
Вы можете запускать анимацю как обычно, только должны указать часть, которая будет анимирована:


myactor.play('Animation Name', 'Part Name')

Если вы желаете использовать AnimControl, описанный в предыдущей части, вы так же должны указать имя части в getAnimControl():


ac=actor.getAnimControl('Animation Name','Part Name')

Прикрепление объекта к кости.

Если у модели есть скелет, то можно прикреплять объекты к его костям:


myNodePath = actorNodePath.exposeJoint(None,"modelRoot","Joint Name")

Эта функция возвращает nodepath закреплённый за костью. Если сделать этот nodepath родителем объекта, то объект будет следовать за костью.
Строка "modelRoot" представляет имя корневого узла модели - обычно "modelRoot" является корректным значением.
Строка "Joint Name" представляет имя кости. Обычно что-нибудь типа "Femur", или "Neck", или "L Finger1". Как правило имена костей устанавливаются в редакторе, в котором создавалась модель. Если необходимо, можно выяснить имена костей, просмотрев egg файл на предмет строк типа Femur. Так же можно воспользоваться методом actor.listJoints()

Программное управление костями.

Иногда нам нужно вручную контролировать кости, например что повернуть голову персонажа в сторону какого-либо объекта. Для этого используется controlJoint.


myNodePath = actor.controlJoint(None,"modelRoot","Joint Name")

Процедура создаёт пустой узел. Каждый кадр его трансформация копируется на кость. Поворачивая эту пустышку мы можем контролировать кость. Обычно требуется только setHpr для поворота кости без изменения её координат.
Для наследования положения от родительской кости все трансформации пустышки должны быть локальными.
Параметры, принимаемые методом controlJoint аналогичны параметрам exposeJoint.

Категория: Учебник: теория | Добавил: ninth (01.02.2009)
Просмотров: 4836 | Рейтинг: 5.0/1
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Онлайн всего: 1
Гостей: 1
Пользователей: 0