Оглавление Оглавление .........................................................................................................................1 Введение .............................................................................................................................1 Глава I. Обзор предметной области .................................................................................1 Цель работы ....................................................................................................................3 Постановка задачи .........................................................................................................3 Глава 2. «Матан»................................................................................................................4 Кватернионы ..................................................................................................................4 Математическое представление сочленений ..............................................................4 Анимация ........................................................................................................................5 Прямая кинематика....................................................................................................5 Инверсная кинематика ............................................ Error! Bookmark not defined. RagDoll ........................................................................................................................6 Глава 3. Реализация ...........................................................................................................6 Инструмент для создания анимации (про Maya) ........................................................6 Формат для хранения анимированных моделей (про *.esx) ......................................6 Объект персонажа ..........................................................................................................6 Оптимизация ..................................................................................................................6 Заключение .........................................................................................................................7 Глоссарий ...........................................................................................................................7 Список литературы ............................................................................................................7 Введение Данная работа посвящена проектированию и реализации системы скелетной анимации, а также ее интеграции в систему виртуальной реальности. Глава I. Обзор предметной области 1. 2. 3. Что такое анимация? Классификация. Картинки, много картинок!!! Ссылки на литературу!!! Система виртуальной реальности представляет собой программный комплекс, предназначенный для создания искусственного мира, который передается для восприятия человеком посредством различных технических средств. Обычно созданный мир может реагировать на действия пользователя, передаваемые ему с помощью устройства ввода. Системы виртуальной реальности можно разделить на следующие типы: 1. Игровые приложения. Программы предназначенные для развлечения пользователей. Различаются по жанрам и в зависимости от жанра могут предоставить пользователю полный контроль над одним персонажем (в случае симуляторов, неким реально существующем объектом), группой, армией или даже цивилизацией. 2. Тренажеры. Предназначены для обучения пользователя управлять каким либо транспортом, к примеру, автомобилем, самолетом, танком и т. д. 3. Интерактивные музеи и галереи. Как правило, системы виртуальной реальности состоят из графической системы, звуковой системы, системы ввода вывода, а также физической системы, системы анимации и системы искусственного интеллекта. Системы виртуальной реальности относятся к системам мягкого реального времени. Для обеспечения плавности изображения время расчета кадра не должно превышать 50 мс. А время реакции на действия пользователя не более 100 мс. Некоторые сертификационные центры предъявляют требование на время расчета кадра не более 33 мс. Разработчики современных систем виртуальной реальности стараются приблизить свой продукт к реальности не только по качеству изображения, но и по достоверности физики, искусственного интеллекта, звука и анимации. Анимация в этом списке играет не последнюю роль, ведь если анимация будет не реалистичной, то данный продукт вызовет у пользователя неприязнь. В наше время все больше и больше систем виртуальной реальности приближаются к кинематографичности, чего нельзя достичь без качественной анимации. Добиться высокого качества анимации персонажей без использования скелетной анимации практически невозможно. Анимация – последовательность визуальных изображений, воспроизведенных с определенной частотой. Анимацию для систем виртуальной реальности можно разделить на два вида: 1. Анимация по ключевым кадрам 2. Процедурная анимация Скелетная анимация — способ планирования движения трёхмерных моделей в мультипликации и компьютерных играх. Заключается в том, что мультипликатор или моделер создаёт скелет, представляющий собой как правило, дерево костей, в которой каждая последующая кость «привязана» к предыдущей, то есть повторяет за ней движения и повороты с учётом иерархии в скелете. Далее каждая вершина модели «привязывается» к одной или нескольким костям скелета, в случае привязки к нескольким костям, у каждой кости, влияющей на данную вершину, имеется свой вес. Таким образом, при движении отдельной кости двигаются и все вершины, привязанные к ней. Благодаря этому задача аниматора сильно упрощается, потому что отпадает необходимость анимировать отдельно каждую вершину модели, а достаточно лишь задавать положение и поворот костей скелета. При анимации по ключевым кадрам информация о положении и вращении объекта записывается в определенные моменты времени, называемые ключевыми кадрами. В случае если нужна информация о положении объекта в момент времени находящийся между ключевыми кадрами, то необходимая информация получается путем интерполяции. Анимация по ключевым кадрам создается в специальных редакторах трехмерной графики, среди них наиболее известными являются 3Ds MAX и Maya принадлежащие компании Autodesk. К анимации по ключевым кадрам так же можно отнести MoCap. Суть MoCap заключается в следующем, на человека надевается костюм с датчиками, он производит движения, требуемые по сценарию, встаёт в условленные позы, имитирует действия; данные с датчиков фиксируются камерами и поступают в компьютер, где сводятся в единую трёхмерную модель, точно воспроизводящую движения актёра, на основе которой позже (или в режиме реального времени) создаётся анимация персонажа, как правило, в виде движущегося скелета. Также этим методом воспроизводится мимика актёра (в этом случае на его лице располагаются маркеры, позволяющие фиксировать основные мимические движения). Использование скелетной анимации вместе с анимацией по ключевым кадрам позволяет значительно уменьшить размер файлов хранящих анимацию, так как в файл записываются только модель, в той позе, в которой она была связана со скелетом, сам скелет и информация о перемещении и вращении суставов скелета во времени. Процедурная анимация — автоматически генерируемая анимация в режиме реального времени согласно установленным правилам, законам и ограничениям. В отличие от анимации по ключевым кадрам, когда аниматор вручную определяет каждый кадр и все параметры создаваемой анимации, при процедурной анимации результат может быть в некоторой мере непредсказуем и при каждом запуске может генерировать разнообразную анимацию. Процедурная анимация используется, когда нужен либо уникальный, либо специфичный для данных условий способ анимации. А так же для создания и моделирования системы частиц (дым, огонь, вода), ткани и одежды, динамики твёрдых тел, динамики волос и меха и в особых случаях для анимации гуманоидных и негуманоидных персонажей. В компьютерных играх процедурная анимация часто используется для таких простых вещей, как поворачивание головы персонажа. Также процедурная анимация может использоваться, для создания новой анимации путем синтеза нескольких записанных ранее анимаций по ключевым кадрам. К примеру, у персонажа имеется анимация стрельбы стоя и есть анимация ходьбы, правильно совместив эти анимации можно получить анимацию стрельбы во время ходьбы. Процедурная анимация интенсивно используется в компьютерной игре Spore, в которой созданные игроком существа автоматически анимируются для всех действий, которые должно делать созданное существо: ходьба, бег, плавание, подбирание вещей и т.д. Физика Ragdoll (русск. физика «тряпичной куклы») может считаться видом процедурной анимации. Физика Ragdoll использует физическую систему для создания анимации смерти персонажа и его реалистичного падения на поверхность. При использовании физики Ragdoll персонаж состоит из последовательности связанных твёрдых тел (руки, ноги, торс, голова и т.д.), которые запрограммированы с использованием ньютоновой физики, действующей на них. Благодаря физике Ragdoll могут быть созданы очень реалистические анимации, которые очень сложно создать, используя традиционную предопределённую анимацию. Например, с использованием физики Ragdoll тела персонажей могут катиться или скользить по наклонным поверхностям, переворачиваться, кувыркаться, катиться и т.д., причём каждый раз анимация будет другой. Цель работы Создать и интегрировать систему скелетной анимации в систему виртуальной реальности. Постановка задачи Исследовать существующие методы планирования движения скелета, выбрать из них один. Спроектировать и реализовать на его основе систему скелетной анимации. Интегрировать в систему виртуальной реальности. Реализовать RagDoll. Глава 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 () – кватернион вращения сочленения. 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, то в результате позиция и вращение сочленения будут равны позиции и вращению кадра данной анимации, кадры других анимаций никак не повлияют на результат. Промежуточная позиция сочленения определяется линейной интерполяцией, а вращение сферической интерполяцией кватернионов (SLERP). RagDoll Пара слов о принципах физики твердых тел: обнаружение столкновений, расчет сил взаимодействия и про физические сочленения. Пара слов о построении твердых тел из меша. Глава 3. Реализация Инструмент для создания анимации (про Maya) Почему Maya? Формат для хранения анимированных моделей (про *.esx) Plug-in для Maya Что хранится и в каком виде? Объект персонажа Для чего нужен и что из себя представляет? Игровые события и состояния игрока (прыжок, хотьба, бег и т.д.). Конечный автомат переходов. Блендинг анимаций Инверсная кинематика. Процедурная анимация хотьбы Оптимизация Инструменты: VTune, CodeAnalyst, nVidia PerfHUD – пара слов о каждом Поиск узких мест на CPU Поиск узких мест на GPU Итоги оптимизации: типа был прирост производительности на 100500%. Заключение Глоссарий Список литературы 1. Animation Blending: Achieving Inverse Kinematics and More. Jerry Edsall