Как сделать инверсную кинематику в unity

Обновлено: 08.07.2024

Информация по этому вопросу крайне скудная, да и та устаревшая. Но тема по-прежнему актуальна. Как настроить материалы объекта, текстурированного в 3ds с помощью Multi/ Sub Object Material?
С помощью UV Set Unity позволяет настроить второй материал, но не более того, и что делать, если меш был текстурирован 3-4 и более ID - неясно.

Dakon

Активный участник

Никак не можешь. Unity Standart Shader использует только 2 UV сета. А если это материалы, то в Unity использовать несколько материалов.

Пользователь сайта

Никак не можешь. Unity Standart Shader использует только 2 UV сета. А если это материалы, то в Unity использовать несколько материалов.

Даже кодом?
А то как-то муторно с крупными объектами выходит. Можно было-бы тот же дом одним мешем сделать, да отдельные материалы на каждый id натянуть (стены/ крыша/ окна/ двери etc), а то придётся либо кусками резать, либо как-то по другому извращаться.

_________UPD 27.08________________

Не сразу догадался, что в моём случае это, в общем-то, и ни к чему. Оказалось, что ничего не мешает применить к одному мешу сразу несколько материалов, используя всего один unwrap и один id.

В этот раз будем учиться изменять анимацию персонажа с помощью IK. Для этого установим пакет Animation Rigging в .

Учимся использовать систему инверсной кинематики Animation Rigging в Unity, на примере реализации атаки .

Рассказываю как пользоваться IK в Unity. Объясняю базовые понятия и методы манипуляции конечностями. На новый ПК: .

Самый просто и мощный IK в Unity, всё очень просто и эффективно МОЯ ЖЕНА❤ (девочка которая сняла интеграцию) .

В этом видео я покажу процесс настройки встроенной системы IK. Так же добавлю аналог системы IK и муравью.

Привет, это пятый урок где мы сделаем IK прицеливание для нашего персонажа. Приятного просмотра Если вам нравятся .

С помощью инверсной кинематики можно очень сильно упростить процесс риггинга персонажей. Чем IK отличается от FK?

2D IK (инверсная кинематика) инструментами Unity3d версия 4.6 Используя свободный скрипт. Совет по настройке рига.

Привет! В этом видео мы добавим топор в руку персонажа, добавим анимацию удара и с помощью animation rigging .

Хочешь выучить Unity (юнити) всего за 1 час и при этом сделать это качественно? Тогда смотри от профессионала как!

В данном видео уроке рассмотрены основы работы с Inverse Kinematics(IK). Простой пример использования IK это когда у .

Комплексный урок в котором вы научитесь создавать риг для персонажа человека, делать инверсную кинематику .

. позволяет на живом примере увидеть как работает инверсная кинематика. Поговорим о том зачем нужна корневая кость.

Это видео расскажет о инверсной кинематике (IK) и поможет еще дальше углубиться в тему риггинга в Blender.

Подключаем DI к существующему проекту на Unity, где ни о каком dependency injection речи изначально не шло. По дороге .

Как брать разное оружие в Юнити? Как добавить анимации слежения в Юнити? Как повернуть голову персонажа в Юнити?

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

image

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

Серия будет состоять из следующих частей:

  • Часть 1. Введение в процедурную анимацию
  • Часть 2. Математика прямой кинематики
  • Часть 3. Реализация прямой кинематики
  • Часть 4. Введение в градиентный спуск
  • Часть 5. Инверсная кинематика для робота-манипулятора
  • Часть 6. Инверсная кинематика щупалец
  • Часть 7. Инверсная кинематика лап паука

Часть 1. Введение в процедурную анимацию

Главная мысль здесь заключается в том, что моменты состояния персонажа можно генерировать процедурно. В одной из самых стандартных техник генерирования процедурных анимаций используется симуляция физики. Поэтому её часто называют физической анимацией (Wikipedia). Типичный пример — это вода. Можно анимировать её вручную или использовать анимацию, учитывающую динамику жидкостей.

Ниже мы обсудим очень специфический подвид физических анимаций, в котором применяется симуляция твёрдых тел (rigid body simulation). Такой же тип симуляции обычно используется в игровых движках, например в Unity и Unreal. Давайте посмотрим, как этот простой принцип используется в играх для создания физических анимаций.

Ragdoll-физика

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

Сегодня рэгдоллы очень привычны в играх. В Unity есть простой инструмент Ragdoll Wizard, позволяющий быстро превратить гуманоидную модель в рэгдолл.

Симуляции твёрдого тела

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

В статье How Grow Home Uses Maths To Generate Personality игровой журналист Алекс Уилтшир (Alex Wiltshire) разговаривает с представителями Ubisoft об игре Grow Home. Одна из основных особенностей игры — способ движения главного героя, Бада (BUD). В игре нет готовых анимаций, по крайней мере, в традиционном смысле. Когда игрок двигается, положение ног и рук управляется кодом. Части тела подвержены тем же ограничениями, что и у рэгдолла, что заставляет их создавать убедительные анимации.



Подобный принцип также активно используется в Rain World. Каждое животное в игре имеет тело, состоящее из нескольких коллайдеров. Некоторые из них управляются кодом, другие контролируются сочленениями. Это можно заметить на анимации внизу. Конечные точки крыльев хищной птицы движутся программно, остальные кости соединены шарнирами. Управление конечными точками автоматически создаёт плавную анимацию, которую иначе достигнуть бы не удалось.

И в Grow Home, и в Rain World процедурные анимации используются для повышения реалистичности персонажей. Однако контроллеры не полагаются на эти анимации. В игре Gang Beasts эта концепция развита ещё дальше. Игра полностью одобряет разболтанные движения, возникающие в результате использования ragdoll-физики. В результате получились забавные персонажи с непредсказуемыми движениями.

Инверсная кинематика

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

Следующий шаг в создании процедурных анимаций известен как инверсная кинематика. Для рэгдолла любого типа инверсная кинематика вычисляет, как его нужно двигать, чтобы достичь нужной цели. В Grow Home и Rain World физика сама определяет, как должны двигаться подверженные воздействию гравитации соединения. Инверсная кинематика заставляет их двигаться в нужных фазах.

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

В редакторе анимаций Unity под названием Mechanim есть инструмент (справка Unity), позволяющий разработчику использовать для гуманоидных персонажей инверсную кинематику.


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

Часть 2. Математика прямой кинематики

Теперь мы начнём путешествие в мир инверсной кинематики. Есть множество способов решения этой проблемы, но все они начинаются с прямой кинематики.

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

Робот-манипулятор

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


Чтобы рассмотреть более общий пример, мы можем начертить схему сочленений. В этой статье мы примем, что каждое сочленение может поворачиваться только по одной оси.


Инструмент, прикреплённый к концу робота-манипулятора, называется конечным звеном. В зависимости от контекста он может считаться или не считаться одной степенью свободы. В этой статье конечное звено не будет учитываться, потому что мы сосредоточимся только на движении для достижения нужной точки.

Прямая кинематика

В этом примере каждое сочленение может поворачиваться по одной оси. Поэтому состояние каждого сочленения измеряется как угол. Поворачивая каждое сочленение на определённый угол, мы позволяем конечному звену достигать разных точек в пространстве. Определение того, где находится конечное звено при известных углах сочленений, называется прямой кинематикой.

Геометрическая интерпретация

Прежде чем начать писать код, нам нужно понять математические построения, стоящие за прямой кинематикой. Но прежде всего нам нужно разобраться, что она значит пространственно и геометрически.


На схеме выше показан манипулятор с тремя степенями свободы. Каждое сочленение повёрнуто в положение его нулевого угла, то есть робот находится в исходном положении. Мы можем увидеть, как изменяется такая конфигурация при повороте сочленения на градусов. Он приводит к соответствующему перемещению всей цепочки сочленений и звеньев, прикреплённых к .



Важно заметить, что двигатели, прикреплённые к другим сочленениям, пока не двигались. Каждое сочленение вносит свой вклад в локальный поворот прямой цепочки связей. На схеме ниже показано изменение конфигурации при повороте второго сочленения на градусов.


Положение определяет только , а на воздействуют уже и , и . Система координат поворота (красная и синяя стрелки) ориентирована в соответствии с суммой поворотов более ранней цепи соединений, к которой она присоединена.

Математика

Из предыдущих схем очевидно, что для решения проблемы прямой кинематики нам нужно вычислить положение вложенных (подчинённых) объектов при их повороте.

Давайте посмотрим, как его вычислить на примере двух сочленений. Найдя решение для двух элементов, мы можем повторять этот процесс для решения цепей любой длины.


Начнём с простого случая, когда первое сочленение находится в своём начальном положении. Это значит, что , как на схеме ниже:



Когда не равен нулю, нам нужно просто повернуть вектор расстояния в точке опоры вокруг на градусов:


Математически это можно записать как:


Ниже мы узнаем, как можно использовать функцию AngleAxis (документация Unity) без возни с тригонометрией.


Воспроизводя ту же логику, мы можем получить уравнение для :


И, наконец, общее уравнение:


Если вы знакомы с вращением в 2D, то это можно сделать тригонометрически:



О выводе уравнения можно почитать в моей статье A Gentle Primer on 2D Rotations.

Если вы обладаете инженерными знаниями, то могли решать эту проблему иначе. Проблемы прямой и обратной кинематики широко известны, и для их решения существует несколько стандартизированных подходов. Один из них — привязка к каждому сочленению четырёх параметров, называемых параметрами Денавита-Хартенберга (Wikipedia). С ними удобно работать в матричном формате и они отлично подходят для аналитического решения проблемы инверсной кинематики.


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

Часть 3. Реализация прямой кинематики

Введение

В предыдущей части мы формализировали движение робота-манипулятора. Мы начали с простого примера из трёх сочленений. В своих исходных положениях они имеют изображённую ниже конфигурацию:


Разные на схеме представляют собой декартовы координаты, или -тое сочленение. Локальные углы, определяющие поворот относительно исходных положений, помечены как .

При повороте сочленений мы наблюдаем следующую картину:


Поведение этой системы можно суммировать следующими утверждениями:



Иерархия GameObject

В Unity уже есть способ реализации всех вышеупомянутых требований: система родительских компонентов (parenting). Если сделать игровой объект дочерним по отношению к другому, он автоматически наследует положение, поворот и масштаб.

Если вам знаком риггинг, то вас это не удивит. Кости, представляющие собой сочленения гуманоидного персонажа, тоже имеют систему родителей, при которой повороты и движения наследуются. На изображении из Unity Animation 3: Character Setup Майкла Эрбетнота показан очевидный пример этого.


При создании иерархии соединений необходимо убедиться, что, когда все локальные углы Эйлера равны нулю, то робот-манипулятор находится в исходном положении. Для гуманоидного персонажа это обычно стандартная T-образная поза, показанная на изображении выше.

Реализация

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

Первый шаг — это сохранение информации о каждом из сочленений робота-манипулятора. Этого можно достичь при помощи скрипта, например RobotJoint из следующего примера:


Для упрощения вычислений примем, что каждое сочленение может поворачиваться только по одной своей локальной оси: X, Y ил Z. Мы обозначим это переменной Axis , которая принимает значение 1 для координаты относительно оси вращения. Если сочленение поворачивается по оси Y, то Axis будет иметь вид (0,1,0) . Мы увидим, как это позволит нам избавиться от конструкций с IF .

Давайте создадим функцию ForwardKinematics . Она получает массив angles чисел типа float . Имя говорит само за себя: angles[i] содержит значение локального поворота i-того сочленения. Функция возвращает положение конечного звена в глобальных координатах.

Повороты в Unity часто описываются через углы Эйлера. Это три числа, соотвествующие повороту объекта по осям X, Y и Z. Углы Эйлера обозначают крен (roll), тангаж (pitch) и рыскание (yaw) объекта в пространстве. Однако с математической точки зрения использование углов Эйлера может привести к довольно неприятным проблемам.

Работать с углами удобнее с помощью кватернионов (quaternions). Кватернионы — это математические объекты, которые можно использовать для описания поворотов. В отличие от них, углы Эйлера описывают ориентацию. Квартернион описывает путь, который нужно пройти из одной ориентации в другую. С технической точки зрения, это слишком большое упрощение, но для нашей статьи его более чем достаточно.

Вращения кватернионы

Кватернион можно представить как поворот. Вращение объекта в пространстве — это, с математической точки зрения, аналог умножения его положения на кватернион. Для создания вращения вокруг неподвижной точки в Unity можно использовать функцию Quaternion.AngleAxis . Строка Quaternion.AngleAxis(angle, axis); создаёт кватернион, описывающий поворот вокруг оси axis на angle градусов. В этом контексте значение Axis может быть равно (1,0,0) , (0,1,0) или (0,0,1) , что обозначает, соответственно, X, Y или Z. Это объясняет, почему мы создали переменную Axis в классе RobotJoint .

Добавление вращений умножение кватернионов

При умножении двух кватернионов создаётся новый кватернион, включающий в себя оба поворота. При каждой итерации цикла for переменная rotation умножается на текущий кватернион. Это значит, что она будет включать в себя все повороты всех сочленений.

Facebook

Twitter

Reddit

Մեկնաբանություններ: 13

Привет. Продолжай пожалуйста эту тему, очень полезно. Рассказываешь хорошо и без воды! То что нужно!

Спасибо) Очень крутая подача материала, жмякаю жирный лукас. Жду новых роликов.

Читайте также: