3. Глава 2. Математические основы скелетной анимации

advertisement
Оглавление
1. Введение ........................................................................................................................2
2. Глава I. Обзор предметной области .............................................................................3
2.1 Цель работы ..............................................................................................................7
2.2 Постановка задачи ...................................................................................................7
3. Глава 2. Математические основы скелетной анимации.............................................8
3.1 Кватернионы ............................................................................................................8
3.2 Математическое представление сочленений ......................................................11
3.3 Анимация ................................................................................................................14
4. Глава 3. Реализация ...................................................................................................116
4.1 Проект ...................................................................................................................118
4.2 Диаграмма потока данных ....................................................................................16
4.3 Инструмент для создания анимации ....................................................................17
4.4 Формат для хранения анимированных моделей .................................................18
4.5 Скелет .....................................................................................................................20
4.6 RagDoll ....................................................................................................................21
4.7 Объект персонажа .................................................................................................23
5. Заключение ...................................................................................................................26
6. Список литературы ......................................................................................................27
1. Введение
Данная работа посвящена проектированию и реализации системы
скелетной анимации, а также ее интеграции в систему виртуальной
реальности.
Система виртуальной реальности Eclipse Engine разрабатывалась
студенческим клубом разработчиков компьютерных игр на протяжении 1.5
лет.
На рис.1 можно увидеть кадр из тестовой сцены, просчитываемой
системой виртуальной реальности Eclipse Engine.
Рис.1 Кадр тестовой сцены Eclipse Engine
2
2. Глава I. Обзор предметной области
Система виртуальной реальности представляет собой программный
комплекс, предназначенный для создания искусственного мира, который
передается для восприятия человеком посредством различных технических
средств. Обычно созданный мир может реагировать на действия
пользователя, передаваемые ему с помощью устройства ввода.
Системы виртуальной реальности можно разделить на следующие
типы:
1. Игровые приложения. Программы предназначенные для
развлечения пользователей. Различаются по жанрам и в
зависимости от жанра могут предоставить пользователю полный
контроль над одним персонажем (в случае симуляторов, неким
реально существующем объектом), группой, армией или даже
цивилизацией.
2. Тренажеры. Предназначены для обучения пользователя
управлять каким либо транспортом, к примеру, автомобилем,
самолетом, танком и т. д.
3. Интерактивные музеи и галереи.
Как правило, системы виртуальной реальности состоят из графической
системы, звуковой системы, системы ввода вывода, а также физической
системы, системы анимации и системы искусственного интеллекта.
Системы виртуальной реальности относятся к системам мягкого
реального времени. Для обеспечения плавности изображения время расчета
кадра не должно превышать 50 мс. А время реакции на действия
пользователя не более 100 мс. Некоторые сертификационные центры
предъявляют требование на время расчета кадра не более 33 мс.
3
Разработчики современных систем виртуальной реальности стараются
приблизить свой продукт к реальности не только по качеству изображения,
но и по достоверности физики, искусственного интеллекта, звука и
анимации. Анимация в этом списке играет не последнюю роль, ведь если
анимация будет не реалистичной, то данный продукт вызовет у пользователя
неприязнь. В наше время все больше и больше систем виртуальной
реальности приближаются к кинематографичности, чего нельзя достичь без
качественной анимации. Добиться высокого качества анимации персонажей
без использования скелетной анимации практически невозможно.
Анимация – последовательность визуальных изображений,
воспроизведенных с определенной частотой.
Способы задания анимации:
1. Повершинная
2. Скелетная
Анимацию для систем виртуальной реальности можно разделить на два
вида:
1. Анимация по ключевым кадрам
2. Процедурная анимация
Повершинная анимация — способ задания анимации, при котором
каждой вершине отдельно задается ее позиция. Данный способ редко
используется с анимацией по ключевым кадрам, к примеру, плавное
изменение формы объекта.
Скелетная анимация — способ планирования движения трёхмерных
моделей в мультипликации и компьютерных играх. Заключается в том, что
мультипликатор или моделер создаёт скелет, представляющий собой как
правило, дерево костей, в котором каждая последующая кость «привязана» к
предыдущей, то есть повторяет за ней движения и повороты с учётом
4
иерархии в скелете. Далее каждая вершина модели «привязывается» к одной
или нескольким костям скелета, в случае привязки к нескольким костям, у
каждой кости, влияющей на данную вершину, имеется свой вес. Таким
образом, при движении отдельной кости двигаются и все вершины,
привязанные к ней. Благодаря этому задача аниматора сильно упрощается,
потому что отпадает необходимость анимировать отдельно каждую вершину
модели, а достаточно лишь задавать положение и поворот костей скелета.
При анимации по ключевым кадрам информация о положении и
вращении объекта записывается в определенные моменты времени,
называемые ключевыми кадрами. В случае если нужна информация о
положении объекта в момент времени находящийся между ключевыми
кадрами, то необходимая информация получается путем интерполяции двух
ближайших кадров. Анимация по ключевым кадрам создается в специальных
редакторах трехмерной графики, среди них наиболее известными являются
3Ds MAX и Maya принадлежащие компании Autodesk.
К анимации по ключевым кадрам так же можно отнести MoCap
(Motion Capture – захват движения). Суть MoCap заключается в следующем,
на человека надевается костюм с датчиками, он производит движения,
требуемые по сценарию, встаёт в условленные позы, имитирует действия;
данные с датчиков фиксируются камерами и поступают в компьютер, где
сводятся в единую трёхмерную модель, точно воспроизводящую движения
актёра, на основе которой позже (или в режиме реального времени) создаётся
анимация персонажа, как правило, в виде движущегося скелета. Также этим
методом воспроизводится мимика актёра (в этом случае на его лице
располагаются маркеры, позволяющие фиксировать основные мимические
движения).
Использование скелетной анимации вместе с анимацией по ключевым
кадрам позволяет значительно уменьшить размер файлов хранящих
5
анимацию, так как в файл записываются только модель, в той позе, в которой
она была связана со скелетом, сам скелет и информация о перемещении и
вращении суставов скелета во времени. Для создания анимации по ключевым
кадрам с использованием скелетной анимации аниматору необходимо,
связать скелет с моделью которую нужно анимировать, настроить веса
сочленений на вершины, установить нужную позу скелета путем вращения и
перемещения сочленений, сохранить текущие позиции и вращения
сочленений в кадре, изменить текущее время и снова установить нужную
позу и так далее, в итоге получается последовательность кадров, каждый из
которых хранит скелет в определенной позе.
Процедурная анимация — автоматически генерируемая анимация в
режиме реального времени согласно установленным правилам, законам и
ограничениям. В отличие от анимации по ключевым кадрам, когда аниматор
вручную определяет каждый кадр и все параметры создаваемой анимации,
при процедурной анимации результат может быть в некоторой мере
непредсказуем и при каждом запуске может генерировать разнообразную
анимацию.
Процедурная анимация используется, когда нужен либо уникальный,
либо специфичный для данных условий способ анимации. А так же для
создания и моделирования системы частиц (дым, огонь, вода), ткани и
одежды, динамики твёрдых тел, динамики волос и меха и в особых случаях
для анимации гуманоидных и негуманоидных персонажей.
В компьютерных играх процедурная анимация часто используется для
таких простых вещей, как поворачивание головы персонажа. Также
процедурная анимация может использоваться, для создания новой анимации
путем синтеза нескольких записанных ранее анимаций по ключевым кадрам.
К примеру, у персонажа имеется анимация стрельбы стоя и есть анимация
ходьбы, правильно совместив эти анимации можно получить анимацию
6
стрельбы во время ходьбы. Процедурная анимация интенсивно используется
в компьютерной игре Spore, в которой созданные игроком существа
автоматически анимируются для всех действий, которые должно делать
созданное существо: ходьба, бег, плавание, подбирание вещей и т.д.
Физика Ragdoll (русск. физика «тряпичной куклы») может считаться
видом процедурной анимации. Физика Ragdoll использует физическую
систему для создания анимации смерти персонажа и его реалистичного
падения на поверхность. При использовании физики Ragdoll персонаж
состоит из последовательности связанных твёрдых тел (руки, ноги, торс,
голова и т.д.), которые запрограммированы с использованием ньютоновой
физики, действующей на них. Благодаря физике Ragdoll могут быть созданы
очень реалистические анимации, которые очень сложно создать, используя
традиционную предопределённую анимацию. Например, с использованием
физики Ragdoll тела персонажей могут катиться или скользить по наклонным
поверхностям, переворачиваться, кувыркаться и т.д., причём каждый раз
анимация будет другой.
2.1 Цель работы
Создать и интегрировать систему скелетной анимации в систему
виртуальной реальности.
2.2 Постановка задачи
Исследовать существующие методы планирования движения скелета.
Спроектировать и реализовать на его основе систему скелетной
анимации. Интегрировать в систему виртуальной реальности. Реализовать
RagDoll.
7
3. Глава 2. Математические основы скелетной анимации
3.1 Кватернионы
Для представления вращения в пространстве сочленений, в проекте
используются кватернионы.
Кватернион – гиперкомплексное число, имеющее одну действительную
единицу 1 и три мнимых единицы i, j, k.
Кватернионы можно представить в векторном виде:
q  ( w, v );
где:
w – скаляр, то есть вещественное число.
v – вектор трехмерного пространства.
Также кватернионы можно определить как формальную сумму:
q  w  x  i  y  j  z  k;
i 2  j 2  k 2  i  j  k  1;
где:
w, x, y, z – вещественные числа.
i, j, k – мнимые единицы.
Для кватернионов справедливо следующее:
1. Сумма кватернионов определяется следующим образом
q  q '  w  w'  ( x  x ' )  i  ( y  y ' )  j  ( z  z ' )  k ;
Смысл операции сложения можно описать как "смесь" вращений, т.е.
мы получим вращение, которое находится между q и q'
2. Умножение кватерниона на скаляр
8
s  q  s  w  s  x  i  s  y  j  s  z  k;
3. Умножение двух кватернионов
q  q '  (w  w'  v  v ' , v  v  w  v '  w'  v );
Умножение двух кватернионов аналогично умножению двух матриц
поворота. Итоговый кватернион представляет собой комбинацию вращений
— объект повернули на q', а затем на q (если смотреть из глобальной системы
координат).
Кватернионы не коммутативны по умножению, как и матрица
вращения: qq' не равно q'q (это свойство вращений, а не их представления).
4. Модуль (magnitude), или "длина" кватерниона:
q  w2  x2  y 2  z 2 ;
Кватернион, длина которого равна 1, называют единичным
кватернионом.
5. Сопряженный кватернион – задает вращение обратное данному:
q*  ( w, v );
6. Инверсный (inverse) кватернион – это кватернион, при умножении на
который произведение дает нулевое вращение.
1
q 
q*
q
2
;
q  q 1  q 1  q  (1, 0);
7. Скалярное произведение:
q q '  w  w'  x  x '  y  y '  z  z ' ;
Скалярное произведение дает косинус половины угла между двумя
кватернионами умноженный на их длину. Соответственно скалярное
9
произведение двух единичных кватернионов даст косинус половины угла
между двумя ориентациями. Угол между кватернионами это угол поворота
из q в q' (по кратчайшей дуге).
8. Вращение точки.
Любую точку P можно представить в кватернионной форме записи:
P  (0, p );
p  ( x, y, z );
Поворот вокруг любой оси, проходящей через начало координат,
выполняется с помощью единичного кватерниона с такими скалярной и
векторной частями:

w  cos ;
2

v  u  sin ;
2
где:
u – единичный вектор, направленный по заданной оси вращения.
 – заданный угол поворота вокруг этой оси.
Поворот точки выполняется с помощью следующей кватернионной
операции:
P'  q  P  q 1;
9. Сферическая линейная интерполяция SLERP (spherical linear
interpolation).
(q *sin((1  t )* )  q ' *sin(t * ))
iq 
;
sin( )
где:
10
 – угол между кватернионами q и q ' .
3.2 Математическое представление сочленений
Сочленение – это объект, представляющий собой позицию и вращение
в пространстве относительно своего родительского сочленения. Каждое
сочленение может иметь только одно родительское сочленение. Все
сочленения и их связи в виде дерева в совокупности образуют скелет. В
скелете выделяется корневое сочленение, у этого сочленения нет
родительского сочленения, его позиция и вращение определяют позицию и
вращение всего скелета в глобальном пространстве координат.
Сочленение скелета можно описать следующим кортежом1:
jx  ( P, q, dP, dq, j);
где:
P, q – позиция и вращение сочленения в мировом пространстве.
dP, dq – позиция и вращение относительно родительского сочленения.
j – родительское сочленение.
Корневое сочленение будет выглядеть следующим образом:
j0  (id , id , id , id , j0 );
где:
id – вектор и кватернион равные (0, 0, 0, 1).
Математические операторы, для работы с сочленениями:
orient () – кватернион вращения сочленения.
Здесь следует отметить, что именно такое представление вводится для удобства представления
сочленений, которые используются в Maya.
1
11
bind _ orient () – кватернион вращения в момент связывания объекта
со скелетом.
position() – позиция сочленения или вершины.
bind _ position() – позиция сочленения или вершины в момент
связывания объекта со скелетом.
quat _ slerp(q1 , q2 , t ) – сферическая линейная интерполяция двух
кватернионов с параметром интерполяции t.
Получить позицию сочленения в мировом пространстве можно
повернув позицию dp согласно кватерниону вращения родительского
сочленения в мировом пространстве orient(j) и добавив позицию
родительского сочленения P, это выглядит следующим образом:
P  dP  orient ( j)  position( j);
Получить вращение сочленения в мировом пространстве можно
умножив do на вращение родительского сочленения orient(j):
q  dq  orient ( j);
Для корректного построения скелета необходимо начать обход дерева
сочленений с первых дочерних сочленений корневого сочленения, после чего
перейти к их дочерним сочленениям и т.д.
Вершину можно описать следующим образом:
•
V  P, n, j1 , j2 , j3 , j4 , w1 , w2 , w3 , w4 
где:
P, n – позиция и нормаль вершины.
jx, wx – сочленение к которому привязана вершина и вес этого
сочленения на данную вершину. Сумма всех весов сочленений влияющих на
вершину должна быть равна единице.
12
Скининг это определение положения вершины относительно
влияющих на нее сочленений, согласно весам. Выглядит это следующим
образом:
4
P   orient ( J i )   bind _ orient ( J i )  (bind _ position(V )  bind _ position( J i ))   position( J i )   wi
i 1
Здесь позиция вершины в момент связывания сначала переводится в
пространство сочленения, позиция и вращение, которой также берутся в
момент связывания, далее полученная позиция переводится обратно в
пространство объекта, но уже согласно новым позиции и вращению
сочленения, после чего она умножается на вес данного сочленения. Сумма
всех полученных таким образом векторов даст в итоге новую позицию
вершины.
Расчет нового положения вершины никак не зависит от расчета нового
положения любой другой вершины того же объекта, что дает возможность
перенести все вычисления с CPU на GPU. Так как GPU имеет высокую
степень параллелизма и умеет выполнять векторные вычисления на
несколько порядков быстрее, чем CPU.
Для ускорения расчетов на GPU, все действия, осуществляемые над
позицией вершины можно представить в виде умножения позиции вершины
на матрицу. Матрицы подготавливаются на CPU и передаются в вершинный
шейдер.
P  bind _ position(V )  M;
M  T1  R1  T2  R 2 ;
где:
T1, R1 – матрица трансляции и матрица вращения соответственно,
переводят позицию вершины из пространства объекта в пространство
сочленения в момент связывания.
13
T2, R2 – матрица трансляции и матрица вращения соответственно,
переводят позицию вершины из пространства сочленения в пространство
объекта.
3.3 Анимация
Прямая кинематика
При прямой кинематике любое изменение позиции или вращения
сочленения передается по цепи сочленений дальше вниз и перемещает все
дочерние сочленения. Инверсная кинематика отличается от прямой
кинематики тем, что вначале определяются позиция и вращение дочернего
сустава, а потом это изменение передается дальше вверх по цепи сочленений
на родительское сочленение и далее.
Блендинг скелетной анимации это определение промежуточных
позиции и вращения сочленений между кадрами разных анимаций в
соответствии с весом каждой анимации. Вес анимации определяет какой
вклад внесет кадр данной анимации в результирующие позицию и вращение
сочленения. Сумма всех весов анимаций должна быть равна единице, отсюда
следует. Если вес какой либо анимации равен 1, то в результате позиция и
вращение сочленения будут равны позиции и вращению кадра данной
анимации, кадры других анимаций никак не повлияют на результат.
Промежуточная позиция сочленения определяется линейной
интерполяцией.
P  Pb  ( Pi  Pb )  ti ;
0  ti  1;
где:
P – позиция сочленения полученная в результате интерполяции.
Pb – предыдущая позиция сочленения.
14
Pi – позиция сочленения в кадре i-ой анимации.
ti – вес i-ой анимации.
Промежуточное вращение сочленения определяется сферической
линейной интерполяцией кватернионов (SLERP).
q  quat _ slerp (q1 , quat _ slerp (q2 ,...,
t2
),
n
t1
t t
i 1
i
);
n
i 1
i
где:
q – вращение сочленения полученное в результате блендинга n-го
количества анимаций.
qi – вращение сочленения в кадре i-ой анимации.
ti – вес i-ой анимации.
15
4. Глава 3. Реализация
4.1 Проект
Проект системы виртуальной реальности Eclipse Engine, для которого
разрабатывается система скелетной анимации, состоит из следующих систем:
 Графической
 Физической
 Геометрической
 Игровой
 Звуковой
 Скриптовой
Графическая система используется для вывода графики на экран, в
проекте для вывода графических примитивов используется DirectX API. Для
написания шейдеров используется HLSL.
Вся физика в проекте рассчитывается с помощью PhysX API. PhysX это
мощная система расчета физики, обеспечивающая реалистичную физику в
режиме реального времени.
Для вывода звука используется FMOD. FMOD это программная
аудиобиблиотека, которая позволяет проигрывать музыкальные файлы
различных форматов на разных платформах.
В скриптовой системе используется Lua. Lua это интерпретируемый язык
программирования, в данном проекте он необходим для более быстрой и гибкой
настройки параметров сцен и персонажей.
16
4.2 Диаграмма потока данных
Рис.2 диаграмма потока данных системы анимации
На рис.2 представлена диаграмма потока данных применительно к
системе скелетной анимации.
В Maya создается модель, скелет и анимация, которые с помощью
плагина конвнртируются в файл формата .esx, этот файл подается на вход
геометрической системы, модели в этом файле сохраняются в виде объектов
класса ETriMesh. В игровой системе находятся объекты персонажа, каждый
объект хранит все анимации персонажа и ссылку на меш хранящийся в
геометрической системе. Из системы ввода на вход игровой системы
поступают сигналы о нажатии клавиш клавиатуры пользователем или о
изменении положения мыши. В соответствии с тем какой сигнал поступил
объекту персонажа, он выбирает одну из анимаций или же соединяет
несколько и передает информацию о положении и вращении сочленений в
геометрическую систему. В геометрической системе на основе поступившей
информации из игровой системы формируется массив вершин, который
передается в графическую систему, там он обрабатывается и выводится на
экран. В том случае когда необходим RagDoll, объект персонажа послыает на
вход в геометрическую систему индексы, положение и вращение сочленений
для которых необходимо создать лимбы, геометрическая система создает
массив вершин который подается на вход физической системы. В
физической системе из входного массива вершин строятся лимбы.
17
Полученные лимбы соединяются сочленениями и в итоге получается
тряпичная кукла. В соответствии с законами физики высчитывается новое
положение сочленений и лимбов. Полученные таким способом положение и
вращение сочленений передаются на вход игровой системы.
4.3 Инструмент для создания анимации
В качестве инструмента для создания трехмерных моделей и анимации
была выбрана программа Autodesk Maya.
Maya это программа предназначенная для создания компьютерной
графики и анимации. Главная особенность Maya это ее открытость, которая
позволяет сторонним разработчикам изменять и настраивать ее под свои
нужды, а встроенный язык MEL (Maya Embedded Language – встроенный
язык Maya) позволяет значительно упростить задачу создания и дополнения
уже существующего интерфейса. Эта особенность Maya и послужила
основной причиной ее выбора для проекта.
На рис.3 представлена тестовая сцена проекта, созданная в Maya.
18
Рис.3 Пример сцены созданной в Maya.
4.4 Формат для хранения анимированных моделей
Для экспорта моделей и анимации созданной в Maya, был разработан
специальный плагин, который позволяет сохранять всю необходимую для
проекта информацию о модели, скелете и анимации.
Все данные экспортируются в формат *.esx, который был специально
создан для проекта. Для представления данных используется XML
(eXtensible Markup Language — расширяемый язык разметки).
Структура формата приведена ниже:
<scene>
<scene_node name="world" class="" affector="" position="x y z w" orient="x y z w">
<scene_node name="Model1" class="mesh" affector="" position="x y z w" orient="x y z w">
<mesh>
<vertices>
<vertex p="x y z" n="x y z" c0="1 0 0 1" uv0="u v" jw="w1 w2 w3 w4" ji="j1 j2 j3 j4"/>
...
</vertices>
19
<triangles>
<triangle inds="0 1 2"/>
...
</triangles>
<shading_groups>
<shading_group start="0" num="4" shader="*color7F7F7FFF"/>
</shading_groups>
<joints>
<joint name="joint1" parent="-1" p="x y z" orient="x y z w" def_p="x y z" def_orient="x
y z w" bind_orient="x y z w" bind_pos="x y z" cons_min="α β γ" cons_max=" α β γ "/>
<pos_curve>
<key time="1" value=" x y z w "/>
...
</pos_curve>
<orient_curve>
<key time="1" value=" x y z w "/>
...
</orient_curve>
...
</joints>
</mesh>
</scene_node>
</scene_node>
</scene>
Плагин проходит целиком всю сцену Maya, состоящую из узлов и,
найдя узел соответствующий мешу разделяет его на три отдельные группы,
первая группа это <vertices> здесь хранится информация о каждой вершине
входящей в состав меша, вторая группа это <triangles> в ней хранятся
индексы вершин, из которых состоит каждый треугольник, в третьей группе
<shading_groups> хранится информация о том к какой группе треугольников
какую текстуру или цвет применять. Еще перед разбиением меша плагин
проверяет, нет ли у данного меша связи со скинкластером (skincluster), это
будет означать, что данный меш связан со скелетом. Если связь есть, то
плагин проходит весь скелет, записывая всю необходимую информацию о
каждом сочленении в дополнительную четвертую группу <joints>. У каждого
сочленения есть две подгруппы это <pos_curve> и <orient_curve>, в этих
группах хранятся треки анимации для данного сочленения. Далее вместе с
20
разбиением на вершины, для каждой вершины записываются веса и индексы
сочленений, которые влияют на данную вершину.
4.5 Скелет
В проекте скелет представляет собой дерево взаимосвязанных
сочленений. У каждого сочленения есть две переменных для представления
позиции и вращения сочленения в пространстве, строка хранящая имя
данного сочленения и переменная хранящая индекс родительского
сочленения.
Для упрощения смешивания анимаций скелет разделен на два канала,
первый канал это сочленение «Hip» и все его дочерние сочленения, второй
канал это сочленение «Tail_Bone» и все его дочерние сочленения. В итоге
первый канал представляет собой всю нижнюю часть персонажа, т. е. ноги, а
второй канал всю верхнюю часть, т. е. туловище, руки и голову. Подобное
разделение позволяет проигрывать отдельно анимацию для первого канала и
отдельно проигрывать другую анимацию для второго канала.
На рис.4 можно увидеть сочленения двух разных каналов, первый
канал выделен белым цветом, а второй зеленым.
21
Рис.4 Скелет созданный в Maya для проекта.
4.6 RagDoll
У PhysX API есть множество различных сочленений [2], решено было
использовать 6DOF Joint (6 Degrees of Freedom Joint – сочленение с 6
степенями свободы) из-за его гибкости в настройке. В отличие от
сочленений проекта, 6DOF сочленение представляет из себя два сочленения,
каждое из которых присоединяется к одному из двух объектов,
представляющих из себя части тела модели которую необходимо
анимировать. Эти два сочленения разделяются на родительское и дочернее
В PhysX API есть несколько примитивов [2] которыми можно
представить части тела, к примеру, капсулой, но тут встает вопрос
регулирования их размеров и если с определением длинны капсулы проблем
не возникает, это просто расстояние между двумя сочленениями кости, то с
определением диаметра возникает проблема. В итоге было решено
воспользоваться выпуклой сеткой треугольников (Convex Mesh). PhysX API
может строить выпуклые сетки треугольников, которые можно использовать
22
для представления частей тела, все что нужно это передать функции
NxCookConvexMesh массив вершин, после чего соединить полученные сетки
с помощью 6DOF Joint и получить в итоге тряпичную куклу. Все что
необходимо делать далее, это своевременно обновлять позиции и вращения
сочленений скелета.
Для создания массива вершин необходимого для создания выпуклой
сетки была написана специальная функция CreateLimb, этой функции в
качестве параметров передается индекс сочленения для которого необходимо
создать лимб и вес, все вершины у которых вес данного сочленения больше
заданного и будут необходимым массивом, но прежде чем вернуть
полученный таким образом массив функция переводит все вершины данного
массива в пространство сочленения. Благодаря тому что все вершины
массива переводятся в пространство сочленения, вращение и позиция
полученного с помощью такого массива лимба будут представлять из себя
позицию и вращение сочленения для которого создавался лимб.
На рис.5 можно увидеть “тряпичную куклу” созданную с помощью
выпуклых сеток треугольников.
23
Рис.5 RagDoll
4.7 Объект персонажа
Объект персонажа контролирует текущее состояние в соответствии с
которым он определяет какую конкретно анимацию необходимо проигрывать
в данный момент, а также хранит все анимации для данного персонажа и
отдельный кадр (anim_frame) который хранит результат работы блендера.
Персонаж может находиться в следующих состояниях:
1. Бег вперед
2. Бег назад
3. Бег вправо
4. Бег влево
5. Прыжок
6. Бездействие
При этом персонаж может находиться в нескольких состояниях
одновременно, например, персонаж может атаковать во время бега.
24
Анимация в проекте представляет собой следующую структуру:
struct anim_info_s {
EName anim_name;
IPxTriMeshAnim animation;
bool is_cyclic;
bool is_played;
bool head;
bool torso;
bool legs;
float time;
float max_time;
float duration;
float transition_time_up;
float transition_time_down;
float anim_weight;
uint state;
};
где:
anim_name – имя анимации.
animation – указатель на массив кадров, каждый кадр хранит в себе
скелет персонажа в определенной позе.
is_cyclic –переменная определяющая как надо проигрывать анимацию,
циклически или определенное время.
is_played – переменная определяющая надо ли проигрывать анимацию.
head, torso, legs – переменные определяющие для каких частей
персонажа нужно проигрывать анимацию.
time – время в соответствии с которым из массива кадров выбирается
нужный кадр.
max_time – максимальное время которое может длится анимация.
duration – время проигрывания анимации.
25
transition_time_up – время за которое вес анимации должен подняться с
0 до anim_weight.
transition_time_down – время за которое вес анимации должен
уменьшиться с anim_weight до 0.
anim_weight – вес текущей анимации, определяет долю вклада данной
анимации в итоговый фрейм.
state – состояние текущей анимации, анимация можетначинаться,
проигрываться и заканчиваться.
Блендинг анимации происходит следующим образом, блендер
проходит поочередно все анимации пропуская те, у которых флаг is_played
опущен, суммируя веса анимаций. Далее блендер второй раз проходит все
анимации , вес каждой анимации сохраняется в отдельную переменную и
делится на сумму всех анимаций, это сделано для того чтобы сумма всех
весов анимаций была равна 1. Если выставить одной анимации вес
превосходящий все остальные веса в несколько раз, то эта анимация будет
проигрываться так как будто это единственная анимация, которая
проигрывается в данный момент. Далее в зависимости от состояния
анимации определяется ее конечный вес. В конце блендер смешивает кадр
anim_frame с кадром текущей анимации, который был выбран в соответствии
с параметром текущего времени анимации и с весом определенным выше.
26
5. Заключение
В результате была спроектирована и реализована система анимации
человекоподобного персонажа для системы виртуальной реальности.
В ходе работы был сделан плагин для экспорта моделей, скелетов и
анимации из Maya, осуществлен RagDoll, а так же были получены
навыки создания скелетов, скинига и анимации в Maya.
Тем не менее, осталось еще множество путей усовершенствования и
развития системы, к примеру такие как:
– Инверсная кинематика (IK).
– Полностью процедурная анимация персонажа на базе IK.
– Перенос вычислений на GPU.
27
6. Список литературы
1. Jerry Edsall , «Animation Blending: Achieving Inverse Kinematics and More», 2002.
2. NVIDIA PhysX SDK 2.8 Documentation
3. Maya2008 API Documentation
4. Дж. Кундерт-Гиббс, М. Ларкинс, Д. Деракшани, Э. Кунзендорф «Освоение Maya
8.5» - М.: Диалектика, 2007.
5. Дональд Херн, М. Паулин Бейкер, «Компьютерная графика и стандарт OpenGL,
третье издание» - М.: Издательский дом «Вильямс», 2005.
6. David Henry, «MD5Mesh and MD5Anim files formats», 2005.
7. Jonathon Blow, «Hacking Quaternion’s», Game Developer Magazine, 2002.
8. Ken Shoemake, «Animating Rotations with Quaternion Curves», SIGGRAPH '85, pp.
245-254.
9. DirectX Documentation for C++ (DirectX SDK August 2009).
28
Download