class cCollisionObject { public:
DWORD m_Type; // Тип объекта
D3DXVECTOR3 m_vecPos; // координаты сферы float m_Radius; // Радиус сферы D3DXPLANE m_Plane; // Параметры плоскости
cCollisionObject *m_Next; // Следующий объект в связанном списке public:
cCollisionObject() { m_Next = NULL; }
~cCollisionObject() { delete m_Next; m_Next = NULL; }
};
В классе cCollisionObject содержаться четыре основные переменные. Необходимо установить переменную т_Туре с помощью макроса, представляющего тип объекта, содержащегося в классе, - либо сфера (COLLISIONSPHERE), либо плоскость (COLLISION_PLANE).
Необходимо хранить координаты объекта столкновения сферы в mvecPos. Эти координаты определяют положение в трехмерном пространстве, совсем как у трехмерных мешей. Также, если используется объект сфера, убедитесь, что вы установили ее радиус в переменной mRadius.
Однако, если вы используете объект столкновения плоскость, вам только необходимо установить ее соответствующие параметры в объекте mPlane. Параметры mPlane.a, mPlane.b и mPlane.c являются нормализованными векторами направления плоскости, в то время как m_Plane.d является смещением по вектору направления, определяющему положение плоскости.
Далее в классе располагается указатель m_Next, который используется для хранения структуры связанного списка. Используя связанный список, вы можете создать полный набор объектов столкновений, используемых при моделировании одежды. Далее в этом разделе вы увидите, как его использовать.
Покончив с объявлениями переменных, перейдем к рассмотрению функций cCollisionObject. Класс содержит только две функции, являющиеся конструктором и деструктором, которые используются для очистки связанного списка указателей при инициализации и для его освобождения при уничтожении.
Кроме класса cCollisionObject вы можете создать еще один класс, который бы содержал связанный список набора объектов. Я рекомендую использовать отдельный класс, позволяющий хранить множество списков объектов столкновений, например, один для статичной геометрии, а другой — для динамичной. Объект столкновения может перемещаться, взаимодействуя с объектом одежды и вынуждая ее развеваться.
Второй класс, названный cCollision, определяется так:
class cCollision { public:
DWORD m_NumObjects; // # объектов cCollisionObject *m_Objects; // список объектов
public:
cCollision() { m_NumObjects = 0; m_Objects = NULL; } ~cCollision() { Free(); }
void Free() {
// Удалить связанный список объектов delete m_Objects; m_Objects = NULL; m_NumObjects =0 ;
}
void AddSphere(D3DXVECTOR3 *vecPos, float Radius) {
// Создать новый объект
cCollisionObject *Sphere = new cCollisionObject ();
// Установить данные сферы Sphere->m_Type = COLLISION_SPHERE; Sphere->m_vecPos = (*vecPos); Sphere->m_Radius = Radius;
// Добавить сферу в связанный список и увеличить счетчик
Sphere->m_Next = m_Objects; m_Objects = Sphere; m_NumObjects++;
}
void AddPlane(D3DXPLANE *PlaneParam) {
// Создать новый объект
cCollisionObject *Plane = new cCollisionObject();
// Установить параметры плоскости Plane->m_Type = COLLISION_PLANE; Plane->m_Plane = (*PlaneParam);
// Добавить плоскость в связанный список и увеличить счетчик
Plane->m_Next = m_Objects; m_Objects = Plane; m_NumObj ects + + ;
}
};
Объявление класса cCollision включает две переменные (m_NumObjects и m_Objects), которые содержат количество загруженных объектов столкновений и их связанный список соответственно. Также в вашем распоряжении находятсяпять функций, первые из которых конструктор и деструктор. Они используются для очистки данных класса и вызова функции Free соответственно.
Функция Free предназначена для удаления связанного списка объектов и обнуления количества загруженных в него объектов столкновений. Функции AddSphere и AddPlane используются для создания нового объекта столкновения и добавления его в связанный список, хранящийся в классе cCollision.
Чтобы добавить в связанный список сферу, вызовите AddSphere, задав в качестве параметров координаты центра сферы и ее радиус. Чтобы добавить плоскость, вызовите AddPlane и передайте в качестве параметра объект D3DXPLANE, который бы задавал нормаль плоскости и ее смещение от начала координат.
Чтобы использовать данные объекта столкновения, необходимо создать функцию, которая бы просматривала все точки одежды и для каждой точки проверяла бы, сталкивается ли точка с объектом столкновения. Это выполняется простой проверкой расстояния, как вы увидите далее.
⇐Работа с обнаружением столкновений и реакцией на них || Оглавление || Обнаружение и реакция на столкновения⇒