Нормали вершин и рендеринг в 3D играх

Швы при освещении модульных конструкций
Занявшись модульным моделированием игровых локаций, я еще в Unity столкнулся с проблемой наложения освещения на блочные конструкции. Проблема в том, что при рендере блоки отчетливо видны, хотя в теории должны образовывать единую конструкцию. Это отчетливо видно на рисунке в верхней части кирпичной стенки.

Все, на что у меня хватило ума в тот раз — это отказаться от использования освещения в Unity и применять Unlit-шейдеры, да и вообще, отказаться от Unity и перейти на UDK:), в котором на первый взгляд таких проблем с модульными конструкциями не наблюдалось. Потом, правда, оказалось, что и в UDK эта проблема имеет место быть, в частности при создании травы. Теперь же хочу поделиться решением этой проблемы, да и вообще, немного погрузиться в теорию нормалей вершин в рендере 3D движков.


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

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

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

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

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

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

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


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

Создание рукопашного боя на UDK

Рукопашный бой в UDKЭта тема является логическим продолжением статьи о Создании холодного оружия в UDK, ведь где еще применять холодное оружие, если не в рукопашном бое? Итак, что нам нужно знать для создания более-менее реалистичного рукопашного боя на Unreal Engine в UDK (Unreal Development Kit)? Правильно! Нам нужно знать, в каком месте ударило наше холодное оружие по модели противника, чтобы включить соответствующую анимацию повреждения. В более продуманных играх можно рассчитывать степень повреждения каждой конкретной части тела (например, как в Fallout).

Понятное дело — стандартной моделью для определения столкновений (Collision Cylinder) здесь не обойтись. Как же мы будем выкручиваться?


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

Экспорт анимации из Blender в UDK (Unreal Engine)

Blender 2.64aВ данный момент активно занялся анимацией своего персонажа для UDK (Unreal Development Kit), и столкнулся с проблемой экспорта из Blender в UDK. Ранее я уже писал про экспорт из Blender в UDK в статье Создание своего персонажа для UDK в Blender. Проблема заключалась в том, что при экспорте в FBX-формат Blender 2.63 неправильно понимал параметр Scale при экспорте, а точнее применял его только к самой модели, но не к скелету. Изначально приходилось работать с увеличенной в 50 раз моделью и, соответственно, скелетом, а это не очень удобно.

Все изменилось с выходом Blender 2.64a.

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

Создание холодного оружия в UDK

Холодное оружие в UDKЕсли огнестрельное оружие встроено в Unreal Development Kit (UDK) по умолчанию и может быть использовано в собственной игре практически без изменений (за исключением, разве что самой модели оружия), то с холодным оружием (ножами, мечами, палками, дубинками и кусками арматуры) придется повозиться самому.

Проблема в том, что для холодного оружия в UDK нет встроенного механизма определения столкновений (коллизий — collisions). Да и не только для холодного оружия. Вообще нельзя отдельно для прикрепленных объектов просчитать столкновение. Считается только один единственный Collision Cylinder для всего персонажа, а прикрепленные объекты теряют свои коллизионные примитивы, даже если они у них были. Все это справедливо для режима ходьбы (PHYS_Walking) — так уж устроен движок Unreal Engine. Давайте разбираться, как это ограничение обойти.


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

Создание дороги в UDK с помощью Spline Loft Actor

«Эх, дороги! Пыль да туман. Города, тревоги, да степной бурьян.»

Снова проблемы, господа! Опять движок Unreal Engine заставляет нас лишь облизнуться на потенциальные возможности такого классного инструмента, как Spline Loft Actor в UDK. А дело все в том, что он не доделан! Он почему-то не позволяет поверхности, выгнутой при помощи сплайна, принимать динамические тени. Тени от статичных объектов запекаются в LightMap нормально, но хочется-то всех плюшек от такого движка!

Дороги с помощью Spline Loft Actor в UDK


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

Паркур и лазанье в UDK: как это сделать?

Climbing systemЕсли вы внимательно следите за игровыми новинками, то не могли не заметить тенденции к объединению в современных тайтлах всех жанров и элементов геймплея в единое целое: это и стрелялка, и увлекательное приключение с неповторимым сюжетом и историей, и рукопашные схватки, ну и, конечно, жанр Экшн (Action) подразумевает динамичную акробатику с различными трюками — паркур да и только!

Чтобы реализовать все это в едином проекте самому — жизни не хватит. Но кое-что придется сделать, иначе не дотянуть до современного уровня. В своей игре я решил реализовать систему лазания и паркура в UDK. Головокружительных трюков не планирую, но карабкаться по выступам и прыгать со стенки на стенку герой должен.


( Читать дальше )
  • 0
  • 23 сентября 2012, 13:52
  • dimanjy
  • 2

Применение 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 и система координат



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

Процедурная (программная) анимация в UDK

Настало время заняться программированием анимации в UDK. Чтобы освоить этот аспект разработки игр на Unreal Engine, попробуем начать с чего-то простого, но в тоже время полезного. Создадим актера (Actor), который будет проигрывать различные заданные нами анимации в ответ на какое-либо внешнее воздействие или действие игрока. В качестве примера представим себе экскаватор, который игрок может заставить копать, нажав на рычаг или кнопку. Понятно, что экскаватор должен быть выполнен в виде модели со скелетной анимацией (SkeletalMesh). Если мы хотим заставить экскаватор ездить и при этом копать, то нам, возможно, придется использовать AnimTree и блендинг различных анимаций. Также вместо экскаватора можно представить себе какой-либо более-менее сложный роботизированный станок с механической рукой, или что-то в этом роде…

Для имитации простого механизма со скелетом я создал болванку, похожую на лапу экскаватора:

Простой SkeletalMesh в UDK



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