Информатика и образование
  Мобильная версия сайта            
               
[Главная] [Новости]
[Статьи]
[Проекты]
[Ссылки]
[Автор]
               
    [Архив новостей]        
               
  [Форум] на форуме можно задать вопрос, посмотреть ответы на часто задаваемые вопросы  
       
  Здравствуйте! Вы попали на информационно-образовательный сайт посвященный информатике, информационным технологиям и компьютерным играм. Подробнее о целях и задачах сайта в разделе Главная. [English version of this page here...]    
       
  [Базовые уроки по DirectX] [Основы DirectMusic на Delphi] [Основы DirectInput8 на Delphi] [Основы DirectSound8 на Delphi]    
  [Разработка компьютерной игры] [Пример игры Donuts3D] [Delphi DirectX]    
       
 

Основы 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-анимации - это набор кадров и их последовательное отображение.

От программиста требуется только выборка нужных кадров из специально подготовленного для этих целей изображения и показ их на экране в нужной последовательности с нужной скоростью.

пример 2D-анимации - шагающий человечек

Ситуация с 3D-анимацией несколько иная. В 3D анимации учавствует уже не плоское изображение (хотя может учавствовать и оно), а трехмерная модель состоящая из некоторого количества объектов - вершин, граней, примитивов. Также как и в случае с 2D анимацией - мы имеем модель находящуюся в разных состояниях во времени. Эти состояния - кадры (frames). Анимацию можно производить непрерывно и постепенно меняя состояние нужного объекта в каждом кадре, а можно и ограничиться так называемыми ключевыми кадрами (keyframes).

пример 3D анимации - шагающий RoBoo

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

Итак, любая анимация 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.

   
       
  Итак, предположим, что Вы уже скачали архив roboo и распаковали например, в папку SkinnedMeshExperim, установили плагин PandaDXExport.    
       
  Откройте файл roboo_anim_go.max из 3DS Max 7 (или выше) и попробуйте экспортировать его командой File > Export > Panda DirectX (название этого пункта будет зависеть от того, что вы пропишете в конфигурационном файле plugin.ini в папке установленного 3Ds Max).    
       
  Экспорт скелетной анимации Пандой    
       
  Когда Вы введете подходящее имя и нажмете кнопку Save (Сохранить) перед Вами появится окно параметров экспорта Панды. Задайте следующие параметры экспорта -    
       
     
       
     
       
     
       
     
       
  И нажмите ОК. При этом модель должна благополучно экспортироваться в файл X с именем, которое Вы указали.    
       
  Для проверки результата экспорта можно воспользоваться утилитой MeshView из DirectX SDK 8.1 или DirectX Viewer из DirectX SDK 9.    
       
  Кроме того, поскольку целью нашего экспорта является использование анимаций в Delphi DirectX 3D-игре, мы проверим проигрывание экспортированной анимации в приложении SkinnedMesh. (1,6 Mb).    
       
  Для компиляции и исполнения Вам понадобятся файлы из архива с ОБЩИМ КОДОМ (772 Кб). Замечания по компиляции и исполнению читайте в readme.txt вложенный внутри данного архива!    
       
 

В папке архива SkinnedMesh после распаковки вы найдете папку Media. В ней содержатся три примера анимации - nx4.x, tiny.x и robooPDX.x.

nx4 - подлодка из проекта Тайны Морских Глубин: Операция Тайфун, показана анимация объектов - вращающихся винтов;

tiny.x - оригинал из DirectX SDK 8.1, 9;

robooPDX.x - то, что вы должны получить в процессе экспорта модели из файла roboo_anim_go.max

   
       
 

Для проверки данных анимированных моделей откройте файл проекта SkinnedMesh.dpr из среды Delphi, откройте unit SkinnedMeshUnit.pas, в классе CMyD3DApplication найдите реализацию функции InitDeviceObjects найдите строчку кода m_szPath := 'Media\tiny.x';

И задайте другую модель из имеющихся - nx4.x или robooPDX.x

Перекомпилируйте приложение и запустите полученный исполнимый файл. Если получаете ошибку об отсутствии файла D3DX81ab.dll скопируйте этот файл из папки с ОБЩИМ КОДОМ в папку с исполнимым файлом SkinnedMesh.exe и снова запустите приложение SkinnedMesh.exe.

   
       
  пример работающего приложения    
       
  Roboo экспортировался в Х без проблем. Остановимся теперь на экспорте более сложных, но близких к реальным игровым приложениям примерах моделей.    
       
  Модели должны быть очень аккуратно подготовлены к экспорту. Что это значит? Это значит что любые огрехи в анимации или моделировании непременно скажутся на качестве выходной модели если вообще не приведут к ее порче. Чтобы продемонстрировать Вам неверный экспорт и ошибки скачайте архив с некорректной моделью - uncorrect_model (115 Кб).    
       
  Распакуйте архив в какую-нибудь папку и откройте файл human_skeleton_animate_go.max из 3Ds Max. Попробуйте экспортировать в формат X экспортером PandaDXExport.    
       
  Полученную модель проверьте в приложении SkinnedMesh или утилитами MeshView из DirectX SDK 8.1 или DirectX Viewer из DirectX SDK 9.    
       
  пример некорректной модели    
       
  Налицо сразу 3 ошибки - часть головы оторвана и движется вместе с рукой; периодически мелькает нулевая позиция меша - с разведенными в стороны руками; отсутствует текстура.    
       
  Корни данной некорректной модели лежат в основе ее создания. Чтобы избежать создания таких ошибок рассмотрим процесс подготовки модели и ее скелета более подробно.    
       
  [далее]    
       
  [Базовые уроки по DirectX] [Основы DirectMusic на Delphi] [Основы DirectInput8 на Delphi] [Основы DirectSound8 на Delphi]    
  [Разработка компьютерной игры] [Пример игры Donuts3D] [Delphi DirectX]    
       
 

Обновления и новости о развитии Delphi DirectX проекта
смотри на сайтах:

http://www.megainformaticsite.pochta.ru

http://www.megainformatic.boom.ru

http://www.megainformatic.narod.ru

 

   
       
     
 

по всем вопросам пишите на megainformatic@mail.ru или оставьте сообщение на форуме

 
     
   Обмен ссылками  
     
     
             
 
 
         
(с) МЕГА ИНФОРМАТИК 2006-2009
Hosted by uCoz