- •Введение
- •Глава 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
- •Предметный указатель
390 |
Глава 13 |
Итак, интегрирование вперед является не чем иным как масштабированием векторов. Просто, не так ли? Единственное, о чем я не упомянул, это то, что вам необходимо принять во внимание массы точек. Помните, чем большую массу имеет объект, тем большую силу необходимо приложить, чтобы сдвинуть его. Я имею ввиду момент, т. е. то, что комбинированная сила точки (представленная вектором силы) должна быть масштабирована на массу, чтобы вычислить фактически применяемое ускорение. Масштабирование вектора силы на значение массы (на самом деле на значение 1/масса) при интегрировании замечательно с этим справляется.
ClothPoints[Num].m_vecVelocity += TimeElapsed * \
ClothPoints[Num].m_OneOverMass * \
ClothPoints[Num].m_vecForce;
Подытожив, необходимо умножить вектор силы каждой точки на массу (1/масса) и прошедшее время, после чего добавить результирующий вектор к вектору скорости точки. Вот отрывок кода, который выполняет все это для каждой точки одежды:
// TimeElapsed = количество обрабатываемых секунд for(DWORD i=0;i<NumPoints;i++) {
// Интегрировать скорость ClothPoints[Num].m_vecVelocity += TimeElapsed * \
ClothPoints[Num].m_OneOverMass * \ ClothPoints[Num].m_vecForce;
// Интегрировать положение ClothPoints[Num].m_vecPos += TimedElapsed * \
ClothPoints[Num].m_vecVelocity;
}
Вот и все, мой друг! Мы успешно вычислили скорость и обновили положение каждой точки меша одежды! Далее необходимо взять данные точек и использовать их для воссоздания и визуализации меша одежды.
Воссоздание и визуализация меша одежды
Т. к. точки одежды изменили свое положение, необходимо перестроить начальный меш так, чтобы изменения были заметны. Т. к. вы уже загрузили исходный меш из .X файла в объект ID3DXMesh, все, что остается сделать, это заблокировать буфер вершин меша, сохранить в него координаты точек и пересчитать нормали (если исходный меш их использует).
Еще раз создадим универсальную структуру, содержащую только вектор. Этот вектор используется для получения доступа к данным координат вершин меша.
Имитирование одежды и анимация мешей мягких тел
typedef struct { D3DXVECTOR3 vecPos;
} sVertex;
После этого необходимо просто заблокировать буфер вершин меша и просмотреть все точки одежды (опять!), сохраняя их координаты.
// Заблокировать буфер вершин меша BYTE *pVertices;
pClothMesh->LockVertexBuffer(0, (BYTE**)&pVertices);
for(DWORD i=0;i<NumPoints;i++) {
//Преобразовать указатель на вершину sVertex *pVertex = (sVertex*)pVertices;
//Сохранить координаты вершины *pVertex = ClothPoints[i].m_vecPos;
//Перейти к следующей вершине pVertices += VertexStride;
}
// Разблокировать буфер вершин pClothMesh->UnlockVertexBuffer();
После того как вы воссоздали меш, вы можете визуализировать его обычным образом, просмотрев список материалов меша и используя функцию ID3DXMesh::DrawSubset для визуализации каждого поднабора. Если вы хотите повторно использовать исходный меш, например, для сброса имитации одежды, необходимо восстановить исходные координаты его вершин.
Восстановление исходного меша
Вы, наверное, заметили, что данные точек одежды очень динамичны. Не существует простого способа восстановить начальную ориентацию каждой точки меша одежды. Зачем вообще необходимо восстанавливать исходный меш? Возможно, чтобы начать заново моделирование или использовать меш одежды в его исходном состоянии.
Самым простым способом восстановления данных точек исходного меша одежды является добавление еще одного вектора в класс cClothPoint.
class cClothPoint {
D3DXVECTOR3 m_vecOriginalPos; // Начальные координаты D3DXVECTOR3 m_vecPos; // Трехмерные координаты точки float m_Mass; // Масса точки (0=прикрепленная)
float m_OneOverMass; // 1 / Массу (0=прикрепленная к месту) D3DXVECTOR3 m_vecForce; // Вектор силы (ускорения) D3DXVECTOR3 m_vecVelocity; // Вектор скорости
};
392 |
Глава 13 |
Дополнительный вектор (vecOriginalPos) хранит начальные координаты точек одежды. При создании массива точек одежды убедитесь, что вы сохранили начальное положение в этом новом векторе.
//...После загрузки точек одежды в массив for(DWORD i=0;i<NumPoints;i++)
ClothPoints[i].m_vecOriginalPos = ClothPoints[i].m_vecPos;
Когда вы захотите восстановить данные исходных точек одежды, просто скопируйте данные их этого нового вектора в вектор положения точки.
for(DWORD i=0;i<NumPoints;i++)
ClothPoints[i].m_vecPos = ClothPoints[i].m_vecOriginalPos;
Использование начального положения замечательно подходит для восстановления данных исходного меша и также полезно при определении расстояния между текущим и начальным положением точек, как при моделировании мешей мягких тел, которые будут рассмотрены далее в этой главе.
А пока, просто продолжим улучшение имитации одежды, добавив дополнительные пружины в меш, таким образом улучшая стабильность одежды при имитировании.
Добавление дополнительных пружин
До этого момента я говорил о пружинах, как если бы они были созданы из ребер меша. На самом деле это очень неаккуратный подход к созданию пружин из данных меша, если достоверное моделирование одежды является вашей целью. Например, посмотрите на рис. 13.4. Мы думаем, что показанные пружины будут скреплять меш.
На рис. 13.4 все выглядит замечательно, пока вы не запустите моделирование. Проблемой является то, что меш одежды использует ребра многоугольников
вкачестве пружин, что может вызвать его сворачивание по прошествии некоторого времени, как если бы он был сделан из очень тонкого материала. Это может быть приемлемым для большинства случаев, но как насчет тех случаев, когда необходимо, чтобы одежда была жестче и с трудом изменяла форму?
Весь секрет в том, что чем больше пружин содержит меш, тем жестче становится одежда. Все правильно - добавив еще несколько пружин, вы можете заставить одежду мяться и изгибаться вместо того, чтобы распадаться на непрочные группы вершин. Конечно же, важным является положение пружин, так что посмотрите еще раз на рис. 13.4, чтобы понять, что необходимо сделать. На рис. 13.5 вы видите новый меш,
вкоторый добавлено несколько новых пружин.
Имитирование одежды и анимация мешей мягких тел |
393 |
Точки одежды
Пружины
одежды
Грани полигона
Рис. 13.4. Набор пружин, созданный из ребер многоугольников изображенного меша
Соединения пружин
Рис. 13.5. Теперь меш одежды имеет набор соединенных между собой пружин, которые расположены на его граня
Не забудьте, что пружины сближают или отдаляют две точки друг от друга, в зависимости от расстояния между ними. Внимательно посмотрев на рис. 13.5, вы можете увидеть, что правильно расположив несколько дополнительных пружин, вы можете усилить структуру одежды, потому что эти пружины будут вынуждать перемещаться