Основы
3D-анимации, экспорт скелетной анимации
дата публикации: 9.10.2007
Цели
и задачи статьи: показать способы создания анимации в 3Ds Max 7.0 или
выше (можно использовать и ранние версии, но с оговорками указанными ниже)
и использования ее в Delphi DirectX - играх.
Системные
требования
-
Наличие среды Delphi 6, 7 или выше для компиляции исходного кода, наличие
3Ds Max 7.0 или выше для создания моделей и анимаций;
-
Операционная система Windows 98SE/2000/XP sp2 или выше с установленным
DirectX 8.1 или выше;
-
минимум ПК уровня Pentium III с тактовой частотой 1000 МНz или выше, RAM
128 Mb и выше, 32 Mb Video RAM и выше, DirectX-совместимая звуковая карта,
мышь.
-
Рекомендуется наличие DirectX SDK 8.1 или выше (для изучения DirectX);
-
Терпение, старание и желание создавать компьютерные игры.
Введение
Наверное
нет смысла объяснять что игра без анимации - это всё равно что паровоз
без колес. В современных играх применяется 2D и 3D анимация. И если 2D
анимация у Вас не вызывает особых вопросов значит Вы готовы к изучению
основ 3D анимации.
В
DirectX SDK Вы найдете примеры реализации различных видов анимации
- от 2D до 3D. 2D анимация и способ ее реализации показан в примере
игры из DirectX SDK 8.1 адаптированной автором на Delphi 6-7 - Donuts3D.
Ее можно с успехом применять для анимированных текстур (например
вода, небо, лава и т.п.) и 2D-объектов используемых в 3D-сцене.
Всё что требуется для создания 2D-анимации - это набор кадров и
их последовательное отображение.
От
программиста требуется только выборка нужных кадров из специально подготовленного
для этих целей изображения и показ их на экране в нужной последовательности
с нужной скоростью.
Ситуация
с 3D-анимацией несколько иная. В 3D анимации учавствует уже не плоское
изображение (хотя может учавствовать и оно), а трехмерная модель состоящая
из некоторого количества объектов - вершин, граней, примитивов. Также
как и в случае с 2D анимацией - мы имеем модель находящуюся в разных состояниях
во времени. Эти состояния - кадры (frames). Анимацию можно производить
непрерывно и постепенно меняя состояние нужного объекта в каждом кадре,
а можно и ограничиться так называемыми ключевыми кадрами (keyframes).
Ключевые
кадры - это положения задаваемые для модели аниматором, а все промежуточные
между ними кадры программа просчитывает сама используя линейную или другой
вид интерполяции.
Итак, любая анимация 3D модели - это трансформация (смещение, вращение,
масштабирование - Translate, Rotate, Scale) суб-объектов модели (вершин,
граней, примитивов). Условно можно выделить следующие виды анимации -
-
вершинная (или морфинг) - анимируются трансформации отдельных вершин.
-
объектная - модель создается как набор простых примитивов любой формы
и конфигурации, но таких чтобы каждый из них можно было анимировать простой
трансформацией - смещением, вращением, масштабированием. Таким образом
вершины модели разбиваются на логические группы - в виде отдельных составных
ее частей.
-
скелетная (Skinned Mesh) - относительно новый вид анимации (по крайней
мере для новичков в 3D-программировании) включает в себя концепцию использования
скелета. Суть ее заключается в том, что вся модель снова представляется
как единый меш (Mesh). Внутрь меша внедрена другая - более примитивная
модель называемая скелетом. Скелет состоит из отдельных примитивов называемых
костями (Bones). Каждая вершина привязана к определенной кости (костям).
Степень влияния отдельных костей на вершину называется весовым коэффициентом
(Weights), представляется числом с плавающей точкой (тип Single) и лежит
в диапазоне от 0 до 1. Сумма всех весов костей влияющих на данную вершину
должна составлять 1. Кости совершенно не влияющие на данную вершину имеют
весовой коэффициент для нее 0, влияющие >0. В Direct3D8 на вершину
не должно влиять более 4 костей, а на практике часто встречается влияние
только лишь одной кости. Анимируя скелет мы тем самым анимируем и связанные
с данными костями вершины.
Все
эти виды анимаций применяются в 3D-играх и имеют свои достоинства и недостатки.
Морфинг - этой самый простой вид анимации с точки зрения объема необходимых
вычислений. Но объем получаемых выходных файлов для анимации морфингом
слишком большой. Поэтому для сокращения объема применяют ряд оптимизаций
- уменьшение FPS (Frames Per Second) - частоты кадров, уменьшение количества
вершин модели и различные способы упаковки информации об анимации, применение
межкадровой интерполяции. Объектная анимация более удобна за счет сокращения
объема выходных данных, но требует большей работы с моделями и больше
вычислений. Скелетная анимация в свою очередь требует еще больше предварительной
работы над моделью и еще большего количества вычислений, но объем анимированной
модели значительно сокращается. Кроме того, скелетную анимацию можно использовать
не только для одной, но и для многих других подобных моделей, что еще
больше сокращает объем необходимых медиа-файлов игры.
Примеры
анимаций
Анимация
методом морфинга показана в DirectX SDK в примере приложения Dolphin.
Адаптированное для Delphi приложение представлено в базовых
уроках Delphi DirectX.
Примеры
объектной и скелетной анимации мы с Вами создадим на протяжении данной
статьи.
Создаем
анимированные модели
Сначала
поговорим о том, в какой формат будем экспортировать анимированную модель
из 3Ds Max.
Для
экспорта анимаций в произвольный формат можно воспользоваться возможностями
MAXScript языка встроенного в 3Ds Max или даже написать собственный плагин.
Но для этого Вам понадобится MAX SDK.
Если
будем экспортировать в формат X с использованием плагина из DirectX
SDK 9.0 - DXExtensionsMax.gup то столкнемся
с проблемой того, что объектная анимация экспортируется без проблем
(для Direct3D9), а вот скелетная - увы почему-то не поддерживается
(даже для Direct3D9!). Для анимации вершин нужно выводить каждый
кадр в отдельный файл, а затем все это оптимизировать и упаковывать
в один файл с анимированной цепочкой кадров.
Поэтому
для экспорта скелетной анимации придется писать свой плагин или
экспортер. Можно на первых порах воспользоваться и сторонними экспортерами,
например, Я нашел в Интернете экспортер PandaDXExport.
Этот экспортер устанавливается точно также как и DXExtensionsMax.gup
Но он требует очень аккуратного обращения. К сожалению отсутствует
исходник экспортера. Но это уже личное дело его автора, потому что
экспортер распространяется бесплатно! Подготовка моделей для экспорта
должна вестись очень аккуратно, иначе это приведет к нарушениям
в полученной экспортированной модели. Ниже Мы попытаемся разобраться
в проблемах экспорта с помощью PandaDXExport
и обойти возможные ошибки и сложности.
Для
экспериментов с экспортом Вам понадобится следующая модель - roboo
(60 Кб).
Это
просто "Шагающий двуног" - бокс с вычлененными при помощи
Bevel и Extrude двумя конечностями, с внедренным скелетом из двух
конечностей и базовой кости. Также содержатся объекты Dummy как
захваты для управления анимированием. О моделировании персонажей
будет рассказано в отдельных статьях посвященных урокам
по 3Ds Max. |