Алгоритм определения колли 2d, азимут определяет направление, камера - точка, куб делится на 4 куба

Я делаю 3D лабиринт в OpenGL, 2D, как столкновения

Карта определяется как 2dim массив

 ---------x axis
|0 0 0
|0 1 0
|0 0 0
|
|z axis

что 1 это куб

Я делю этот куб на 4 куба

 .
 _ _
|_|_|
|_|_|

точка - это точка моей камеры с координатами x, z, теперь я спускаюсь к своему кубу. posX,Z рассчитывается так, но это не важно, но чтобы вы знали, как это работает, здесь

posZ -= (float) ((Math.cos(azimut * Math.PI / 180) * Math.cos(zenit * Math.PI / 180))) / 50;
posX += (float) ((Math.sin(azimut * Math.PI / 180) * Math.cos(zenit * Math.PI / 180))) / 50;

Он рассчитывается каждый milisec или sth в методе display(). Я приводил его к типу int, поэтому у меня есть правильные координаты для моего массива и сохраняю его в newX,Z

newposZ = (int) posZ;
newposX = (int) posX;

if (maze[newposZ][newposX] == 1) {

Я проверяю по азимуту, откуда я иду.. вот так (это точка на рис. Выше, в верхнем левом кубе азимут 180, если смотреть прямо на стену, но я хочу проверить от 90 до 270..)

if (posX - newposX < 0.5 && posZ - newposZ < 0.5 && (azimut > 90 && azimut < 270) {
    posZ = newposZ;
}

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

if (posX - newposX < 0.5 && posZ - newposZ < 0.5 && (azimut > 0 && azimut > 180) {
    posX = newposX;
}

Это плохо, потому что под некоторым углом (угол от 90 до 180, потому что он одинаков для обоих..) он одновременно устанавливает и posX, и posZ в newposX, newposZ.. одна из этих переменных фиксируется правильно, а другая не должна быть, если вы знаешь что я имею ввиду

Это работает нормально, если я проверяю только от -45 до 45 градусов, но я хочу от -90 до +90, кто-нибудь может помочь?

0 ответов

Другие вопросы по тегам