Алгоритм определения колли 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, кто-нибудь может помочь?