Определение объектов столкновений

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, который бы задавал нормаль плоскости и ее смещение от начала координат.

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

Работа с обнаружением столкновений и реакцией на них || Оглавление || Обнаружение и реакция на столкновения