Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
DirectX. Продвинутая Анимация (2004) [rus].pdf
Скачиваний:
335
Добавлен:
16.08.2013
Размер:
8.39 Mб
Скачать

188

Глава7

На самом деле есть несколько способов убедиться, что ограничивающие параллелепипеды соединяются в тех же точках, что и соответствующие им кости. Метод, который я покажу вам в этой главе, использует пружины для возвращения ограничивающего параллелепипеда при каждом его перемещении. На рис. 7.4 вы можете видеть несколько отсоединившихся ограничивающих параллелепипедов, летающих по сцене, которые расчленяют бедный персонаж на части. Между каждым параллелепипедом вы можете видеть пружину, которая используется для соединения частей тела вместе.

Рис. 7.4. Набор пружин позволяет вернуть отсоединившиеся параллелепипеды

После перемещения параллелепипедов и использования пружин для восстановления точек соединения вам необходимо скопировать ориентацию параллелепипеда в иерархию костей, обновить скелетный меш и визуализировать его. Видите, как просто!

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

Работа с физикой твердого тела

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

Создание кукольной анимации

189

Хорошо, хорошо, но как это связано с физикой твердого тела? Ну, часть "твердого тела" означает, что ваши меши полагаются твердыми объектами - параллелепипедами, представляющими кости, которые никогда не меняют форму и никогда не проникают в пространство других объектов. Поэтому ограничивающие параллелепипеды, представляющие кости, являются твердыми объектами.

Изучение физики твердого тела (часто называемой динамикой твердого тела) отслеживает движение твердых объектов, включая действие сил, таких как гравитации и трения. Взаимодействие также играет важную роль, потому что твердые объекты, представляющие части тела персонажа, должны отскакивать друг от друга и от окружающей территории.

Прежде чем вы возьмете учебник по физике позвольте сказать, что на самом деле физика твердого тела не так сложна, как кажется. Конечно, в ней есть множество формул и вычислений, от которых даже у учителя математики кошмары, но после того как вы разберетесь, не будет никаких причин для волнения.

На самом деле я буду излагать материал физики твердого тела шаг за шагом, чтобы вам было понятнее, начав с создания твердого объекта.

Создание твердого тела

Физика твердого тела - это система слежения за движением и взаимодействие твердых объектов. Для упрощения положим, что твердыми объектами являются трехмерные ограничивающие параллелепипеды, содержащие кости скелетной структуры. В пространстве параллелепипеды состоят из восьми точек (по одной в каждом углу).

Точки являются аналогами вершин, параллелепипед является аналогом меша. Используя простые преобразования (вращение и перемещение), вы можете расположить параллелепипед и его восемь угловых точек где угодно в трехмерном мире. Каждый параллелепипед с его угловыми точками имеет собственное место в системе твердых тел. Параллелепипед представляет точки как целое - что влияет на параллелепипед, то влияет и на точки. Таким образом, если вы переместите параллелепипед, точки переместятся вместе с ним, вам нет необходимости заботиться о точном расположении точек внутри него.

Что касается точек, они не просто помогают определять размер ограничивающего параллелепипеда, они также помогают определять столкновения. Видите ли, если хотя бы одна из этих точек лежит внутри пространства другого объекта, тогда можно сказать, что объекты сталкиваются, и вам необходимо обрабатывать их. Это сильно

190

Глава 7

облегчает нахождение столкновений; вместо того чтобы проверять каждую вершину меша, попадает ли она в объект, вы можете проверять точки ограничивающего параллелепипеда. Я вернусь к обнаружению столкновений немного позднее; а пока я хочу продолжить определение твердого тела.

Как я уже упоминал, каждый ограничивающий параллелепипед состоит из восьми точек. Для определения положения этих точек вам необходимо полностью окружить каждую кость (и ее вершины, и точки соединения костей) в скелетной структуре параллелепипедом. Я покажу, как это делать далее в этой главе, когда мы начнем использовать твердые тела в анимациях; а пока предположим, что имеем параллелепипед заданной ширины, глубины и высоты.

На рис. 7.5 центр параллелепипеда расположен в начале координат. Размеры параллелепипеда изменяются от -ширина/2, -высота/2, -глубина/2 до +ширина/2, +высота/2, +глубина/2. Используя эти значения (размеров), вы можете вычислить координаты ограничивающего параллелепипеда.

Для хранения этих восьми точек можно использовать два набора из восьми объектов D3DXVECTOR3. Первые восемь объектов будут содержать локальные координаты параллелепипеда, совсем как буфер вершин меша.

D3DXVECTOR3 vecLocalPoints[8];

Второй набор из восьми точек будет содержать глобальные координаты точек, движущихся в пространстве мира.

D3DXVECTOR3 vecWorldPoints[8] ;

Второй набор точек используется для хранения преобразованных координат, в то время как первый - для не преобразованных. Для перемещения твердого тела вам необходимо преобразовать координаты первого набора точек и сохранить результат во втором. Опять же, это очень похоже на работу с вершинами меша.

На данный момент вам необходимо хранить координаты восьми углов твердого тела в массиве векторов vecLocalPoints (используя размеры твердого тела).

//Width, Height, Depth=3 вещественных числа, содержащие размеры тела

//Заметьте, что все размеры заданы в метрах

//Сохранить размеры тела в вектор

D3DXVECTOR3 vecSize = D3DXVECTOR3(Width, Height, Depth);

//Сохранить половинные размеры в вектор D3DXVECTOR3 vecHalf = vecSize * 0.5f;

//Сохранить координаты углов

vecLocalPoints[0]=D3DXVECTOR3(-vecHalf.x, vecHalf.y,-vecHalf.z);

Создание кукольной анимации

191

Угловые точки

Рис. 7.5. Параллелепипед (который представляет собой твердое тело) определяется расположением восьми точек относительно его центра. Положения этих точек определяются половиной значения ширины, высоты и глубины тела

vecLocalPoints[1]=D3DXVECTOR3(-vecHalf.х, vecHalf.у, vecHalf.z); vecLocalPoints[2]=D3DXVECTOR3(vecHalf.x,vecHalf'y,vecHalf.z); vecLocalPoints[3]=D3DXVECTOR3( vecHalf.x, vecHalf.y,-vecHalf.z); vecLocalPoints[4]=D3DXVECTOR3(-vecHalf.x,-vecHalf.y,-vecHalf.z); vecLocalPoints[5]=D3DXVECTOR3(-vecHalf.x,-vecHalf.y, vecHalf.z); vecLocalPoints[6]=D3DXVECTOR3( vecHalf.x,-vecHalf.y, vecHalf.z); vecLocalPoints[7]=D3DXVECTOR3( vecHalf.x,-vecHalf.y,-vecHalf.z);

Замечание. Из комментариев кодов вы могли заметить, что в качестве единиц измерения я использую метры (в противоположность использованию безразмерных величин, возможно применяемых вами). Этот факт не должен вас беспокоить, потому что все вычисления производятся независимо от единиц измерения.

Размеры параллелепипеда влияют не только на его объем, но и на массу. О да, твердое тело имеет массу, которая влияет на движение. К объектам с большей массой необходимо приложить большую силу, чтобы сдвинуть их, в то время как к объектам с меньшей массой — меньшую. Я объясню использование массы в вычислениях немного позже; а пока я хочу показать вам, как определять массу объекта.

Соседние файлы в предмете Программирование на C++