Создаем Locomotion систему в UDK

Locomotion системаПродолжая работать над постановкой стоп персонажа в UDK через инверсную кинематику (IK), мы плавно переходим к созданию так называемой Locomotion-системы для UDK. Вечно меня тянет в те области, в которых я вообще не разбираюсь! ;)

В чем же заключаются недостатки обычной IK-системы для постановки стоп?

Во-первых, она работает пост-фактум. Т.е. корректировка стопы осуществляется уже после того, как в анимации стопа поставлена на землю. А учитывая неровность поверхности — поставлена изначально неправильно. Стопа проваливается в землю и только после получения сигнала из анимации корректируется IK-контроллером. Смотрится это, честно говоря, не айс!

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

А в чем же заключается отличие Locomotion-системы от постановки стоп при помощи IK-контроллеров?


( Читать дальше )
  • +1
  • 05 ноября 2012, 14:20
  • dimanjy
  • 1

Применение Skeletal Controller в UDK или как повернуть кость?

В задаче постановки стоп в UDK при инверсной кинематике IK персонажа в UDK я использовал скелетный контроллер (Skeletal Controller) SkelControlSinbleBone. Именно он позволяет доворачивать стопу так, чтобы она совпадала с неровной поверхностью земли после того, как уже отработала система инверсной кинематики IK в Unreal Engine.

Поворот кости через SkelControlSinbleBone в UDK

Но проблема в том, что сама модель (или поверхность — Mesh) стопы персонажа привязана к системе координат конкретной кости, которая, как правило, совершенно не совпадает с полученной нами системой координат, а зависит от 3D-редактора, в котором разрабатывалась модель персонажа. И уж точно 3D-моделлер не захочет как-то по-особенному выворачивать кость и терпеть потом из-за этого жуткие неудобства с анимацией персонажа только из-за того, что программист не удосужился учесть этот момент в скриптах на UnrealScript.

В моем случае я — и моделлер, и программист, но мне все-равно не хочется изгаляться в Blender'е. Поэтому мне необходимо теперь как-то переложить полученные нами вектора на систему координат скелетного контроллера SkelControlSingleBone, чтобы передать полученное вращение правильно.


( Читать дальше )

Ротаторы (Rotator) в UDK и преобразование координат

Работая над инверсной кинематикой (IK) стопы персонажа в UDK наткнулся на непонимание мной работы ротаторов (Rotator) в UDK и их отношение к системам координат (мировым — world, и локальным — local). Плохо я в школе учил векторную алгебру и сейчас очень об этом жалею. Переместить стопу в точку на поверхности у меня получилось очень легко (читай предыдущий пост Инверсная кинематика IK в UDK: Постановка стоп персонажа на поверхности), а вот довернуть саму стопу так, чтобы она была параллельно поверхности и при этом смотрела в сторону движения персонажа — тут у меня образовался затык.

Первое, что я сделал — просто задал стопе поворот, точно соответствующий нормали поверхности. Все ОК — стопа точно повторяет поверхность, но оказывается жестко закреплена этой нормалью, как гвоздем прибита. Мало того, что стопы при этом смотрят в совершенно произвольную сторону (а как же еще — ведь нормали по кривой поверхности распределены совершенно произвольно), так ведь еще при вращении персонажа стопы также остаются на месте и не вращаются вместе с ним! Но это так и должно быть, ведь я прилепил их к нормали поверхности.

Для решения этой проблемы оставалось только довернуть стопу в сторону вектора X персонажа (по направлению движения). Для этого я просто скопировал свойство ротатора персонажа Yaw в результирующий ротатор для стопы (в то же свойство Yaw, соответственно). Но в результате стопа провернулась в мировой системе координат (world coordinates) вместо ожидаемой локальной системы координат нормали (local coordinates).

Rotator в UDK и система координат



( Как же быть? )

Инверсная кинематика IK в UDK: Постановка стоп персонажа на поверхности

Создавая современную игру, нельзя упускать из виду такой важный момент, как соответствие положения ног персонажа поверхности, на которой он находится. Если персонаж стоит на лестнице, то одна нога должна стоять на одной ступеньке, а вторая — на другой. Аналогично при ходьбе по наклонной поверхности стопы должны находиться на разном уровне. Более того, поверхность стопы должна точно соответствовать нормали поверхности, на которой она находится.

Инверсная кинематика IK в UDKВ UDK есть встроенная поддержка постановки стоп, но она, почему-то, мало у кого работает, судя по множеству вопросов на официальном форуме Epic Games. У меня также не получилось заставить ее работать, да и в документации по скелетным контроллерам написано, что она годится только для стоящей на месте модели, а для ходьбы и бега все-равно придется шаманить.

Поэтому многие берутся за создание собственной системы IK для постановки стоп в UDK. Я тоже решил более глубоко разобраться в этом вопросе, потому как это точно пригодится в будущем для разработки более сложных систем с лазаньем по лестницам и стенам, хватанием за карнизы и прочего паркура.



( Итак, приступим... )