|
| |||
|
| |||
| |
Здравствуйте. Вы находитесь на сайте Unreal Level. Данный ресурс посвящен редакторам карт игр серии Unreal, UT и Gears of War. Основная цель сайта , помочь всем желающим освоить любой из редакторов вышеперечисленных серий. Наибольшим приоритетом на этом сайте, обладает редактор UnrealED for Unreal Engine 3 и редактор движка Unreal Engine 3.5, входящий в комплект разработки UDK, поскольку это наиболее актуальная на сегодняшний день технология. |
|
Root Motion
автор: FACH | 21 Марта 2011 | Просмотров: 3068
Автор: Лаурент Делайен Перевод: LS Оригинал: Root Motion
Введение
Актеров можно перемещать в игровом мире, используя математические уравнения. Возьмем, к примеру, ускорение автомобиля, которое позволяет увеличить его скорость и обновить позицию. Для этого необходимы следующие основные уравнения.
Скорость = ускорение * DeltaTime Позиция = скорость * DeltaTime
Вы можете также взять во внимание множество других параметров, таких как, трение или тяжесть, чтобы сделать наиболее реалистичное управление автомобилем. Это довольно просто имитировать для механических объектов, но гораздо сложнее сделать для существ. Возьмем для примера человека, лошадь или обезьяну. Их движения могут быть не равномерны и не обязательно следуют простым шаблонным перемещениям, имитируемые уравнениями. Нет сомнений, что через несколько лет можно будет создавать реалистичные процедурные движения в реальном времени, которые будут использоваться в играх, но на данный момент наиболее эффективным решением является анимационное перемещения актера. Данный метод называется корневое движение (Root Motion).
Идея состоит в комплексном движении, запеченном в анимацию, как правило, это проделывается над корневой костью скелетного меша, отсюда и название – корневое движение. Данное перемещение извлекается из анимации и передается игровой физике для перемещения актера.
Обзор Root Motion
Откройте AnimSet редактор и выберите необходимую анимацию. Убедитесь, что Вы включили отображение костей на панели инструментов. Вы можете сделать это следующей кнопкой:
![]()
После, в окне просмотра Вы увидите кости скелетного меша, наряду с просмотром движения корневой кости.
![]()
Сверху изображен мешь на первом кадре. Ниже – в середине анимации.
Как Вы могли заметить, красная линия показывает корневое движение. Это переход с первого кадра анимации до текущего кадра. Это расстояние, на которое будет перемещаться актер.
Фиолетовая линия показывает перемещение корневой кости, относительно начального положение меша. Корневая кость не обязательно должна изначально находиться в центре меша, но если бы это было так, то красная и фиолетовая линии перекрылись.
Использование Root Motion в игре
Первое, что необходимо сделать, чтобы использовать корневое движение в игре, это добавить его в AnimNodeSequnce. AnimNodeSequnce является узлом AnimTree, отвечающего за проигрывание анимации. Здесь Вы можете контролировать варианты корневого движения по отношению к анимации.
Эти изображения демонстрируют очень простое дерево анимаций: AnimNodeSequnce настроен под корневое движение.
![]() Эти параметры AnimNodeSequnce оказывают влияние на корневое движение:
bZeroRootRotation – блокировка вращения корневой кости. bZeroRootTranslation – блокировка перемещения корневой кости. RootBoneOption[0] – локальное пространство корневой кости по оси Х. RootBoneOption[1] – локальное пространство корневой кости по оси Y. RootBoneOption[2] – локальное пространство корневой кости по оси Z. RootRotationOptions[…] – опции вращения корневой кости по трем осям.
Опции, которые могут быть применены к любой из трех осей:
- RBA_Default – поведение по умолчанию, оставляет корневое движение в виде анимации и не оказывает эффекта на перемещение актера. - RBA_Discard – отбрасывает любые корневые движения, запирая их на положении первого кадра. - RBA_Translate – отбрасывает корневое движение анимации и передает его скорость актеру.
Эти параметры могут влиять на любую из осей. Таким образом, Вы можете сделать что-то вроде этого: по осям X,Y движение определяется физикой актера, а по оси Z анимацией.
Несколько замечаний относительно корневого движения: - Можно воспроизводить несколько анимаций с корневым движением в одно и то же время. Корневое движение будет смешиваться в дереве анимиций должным образом, а затем направлять актер. - Корневое движение также поддерживает зацикливание.
После того, как корневое движение было настроено для соответствующей AnimNodeSequence, актер должен использовать результирующее движение. Опять же, доступно несколько вариантов:
- bForceDiscardRootMotion – блокирует корневое движение в локальном пространстве с нулевым вращением. - bRootMotionModeChangeNotify – вызывает событие RootMotionModeChanged() для актера владельца. - RootMotionMode – описывает, как мешь должен использовать корневое движение.
Root Motion Mode может быть:
- RMM_Ignore – ничего не делает. - RMM_Translate – перемещает актер в соответствии с корневым перемещением. Это происходит сразу после старта анимации и не использует игровую физику (т.е. актер не может скользить или падать, не запускает скриптовых уведомлений, таких как событие Bump()). - RMM_Velocity – извлекает величину корневого движения и лимитирует ее максимальной скоростью данного актера. Данное действие происходит на следующем кадре и ограничивает физику владельца актера. Физика соблюдается и скриптовые уведомления также учитываются. В этом режиме физика все еще обеспечивает движение, а анимация величину скорости. Это полезно, когда Вы хотите сохранить интерактивность времени реагирования и/или точность движения. - RMM_Accel - в этом режиме корневое движение передается непосредственно в физику движка. Это означает, что обычное ускорение пешки перекрывается корневым движением анимации. Физика движка будет пытаться перемещать актер в соответствии с корневым движением анимации. Физика падения, скольжения и т.д. будет поддерживаться. Это полезно, когда Вы хотите, чтобы пешка перемещалась в соответствии с анимацией и в то же время учитывались рельеф местности и коллизию игрового мира.
Бесшовные переходы
Вы, вероятно, столкнетесь с вопросом о переходе. Как перейти от игровых движений к движению анимации плавно?
При установке нового режима корневого движения меша уходит ровно одно событие Tick после того, как анимация с новым режимом была обработана. Это сделано, чтобы предотвратить любые столкновения с внутриигровой физикой, которая возможно уже была обработана. В зависимости от контекста это может произойти в разное время, с задержкой в пару кадров, не более. Но есть способы, чтобы сделать легкий переход без шва.
- RMM_Translate. В зависимости от того, когда данный режим был установлен, т.е. до или после того, как игровая физика была просчитана. Он также может быть установлен до или после того, как анимация была просчитана. Одно мы знаем наверняка, корневое движение будет применено ровно через одно событие Tick после того, как анимация с новым режимом была обработана. Чтобы сделать переход простым есть флаг bRootMotionModeChangeNotify, который уведомляет о изменении режима корневого движения. Это вызовет событие актера владельца для перехода на другой режим. Когда это событие вызывается, мы можем быть уверены, что на следующий Tick новый режим будет применен, поэтому мы можем позаботиться о переходе здесь. Например, Вы можете убить физику движения (устройство ввода игрока, скорость и ускорение) и смело предположить, что корневое движение будет заботиться о перемещении с этого момента.
- RMM_Velocity. Этот режим всегда применяется с задержкой в кадр. Но из-за той же причины, что и выше, мы можем гарантировать, что корневое движение будет применено ровно через Tick после обработки анимации. Переход в этом режиме гораздо проще, так как нужно просто поддерживать принудительное перемещение актера и ждать пока корневое движение изменит величину скорости. Принудительное перемещение может быть реализовано, используя несколько способов, либо путем принуждения ввода игрока, используя Controller.bPreciseDestination, либо контролирования скорости/ускорения актера.
Примеры использования корневого движения
Следующий участок кода является примером проигрывания Пешкой корневого движения анимации прыжка. Не пытайтесь скомпилировать данный код, он дан только в качестве примера.
simulated function PlayJumpAnimation(AnimNodeSequence SeqNode) { // воспроизведение анимации прыжка SeqNode.SetAnim('Jump'); SeqNode.PlayAnim(FALSE, 1.f);
// включает корневое движение по трем осям в анимационном узле SeqNode.RootBoneOption[0] = RBA_Translate; SeqNode.RootBoneOption[1] = RBA_Translate; SeqNode.RootBoneOption[2] = RBA_Translate;
// включает уведомление актера при завершении проигрывания анимации SeqNode.bCauseActorAnimEnd = TRUE;
// переключает режим меша на использование корневого движения Pawn.Mesh.RootMotionMode = RMM_Translate;
// Сообщает мешу, чтобы тот уведомлял нас при применении корневого движения, // чтобы мы могли плавно перейти от игровой физики движения к анимации движения Pawn.Mesh.bRootMotionModeChangeNotify = TRUE; }
simulated event RootMotionModeChanged(SkeletalMeshComponent SkelComp) { /** * Корневое движение будет применено на следующий кадре. * Поэтому мы можем убить движение пешки перед переходом. */ if( SkelComp.RootMotionMode == RMM_Translate ) { Velocity = Vect(0,0,0); Acceleration = Vect(0,0,0); }
// отключаем уведомление Pawn.Mesh.bRootMotionModeChangeNotify = FALSE; }
simulated event OnAnimEnd(AnimNodeSequence SeqNode) { // Завершение прыжка
// Отменяем корневое движение. Поэтому мешь остается заблокированным на месте. // Нам необходимо правильно отменить это для использования другой анимации SeqNode.RootBoneOption[0] = RBA_Discard; SeqNode.RootBoneOption[1] = RBA_Discard; SeqNode.RootBoneOption[2] = RBA_Discard;
// Отключаем использование корневого движения мешем Pawn.Mesh.RootMotionMode = RMM_Ignore; } #1 написал: Avatarus 25 Января 2012 14:52 | ICQ: Не Указано |
Информация
Посетители, находящиеся в группе Гости, не могут оставлять Комментарии в данной новости...
|
|
|
При копировании материалов, активная ссылка на UNREAL-LEVEL.RU обязательна! © 2008—2012, UNREAL-LEVEL.RU. Все права защищены. |