Координату в которую

О чем?

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

Кубический мир.

Физика бывает разная :). Сейчас часто слышно про специальные процессоры для видеокарт, просчитывающие физику, очень полезная вещь, и вскоре вы поймете почему это так необходимо.

Самое простое это просчитать столкновение точки и куба, при таком просчете мы просто должны проверить, не в кубе ли точка (чистая математика:)) Но в играх конечно персонажи не точки, а что? Частое заблуждение в том что предполагается что ваш персонаж взаимодействует всей своей моделью с окружающим миром, но это, по сути, нереальная нагрузка на процессор, проверить столкновение каждой точки сетки объекта, а ведь просчет идет тогда несколько раз за секунду(каждый кадр). Самый простой способ это заключить персонажа в сферу, а точнее в две сферы (тогда при приседание одна сфера убирается, что очень удобно). Сфера, конечно, это не сетка из точек, а радиус и точка центра. Остается только математически просчитать столкновение сферы и бокса например в момент нажатия клавиши вперед, тогда в функцию проверки предается массив объектов для физики(в примере у таких объектов есть две доп. Координаты описывающих коробку вокруг объекта полученную функцией директа — D3DXComputeBoundingBox, которая вызывается в создании такого объекта в классе объектов, в функции «getMeshBounding»). Вообщем далее классическая проверка на пересечение сферы и куба, перенесенная на формат программы, хотя ее пришлось вывести самому (не смог вспомнить) посидев немного с ручкой и листочком… Похожие принципы у цилиндра и сферы, но они проще.

Итак, переменные, которые я использовал далее:

Newpos – векторная переменная, содержит координату в которую переместится тело если там ничего нет.

BoundingBoxMin – векторная переменная содержащая ближнюю нижнюю координату бокса (коробки) объекта.

BoundingBoxMax – векторная переменная содержащая дальнюю верхнюю координату бокса объекта.

Radius – радиус сферы

Down – расстояние между сферами.

Chk – булева переменная, указывает произошло ли пересечение.

 

//sphere 01

if((( abs(newpos.x-BoundingBoxMin.x)< radius || abs(newpos.x-BoundingBoxMax.x)< radius)

   && newpos.y>BoundingBoxMin.y-radius && newpos.y

   && newpos.z>BoundingBoxMin.z-radius && newpos.z

 

  (( abs(newpos.y-BoundingBoxMin.y)< radius || abs(newpos.y-BoundingBoxMax.y)< radius)

&& newpos.x>BoundingBoxMin.x-radius && newpos.x

&& newpos.z>BoundingBoxMin.z-radius && newpos.z

 

 (( abs(newpos.z-BoundingBoxMin.z)< radius || abs(newpos.z-BoundingBoxMax.z)< radius)

&& newpos.x>BoundingBoxMin.x-radius && newpos.x

&& newpos.y>BoundingBoxMin.y-radius && newpos.y

 

//sphere 02

if(((abs(newpos.x-BoundingBoxMin.x)< radius || abs(newpos.x-BoundingBoxMax.x)< radius)

&& newpos.y-down>BoundingBoxMin.y-radius && newpos.y-down

&& newpos.z>BoundingBoxMin.z-radius && newpos.z

 

 (( abs(newpos.y-down-BoundingBoxMin.y)< radius || abs(newpos.y-down-BoundingBoxMax.y)< radius)

&& newpos.x>BoundingBoxMin.x-radius && newpos.x

&& newpos.z>BoundingBoxMin.z-radius && newpos.z

 

((abs(newpos.z-BoundingBoxMin.z)< radius || abs(newpos.z-BoundingBoxMax.z)< radius)

&& newpos.x>BoundingBoxMin.x-radius && newpos.x

&& newpos.y-down>BoundingBoxMin.y-radius && newpos.y-down chk= true;                                                

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

Новое в классе модели.

D3DXVECTOR3 vecBoundingBoxRMin;

D3DXVECTOR3 vecBoundingBoxLMax;

D3DXVECTOR3 vecBoundingBoxMin;

D3DXVECTOR3  vecBoundingBoxMax;

 

вид уровня из 3dsMax:

Понравилась статья? Поделиться с друзьями: