- •Введение
- •Глава 1. Подготовка к изучению книги
- •Установка DirectX SDK
- •Выбор отладочных или рабочих версий библиотек
- •Настройка вашего компилятора
- •Установка директорий DirectX SDK
- •Привязывание к библиотекам DirectX
- •Установка используемого по умолчанию состояния символа
- •Использование вспомогательного кода книги
- •Использование вспомогательных объектов
- •Проверка вспомогательных функций
- •Двигаясь дальше по книге
- •Глава 2. Синхронизация анимации и движения
- •Использование движения, синхронизированного по времени
- •Считывание времени в Windows
- •Анимирование с использованием временных меток
- •Перемещение, синхронизированное со временем
- •Движение вдоль траекторий
- •Создание анализатора маршрутов .X файла
- •Создание внутриигровых кинематографических последовательностей
- •Посмотрите демонстрационные программы
- •TimedAnim
- •TimedMovement
- •Route
- •Cinematic
- •Глава 3. Использование формата файла .X
- •Работа с .X шаблонами и объектами данных
- •Определение шаблонов
- •Работа со стандартными шаблонами DirectX
- •Открытие .X файла
- •Перечисление объектов данных
- •Получение данных объекта
- •Создание класса .X анализатора
- •Загрузка мешей с использованием D3DX
- •Загрузка мешей, используя анализатор .X
- •Загрузка скелетных мешей
- •Загрузка анимации из .X
- •Загрузка специализированных данных из .X
- •Посмотрите демонстрационные программы
- •ParseFrame
- •Глава 4. Работа со скелетной анимацией
- •Начало скелетной анимации
- •Использование структур скелетов и иерархий костей
- •Использование скелетной структуры и скелетного меша
- •Загрузка иерархий из .X
- •Изменение положения костей
- •Обновление иерархии
- •Работа со скелетными мешами
- •Загрузка скелетных мешей из .X
- •Создание контейнера вторичного меша
- •Сопоставление костей фреймам
- •Обновление скелетного меша
- •Визуализация скелетных мешей
- •Глава 5. Использование скелетной анимации, основанной на ключевых кадрах
- •Использование наборов скелетных анимаций, основанных на ключевых кадрах
- •Использование ключей при анимации
- •Работа с четырьмя типами ключей
- •Считывание данных анимации из .X файлов
- •Прикрепление анимации к костям
- •Обновление анимации
- •Посмотрите демонстрационные программы
- •Глава 6. Комбинирование скелетных анимаций
- •Комбинирование скелетных анимаций
- •Соединение преобразований
- •Улучшение объектов скелетной анимации
- •Посмотрите демонстрационные программы
- •Глава 7. Создание кукольной анимации
- •Работа с физикой твердого тела
- •Создание твердого тела
- •Расположение и ориентирование твердых тел
- •Обработка движения твердых тел
- •Использование сил для создания движения
- •Соединение твердых тел с помощью пружин
- •Обеспечение обнаружения столкновений и ответной реакции
- •Создание систем кукольной анимации
- •Определение состояния твердого тела
- •Хранение костей
- •Создание класса управления куклой
- •Создание данных костей
- •Вычисление ограничивающего параллелепипеда кости
- •Установка сил
- •Объединение костей
- •Обработка столкновений
- •Восстановление соединений костей
- •Перестроение иерархии
- •Посмотрите демонстрационные программы
- •Глава 8. Работа с морфирующей анимацией
- •Морфинг в действии
- •Определение исходного и целевого меша
- •Морфинг мешей
- •Создание морфированного меша при помощи обработки
- •Визуализация морфированных мешей
- •Расчленение наборов
- •Создание морфирующего вершинного шейдера
- •Посмотрите демонстрационные программы
- •Глава 9. Использование морфирующей анимации, основанной на ключевых кадрах
- •Использование наборов морфируемой анимации
- •Создание шаблонов .X для морфируемой анимации
- •Загрузка данных морфируемой анимации
- •Визуализации морфированного меша
- •Получение данных морфируемого меша из альтернативных источников
- •Посмотрите демонстрационные программы
- •Глава 10. Комбинирование морфированных анимаций
- •Комбинирование морфированных анимаций
- •Использование базового меша в комбинированных морфированных анимациях
- •Вычисление разностей
- •Комбинирование разностей
- •Создание вершинных шейдеров комбинированного морфирования
- •Использование вершинного шейдера морфируемого комбинирования
- •Посмотрите демонстрационные программы
- •Глава 11. Морфируемая лицевая анимация
- •Основы лицевой анимации
- •Использование комбинированного морфирования
- •Использования фонем для речи
- •Создание лицевых мешей
- •Создание базового меша
- •Создание выражений лица
- •Создание мешей визем
- •Создание анимационных последовательностей
- •Создание последовательностей фонем
- •Использование анализатора файлов .X для последовательностей
- •Проигрывание лицевых последовательностей со звуком
- •Использование DirectShow для звука
- •Синхронизация анимации со звуком
- •Зацикливание воспроизведения звуков
- •Посмотрите демонстрационные программы
- •Глава 12. Использование частиц в анимации
- •Работа с частицами
- •Основы
- •Рисование частиц с помощью квадратных полигонов
- •Работа с точечными спрайтами
- •Улучшения визуализации частиц при помощи вершинных шейдеров
- •Оживление частиц
- •Передвижение частиц при помощи скорости
- •Использование интеллекта при обработке
- •Создание и уничтожение частиц
- •Управление частицами с помощью класса
- •Использование излучателей в проектах
- •Создание движков частиц в вершинных шейдерах
- •Посмотрите демонстрационные программы
- •Глава 13. Имитирование одежды и анимация мешей мягких тел
- •Имитация одежды в ваших проектах
- •Получение данных одежды из мешей
- •Приложение сил для создания движения
- •Воссоздание и визуализация меша одежды
- •Восстановление исходного меша
- •Добавление дополнительных пружин
- •Загрузка данных масс и пружин из .X файла
- •Создание анализатора .X данных одежды
- •Работа с обнаружением столкновений и реакцией на них
- •Определение объектов столкновений
- •Обнаружение и реакция на столкновения
- •Создание класса меша одежды
- •Использование мешей мягких тел
- •Восстановление мешей мягких тел
- •Посмотрите демонстрационные программы
- •Глава 14. Использование анимированных текстур
- •Использование анимации текстур в ваших проектах
- •Работа с преобразованиями текстур
- •Создание преобразования текстур
- •Установка матриц преобразования текстуры
- •Использование преобразования текстур в проектах
- •Использование файлов видео в качестве текстур
- •Импорт видео при помощи DirectShow
- •Создание специализированного фильтра
- •Работа со специализированным фильтром
- •Создание менеджера анимированных текстур
- •Окончание современной анимации
- •Веб-сайты
- •Рекомендуемые книги
- •DirectX 9.0 SDK
- •GoldWave Demo
- •Paint Shop Pro Trial Version
- •TrueSpace Demo
- •Microsoft Agent and LISET
- •Предметный указатель
144 |
Глава 4 |
Обновление скелетного меша
Когда ваша скелетная структура находится в желаемой позе, пришло время обновить (или восстановить) скелетный меш, чтобы он соответствовал ей. Прежде чем восстанавливать скелетный меш, вам необходимо убедиться, что контейнер вторичного меша создан и иерархия фреймов обновлена. Для повторения того, как создавать контейнер мешей, обратитесь к разделу "Создание контейнера вторичного меша", находящемуся ранее в этой главе. Чтобы освежить ваши воспоминания о том, как обновлять иерархию фреймов смотрите раздел "Обновление иерархии" ранее в этой главе. После того как вы их вспомните, вы можете продолжить.
Для обновления скелетного меша вы должны сначала заблокировать буферы вершин скелетного и вторичного меша. Это является очень важным, потому что DirectX возьмет данные вершин скелетного меша, наложит преобразования костей и запишет результирующие данные вершин в объект вторичного меша.
Однако сначала вам необходимо скопировать преобразования их фреймов в массив матриц (pBoneMatrices), хранимый в контейнере мешей. В то же самое время вам необходимо скомбинировать преобразования с обратным преобразованием костей. Обратное преобразование костей ответственно за перемещение вершин меша к его начальному положению, до того как вы примените фактические преобразования. Чтобы лучше понять это, посмотрите на рис. 4.4
На рис. 4.4 меш составлен их трех костей (фреймов) и некоторого количества вершин. Для применения преобразования к какому либо фрейму вам необходимо передвинуть вершины, принадлежащие фрейму, в начальное положение, а потом накладывать преобразования.
Вы перемещаете вершины относительно начального положения меша, прежде чем применять преобразования, т. к. матрица вращения просто поворачивает вершины относительно начального положения. Если бы вращали вершину, принадлежащую кости, вершина бы вращалась относительно начального положения меша, а не соединения костей. Например, если бы ваше тело было мешем, и вы бы согнули локоть, вершины, образующие меш руки, будут вращаться относительно локтя, а не центра вашего тела. После передвижения вершин к центру меша накладывается преобразование (чтобы поворот вершин соответствовал повороту костей) и, наконец, преобразовывается в положение.
Обычно, преобразования костей обратной матрицы хранятся в .X файле при использовании программы трехмерного моделирования для создания мешей. Если же это информация не содержится в .X файле, вы можете вычислить ее сами, сначала обновив иерархию фреймов, после чего обратив комбинированное преобразование фреймов, используя функцию D3DXMatrixInverse. Вот небольшой пример:
Работасоскелетнойанимацией |
145 |
Рис. 4.4. Вершины могуттолько вращаться вокруг начального положения меша. Прежде чем вы примените преобразования костей, вам необходимо создать преобразование, которое перемещало бывершиныкначальномуположениюмеша
//pRoot = корневой объект D3DXFRAME_EX
//pMesh = объект D3DXMESHCONTAINER_EX, содержащий данные меша
//Обновление иерархии фреймов
pRoot->UpdateHierarchy();
// Перебрать все кости для вычисления обратной матрицы for(DWORD i=0;i<NumBones;i++) {
//Получить преобразование, используя матрицу кости D3DXMATRIX matBone = (*pMesh->ppFrameMatrices);
//Обратить матрицу
D3DXMatrixInverse(&matBone, NULL, &matBone) ;
// Сохранить где-нибудь матрицу обратного преобразования кости
}
Однако вместо того чтобы вычислять все эти матрицы обратного преобразования костей самостоятельно, вы можете использовать объект скелетного меша для получения этой информации. Вызвав ID3DXSkinInfo::GetBoneOffsetMatrix, вы получите указатель на обратную матрицу преобразования кости. Умножив эту матрицу на матрицу преобразования фрейма, вы получите необходимый результат.
Используя только что приобретенные знания, переберите все кости, получите их обратное преобразование, скомбинируйте его с преобразованием фрейма и сохраните результат в массиве pBoneMatrices.
for(DWORD i=0;i<pSkinInfo->GetNumBones();i++) {
// Установить обратное преобразование кости pMesh->pBoneMatrices[i]=(*pSkinInfo->GetBoneOffsetMatrix(i));
146 |
Глава 4 |
// Наложить преобразование фрейма if(pMesh->ppFrameMatrices[i])
pMesh->pBoneMatrices[i] *= (*pMesh->ppFrameMatrices[i]);
}
После того как вы скопировали преобразования костей в массив pBoneMatrices, вы можете обновлять скелетные меши, сначала заблокировав буферы вершин для скелетного и вторичного меша.
//pSkinMesh = контейнер скелетного меша
//pMesh = контейнер вторичного меша
//Заблокировать буферы вершин мешей void *SrcPtr, *DestPtr;
pSkinMesh->LockVertexBuffer(D3DLOCK_READONLY, (void**)&SrcPtr); pMesh->LockVertexBuffer(0, (void**)&DestPtr);
После того как вы заблокировали буферы вершин, вам необходимо вызвать ID3DXSkinInfo::UpdateSkinnedMesh, чтобы наложить все преобразования костей на вершины и записать результирующие данные в контейнер вторичного меша. После чего просто разблокируйте буферы вершин, и вы готовы к визуализации!
//pSkinInfo = информационный объект скелетного меша
//Обновить скелетный, меш используя заданные преобразования pSkinInfo->UpdateSkinnedMesh(pBoneMatrices, NULL, \
SrcPtr, DestPtr);
// Разблокировать буферы вершин мешей pSkinMesh->UnlockVertexBuffer(); pMesh->UnlockVertexBuffer();
Визуализация скелетных мешей
Пришло время визуализировать вторичный меш и показать миру каково играть с силой ...силой скелетной анимации и скелетных мешей. Вам просто необходимо использовать функции отрисовки обычных мешей для визуализации вторичного меша. Перебрав все материалы, установите материал и текстуру и вызовете функцию ID3DXMesh::DrawSubset. Продолжайте выполнять вышеперечисленные действия, пока все наборы не будут отрисованы.
Если вы используете объект D3DXMESHCONTAINER_EX из главы 1, этот код замечательно визуализирует вторичный меш.
//pMesh - объект D3DXMESHCONTAINER_EX с данными материалов
//pMeshToDraw = указатель на вторичный меш
for(DWORD i=0;i<pMesh->NumMaterials;i++) {
Работасоскелетнойанимацией |
147 |
// Установить материал и текстуру
pD3DDevice->SetMaterial(&pMesh->pMaterials[i].MatD3D); pD3DDevice->SetTexture(0, pMesh->pTextures[i]);
// Нарисовать набор меша pMeshToDraw->DrawSubset(i);
}
Вот и все, что касается основ скелетной анимации! В следующих нескольких главах вы научитесь использовать скелетную анимацию для работы с заранее вычисленными анимациями, основанными на ключевых кадрах, комбинированием анимаций и кукольной анимацией. Наслаждайтесь!
Посмотритедемонстрационные программы
Не так быстро! Вы же хотите узнать о демонстрационных программах этой главы, расположенных на компакт-диске? Как показано на рис. 4.5, меш SkeletalAnim иллюстрирует изученные в этой главе загрузку скелетного меша (меш "Tiny.x", поставляемый с примерами DirectX SDK) и его визуализацию.
Рис. 4.5. Познакомьтесь с Tiny, скелетным мешем женщины Microsoft. Она создана из одного меша и соответствующей иерархии невидимых костей.
148 |
Глава 4 |
Программы на компакт-диске
В директории, соответствующей главе 4 этой книги, вы обнаружите единственный проект, иллюстрирующий работу со скелетной анимацией:
•SkeletalAnim. Эта демонстрационная программа иллюстрирует использование скелетных структур и скелетных мешей. Она расположена в \BookCode\Chap04\SkeletalAnim.