Оглавление

advertisement
Оглавление
Оглавление .........................................................................................................................1
Введение .............................................................................................................................1
Глава I. Обзор предметной области .................................................................................1
Цель работы ....................................................................................................................4
Постановка задачи .........................................................................................................4
Глава 2. «Матан»................................................................................................................4
Кватернионы ..................................................................................................................4
Математическое представление сочленений ..............................................................6
Анимация ........................................................................................................................7
Прямая кинематика .......................................................................................................7
Инверсная кинематика ............................................... Error! Bookmark not defined.
Глава 3. Реализация ...........................................................................................................8
Инструмент для создания анимации (про Maya) ........................................................8
Формат для хранения анимированных моделей (про *.esx) ......................................9
Объект персонажа ..........................................................................................................9
RagDoll ...........................................................................................................................9
Оптимизация ..................................................................................................................9
Заключение .......................................................................................................................10
Глоссарий .........................................................................................................................10
Список литературы ..........................................................................................................10
Введение
Данная работа посвящена проектированию и реализации системы скелетной
анимации, а также ее интеграции в систему виртуальной реальности.
Глава I. Обзор предметной области
1.
2.
3.
Что такое анимация? Классификация.
Картинки, много картинок!!!
Ссылки на литературу!!!
Система виртуальной реальности представляет собой программный комплекс,
предназначенный для создания искусственного мира, который передается для восприятия
человеком посредством различных технических средств. Обычно созданный мир может
реагировать на действия пользователя, передаваемые ему с помощью устройства ввода.
Системы виртуальной реальности можно разделить на следующие типы:
1. Игровые приложения. Программы предназначенные для развлечения
пользователей. Различаются по жанрам и в зависимости от жанра могут
предоставить пользователю полный контроль над одним персонажем (в
случае симуляторов, неким реально существующем объектом), группой,
армией или даже цивилизацией.
2. Тренажеры. Предназначены для обучения пользователя управлять каким
либо транспортом, к примеру, автомобилем, самолетом, танком и т. д.
3. Интерактивные музеи и галереи.
Как правило, системы виртуальной реальности состоят из графической системы,
звуковой системы, системы ввода вывода, а также физической системы, системы
анимации и системы искусственного интеллекта.
Системы виртуальной реальности относятся к системам мягкого реального
времени. Для обеспечения плавности изображения время расчета кадра не должно
превышать 50 мс. А время реакции на действия пользователя не более 100 мс. Некоторые
сертификационные центры предъявляют требование на время расчета кадра не более 33
мс.
Разработчики современных систем виртуальной реальности стараются приблизить
свой продукт к реальности не только по качеству изображения, но и по достоверности
физики, искусственного интеллекта, звука и анимации. Анимация в этом списке играет не
последнюю роль, ведь если анимация будет не реалистичной, то данный продукт вызовет
у пользователя неприязнь. В наше время все больше и больше систем виртуальной
реальности приближаются к кинематографичности, чего нельзя достичь без качественной
анимации. Добиться высокого качества анимации персонажей без использования
скелетной анимации практически невозможно.
Анимация – последовательность визуальных изображений, воспроизведенных с
определенной частотой.
Способы задания анимации:
1. Повершинная
2. Скелетная
Анимацию для систем виртуальной реальности можно разделить на два вида:
1. Анимация по ключевым кадрам
2. Процедурная анимация
Повершинная анимация –
Скелетная анимация — способ планирования движения трёхмерных моделей в
мультипликации и компьютерных играх. Заключается в том, что мультипликатор или
моделер создаёт скелет, представляющий собой как правило, дерево костей, в которой
каждая последующая кость «привязана» к предыдущей, то есть повторяет за ней движения
и повороты с учётом иерархии в скелете. Далее каждая вершина модели «привязывается»
к одной или нескольким костям скелета, в случае привязки к нескольким костям, у каждой
кости, влияющей на данную вершину, имеется свой вес. Таким образом, при движении
отдельной кости двигаются и все вершины, привязанные к ней. Благодаря этому задача
аниматора сильно упрощается, потому что отпадает необходимость анимировать отдельно
каждую вершину модели, а достаточно лишь задавать положение и поворот костей
скелета.
При анимации по ключевым кадрам информация о положении и вращении
объекта записывается в определенные моменты времени, называемые ключевыми
кадрами. В случае если нужна информация о положении объекта в момент времени
находящийся между ключевыми кадрами, то необходимая информация получается путем
интерполяции двух ближайших кадров. Анимация по ключевым кадрам создается в
специальных редакторах трехмерной графики, среди них наиболее известными являются
3Ds MAX и Maya принадлежащие компании Autodesk.
К анимации по ключевым кадрам так же можно отнести MoCap. Суть MoCap
заключается в следующем, на человека надевается костюм с датчиками, он производит
движения, требуемые по сценарию, встаёт в условленные позы, имитирует действия;
данные с датчиков фиксируются камерами и поступают в компьютер, где сводятся в
единую трёхмерную модель, точно воспроизводящую движения актёра, на основе которой
позже (или в режиме реального времени) создаётся анимация персонажа, как правило, в
виде движущегося скелета. Также этим методом воспроизводится мимика актёра (в этом
случае на его лице располагаются маркеры, позволяющие фиксировать основные
мимические движения).
Использование скелетной анимации вместе с анимацией по ключевым кадрам
позволяет значительно уменьшить размер файлов хранящих анимацию, так как в файл
записываются только модель, в той позе, в которой она была связана со скелетом, сам
скелет и информация о перемещении и вращении суставов скелета во времени. Для
создания анимации по ключевым кадрам с использованием скелетной анимации
аниматору необходимо, связать скелет с моделью которую нужно анимировать, настроить
веса сочленений на вершины, установить нужную позу скелета путем вращения и
перемещения сочленений, сохранить текущие позиции и вращения сочленений в кадре,
изменить текущее время и снова установить нужную позу и так далее, в итоге получается
последовательность кадров, каждый из которых хранит скелет в определенной позе.
Процедурная анимация — автоматически генерируемая анимация в режиме
реального времени согласно установленным правилам, законам и ограничениям. В
отличие от анимации по ключевым кадрам, когда аниматор вручную определяет каждый
кадр и все параметры создаваемой анимации, при процедурной анимации результат может
быть в некоторой мере непредсказуем и при каждом запуске может генерировать
разнообразную анимацию.
Процедурная анимация используется, когда нужен либо уникальный, либо
специфичный для данных условий способ анимации. А так же для создания и
моделирования системы частиц (дым, огонь, вода), ткани и одежды, динамики твёрдых
тел, динамики волос и меха и в особых случаях для анимации гуманоидных и
негуманоидных персонажей.
В компьютерных играх процедурная анимация часто используется для таких
простых вещей, как поворачивание головы персонажа. Также процедурная анимация
может использоваться, для создания новой анимации путем синтеза нескольких
записанных ранее анимаций по ключевым кадрам. К примеру, у персонажа имеется
анимация стрельбы стоя и есть анимация ходьбы, правильно совместив эти анимации
можно получить анимацию стрельбы во время ходьбы. Процедурная анимация
интенсивно используется в компьютерной игре Spore, в которой созданные игроком
существа автоматически анимируются для всех действий, которые должно делать
созданное существо: ходьба, бег, плавание, подбирание вещей и т.д.
Физика Ragdoll (русск. физика «тряпичной куклы») может считаться видом
процедурной анимации. Физика Ragdoll использует физическую систему для создания
анимации смерти персонажа и его реалистичного падения на поверхность. При
использовании физики Ragdoll персонаж состоит из последовательности связанных
твёрдых тел (руки, ноги, торс, голова и т.д.), которые запрограммированы с
использованием ньютоновой физики, действующей на них. Благодаря физике Ragdoll
могут быть созданы очень реалистические анимации, которые очень сложно создать,
используя традиционную предопределённую анимацию. Например, с использованием
физики Ragdoll тела персонажей могут катиться или скользить по наклонным
поверхностям, переворачиваться, кувыркаться, катиться и т.д., причём каждый раз
анимация будет другой.
Цель работы
Создать и интегрировать систему скелетной анимации в систему виртуальной
реальности.
Постановка задачи
Исследовать существующие методы планирования движения скелета, выбрать из
них один.
Спроектировать и реализовать на его основе систему скелетной анимации.
Интегрировать в систему виртуальной реальности. Реализовать RagDoll.
Глава 2. «Матан»
Кватернионы
Для представления вращения в пространстве сочленений, в проекте используются
кватернионы.
Кватернион – гиперкомплексное число имеющее одну действительную единицу 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. Умножение кватерниона на скаляр
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) кватернион – это кватернион, при умножении на который
произведение дает нулевое вращение.
q 1 
q*
q
2
;
q  q 1  q 1  q  (1, 0);
7. Скалярное произведение:
q q '  w  w'  x  x '  y  y '  z  z ' ;
Скалярное произведение дает косинус половины угла между двумя кватернионами
умноженный на их длину. Соответственно скалярное произведение двух единичных
кватернионов даст косинус половины угла между двумя ориентациями. Угол между
кватернионами это угол поворота из 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).
iq 
(q *sin((1  t )* )  q ' *sin(t * ))
;
sin( )
Математическое представление сочленений
Сочленение – это объект, представляющий собой позицию и вращение в
пространстве относительно своего родительского сочленения. Каждое сочленение может
иметь только одно родительское сочленение. Все сочленения и их связи в виде дерева в
совокупности образуют скелет. В скелете выделяется корневое сочленение, у этого
сочленения нет родительского сочленения, его позиция и вращение определяют позицию
и вращение всего скелета в глобальном пространстве координат.
Сочленение скелета можно описать следующим кортежом1:
jx  ( P, q, dP, dq, j);
где:
P, q – позиция и вращение сочленения в мировом пространстве.
dp, dq – позиция и вращение относительно родительского сочленения.
j – родительское сочленение.
Корневое сочленение будет выглядеть следующим образом:
j0  (id , id , id , id , j0 );
где:
id – вектор и кватернион равные (0, 0, 0, 1).
Математические операторы, для работы с сочленениями:
orient () – кватернион вращения сочленения.
bind _ orient () – кватернион вращения в момент связывания объекта со скелетом.
position() – позиция сочленения или вершины.
bind _ position() – позиция сочленения или вершины в момент связывания объекта
со скелетом.
Получить позицию сочленения в мировом пространстве можно повернув позицию
dp согласно кватерниону вращения родительского сочленения в мировом пространстве
orient(j) и добавив позицию родительского сочленения P, это выглядит следующим
образом:
P  dP  orient ( j)  position( j);
Получить вращение сочленения в мировом пространстве можно умножив do на
вращение родительского сочленения orient(j):
q  dq  orient ( j);
Для корректного построения скелета необходимо начать обход дерева сочленений с
первых дочерних сочленений корневого сочленения, после чего перейти к их дочерним
сочленениям и т.д.
На рисунке №* показано дерево всех сочленений скелета персонажа.
Здесь следует отметить, что именно такое представление вводится для удобства представления
сочленений, которые используются в Maya.
1
Вершину можно описать следующим образом:
•
V  P, n, j1 , j2 , j3 , j4 , w1 , w2 , w3 , w4 
где:
P, n – позиция и нормаль вершины.
jx, wx – сочленение к которому привязана вершина и вес этого сочленения на
данную вершину. Сумма всех весов сочленений влияющих на вершину должна быть равна
единице.
Скининг это определение положения вершины относительно влияющих на нее
сочленений, согласно весам. Выглядит это следующим образом:
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 – матрица трансляции и матрица вращения соответственно, переводят
позицию вершины из пространства объекта в пространство сочленения в момент
связывания.
T2, R2 – матрица трансляции и матрица вращения соответственно, переводят
позицию вершины из пространства сочленения в пространство объекта.
Анимация
Прямая кинематика
При прямой кинематике любое изменение позиции или вращения сочленения
передается по цепи сочленений дальше вниз и перемещает все дочерние сочленения.
Инверсная кинематика отличается от прямой кинематики тем, что вначале определяются
позиция и вращение дочернего сустава, а потом это изменение передается дальше вверх
по цепи сочленений на родительское сочленение и далее.
Пара слов о том, как хранится.
Анимация по ключевым кадрам хранится в виде упорядоченных по времени
кадров, которые хранят позицию и вращение каждого сочленения скелета. Если
необходимо получить кадр в момент времени, находящийся между двумя ключевыми
кадрами, то нужный кадр можно получить путем интерполяции двух ближайших кадров.
Пара слов про блендинг.
Блендинг скелетной анимации это определение промежуточных позиции и
вращения сочленений между кадрами разных анимаций в соответствии с весом каждой
анимации. Вес анимации определяет какой вклад внесет кадр данной анимации в
результирующие позицию и вращение сочленения. Сумма всех весов анимаций должна
быть равна единице, отсюда следует. Если вес какой либо анимации равен 1, то в
результате позиция и вращение сочленения будут равны позиции и вращению кадра
данной анимации, кадры других анимаций никак не повлияют на результат.
Промежуточная позиция сочленения определяется линейной интерполяцией.
n
P   ti  Pi ;
i 1
n
t
i 1
i
 1;
где:
P – позиция сочленения полученная в результате блендинга n-го количества
анимаций.
Pi – позиция сочленения в кадре i-ой анимации.
ti – вес i-ой анимации.
Промежуточное вращение сочленения определяется сферической линейной
интерполяцией кватернионов (SLERP).
q  quat _ slerp (q1 , quat _ slerp (q2 ,...,
t2
),
n
t1
t t
i2
i
);
n
i 1
i
где:
q – вращение сочленения полученное в результате блендинга n-го количества
анимаций.
qi – вращение сочленения в кадре i-ой анимации.
ti – вес i-ой анимации.
Глава 3. Реализация
Инструмент для создания анимации (про Maya)
Почему Maya?
Maya это программный комплекс предназначенный для создания компьютерной
графики и анимации. Главная особенность Maya это ее открытость, которая позволяет
сторонним разработчикам изменять и настраивать ее под свои нужды, а встроенный язык
MEL (Maya Embedded Language – встроенный язык Maya) позволяет значительно
упростить задачу создания и дополнения уже существующего интерфейса. Эта
особенность Maya и послужила основной причиной ее выбора для проекта.
Формат для хранения анимированных моделей (про *.esx)
Для экспорта моделей и анимации созданной в Maya, был разработан специальный
плагин, который позволяет сохранять всю необходимую для проекта информацию о
модели, скелете и анимации.
Что хранится и в каком виде?
Все данные экспортируются в формат *.esx, который был специально создан для
проекта. Для представления данных используется XML (eXtensible Markup Language —
расширяемый язык разметки). Структура формата следующая:
Скелет
Объект персонажа
Для чего нужен и что из себя представляет?
Игровые события и состояния игрока (прыжок, хотьба, бег и т.д.). Конечный автомат переходов.
Представление анимаций в движке
Блендинг анимаций
RagDoll
Пара слов о принципах физики твердых тел: обнаружение столкновений, расчет сил взаимодействия и про
физические сочленения.
Вся физика в проекте рассчитывается с помощью PhysX API.
6DOF
Пара слов о построении твердых тел из меша.
PhysX API может строить выпуклые сетки треугольников, которые можно
использовать для представления частей тела, все что нужно это передать функции
NxCookConvexMesh массив вершин, после чего соединив полученные сетки с помощью
6DOF Joint (6 Degrees of Freedom Joint – сочленение с 6 степенями свободы) получаем
тряпичную куклу. Все что необходимо делать далее, это своевременно обновлять позиции
и вращения сочленений скелета.
Оптимизация
Инструменты: VTune, CodeAnalyst, nVidia PerfHUD – пара слов о каждом
Intel VTune – приложение позволяющее производить анализ производительности
программ на базе x86-процессоров.[]
AMD CodeAnalyst – приложение позволяющее производить анализ
производительности программ на базе x86-процессоров.
nVidia PerfHUD – это мощный анализатор производительности для Direct3D
приложений в реальном времени.
Поиск узких мест на CPU
Поиск узких мест на GPU
Итоги оптимизации: типа был прирост производительности на 100500%.
Заключение
Глоссарий
Список литературы
1. Animation Blending: Achieving Inverse Kinematics and More. Jerry Edsall
2. NVIDIA PhysX SDK 2.8 Documentation
3. Maya2008 API Documentation
Download