Все статьи / Скелетная анимация загруженной из файла 3D модели

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


Что к чему

Далее статье будут использованы краткие фразы, за которыми скрыто следующее:

  • матрица кости (bone matrix) — финальная матрица преобразования координат вершин для покрытия костей вершинами сетки, которая загружается на вершинный шейдер
  • матрица смещения (offset matrix) — матрица перехода из системы координат треугольной сетки в систему координат кости, также известна как обратная матрица позы привязки
  • матрица узла (node matrix) — матрица перехода из системы координат узла графа сцены к его родительскому узлу
  • поза привязки (bind position или rest position) — положение костей модели без применения каких-либо анимаций

Слова “кость” (“bone”) и “сустав” (“joint”) означают различные вещи в анатомии, но в рамках компьютерной графики обычно означают одно и то же и могут использоваться вперемешку.

Кости и узлы графа сцены

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

Применение анимации

Как и в обработке видео, в скелетной анимации данные распределены по кадрам. Хранить данные о 24 или 60 кадрах в секунду было бы достаточно дорого, и хранятся данные лишь о ключевых кадрах. В промежуточные моменты времени игровой движок должен совершить интерполяцию данных кадра. Данные ключевого кадра для скелетной анимации содержат информацию о трансформациях на данном кадре для каждой кости модели. Трансформация — это

  • 3D-вектор масштабирования, задающего размер
  • Кватернион поворота, задающего ориентацию
  • 3D-вектор перемещения, задающего положение кости в пространстве

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

Скриншот

Ссылки