Физика твердого тела - это система слежения за движением и взаимодействие твердых объектов. Для упрощения положим, что твердыми объектами являются трехмерные ограничивающие параллелепипеды, содержащие кости скелетной структуры. В пространстве параллелепипеды состоят из восьми точек (по одной в каждом углу).
Точки являются аналогами вершин, параллелепипед является аналогом меша. Используя простые преобразования (вращение и перемещение), вы можете расположить параллелепипед и его восемь угловых точек где угодно в трехмерном мире. Каждый параллелепипед с его угловыми точками имеет собственное место в системе твердых тел. Параллелепипед представляет точки как целое - что влияет на параллелепипед, то влияет и на точки. Таким образом, если вы переместите параллелепипед, точки переместятся вместе с ним, вам нет необходимости заботиться о точном расположении точек внутри него.
Что касается точек, они не просто помогают определять размер ограничивающего параллелепипеда, они также помогают определять столкновения. Видите ли, если хотя бы одна из этих точек лежит внутри пространства другого объекта, тогда можно сказать, что объекты сталкиваются, и вам необходимо обрабатывать их. Это сильнооблегчает нахождение столкновений; вместо того чтобы проверять каждую вершину меша, попадает ли она в объект, вы можете проверять точки ограничивающего параллелепипеда. Я вернусь к обнаружению столкновений немного позднее; а пока я хочу продолжить определение твердого тела.
Как я уже упоминал, каждый ограничивающий параллелепипед состоит из восьми точек. Для определения положения этих точек вам необходимо полностью окружить каждую кость (и ее вершины, и точки соединения костей) в скелетной структуре параллелепипедом. Я покажу, как это делать далее в этой главе, когда мы начнем использовать твердые тела в анимациях; а пока предположим, что имеем параллелепипед заданной ширины, глубины и высоты.
На рис. 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);

Рис. 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);
Замечание. Из комментариев кодов вы могли заметить, что в качестве единиц измерения я использую метры (в противоположность использованию безразмерных величин, возможно применяемых вами). Этот факт не должен вас беспокоить, потому что все вычисления производятся независимо от единиц измерения.
Размеры параллелепипеда влияют не только на его объем, но и на массу. О да, твердое тело имеет массу, которая влияет на движение. К объектам с большей массой необходимо приложить большую силу, чтобы сдвинуть их, в то время как к объектам с меньшей массой — меньшую. Я объясню использование массы в вычислениях немного позже; а пока я хочу показать вам, как определять массу объекта.
Вы можете использовать любой метод для определения массы объекта, но, для упрощения, я использовал его размеры. Для вычисления массы параллелепипеда я использовал произведения длин всех его размерностей (хранимых в векторе vec-Size из предыдущего кусочка), как в следующем примере:
float Mass = vecSize.x * vecSize.y * vecSize.z;
После вычисления размеров и массы параллелепипеда, вы можете располагать и ориентировать его в трехмерном мире.
⇐Работа с физикой твердого тела || Оглавление || Расположение и ориентирование твердых тел⇒