Векторы камеры LWJGL FPS - PullRequest
0 голосов
/ 21 мая 2019

Я создаю камеру FPS, в которой камера движется в направлении, в котором она смотрит.

Моя логика следующая

У меня есть 3 вектора

F:Direction Camera is Looking At
U:Up Vector(0,1,0)
L:Left Vector(L=Cross(U,F))

Перемещение камеры, если ее положение P

1)Forward/Backward P=P+F/P-F
2)Left/Right       P=P+L/P-L
3)Up Down          P=P+U/P-U

Вот как я строю свою матрицу вида

public static void viewTransform(Vector3f location,Vector3f eulers,Matrix4f dst)
 {
  Vector3f xaxis=new Vector3f(1,0,0);
  Vector3f yaxis=new Vector3f(0,1,0);
  Vector3f zaxis=new Vector3f(0,0,1);

  dst.setIdentity();
  dst.rotate((float)Math.toRadians(eulers.x),xaxis);
  dst.rotate((float)Math.toRadians(eulers.y),yaxis);
  dst.rotate((float)Math.toRadians(eulers.z),zaxis);
  dst.translate(location.negate(null));
 }

Вот как я преобразовываю свои векторы каждый кадр

void rotate()
 {
  //eulers.x=pitch
  //eulers.y=yaw
  //eulers.z=0

  front.set(0,0,-1);
  MatrixMath4f.rotateVector(eulers,front,front);
  Vector3f.cross(up,front,left);

  left.set(left.normalise(left));
  front.set(front.normalise(front)); 
 }

Вот как я вращаю трехмерный вектор с использованием матрицы 4 на 4

public static Vector3f rotateVector(Vector3f eulers,Vector3f src,Vector3f dest)
 {
   Matrix4f transform=new Matrix4f();
   Vector3f xaxis=new Vector3f(1,0,0);
   Vector3f yaxis=new Vector3f(0,1,0);
   Vector3f zaxis=new Vector3f(0,0,1);
   transform.setIdentity();

   Matrix4f.rotate((float)Math.toRadians(eulers.x),xaxis,transform,transform);
   Matrix4f.rotate((float)Math.toRadians(eulers.y),yaxis,transform,transform);
   Matrix4f.rotate((float)Math.toRadians(eulers.z),zaxis,transform,transform);

   front4.set(src.x,src.y,src.z,0);
   Matrix4f.transform(transform,front4,front4);
   dest.set(front4);

   return dest;
 }

Теперь, когда мой шаг> 90 [камера смотрит вдоль отрицательной оси y] рыскание> 90 или в моем случае около 170-180 [камера вращается вдоль плоскости XZ]

Мой фронтальный компонент y становится положительным. Хотя я смотрю вдоль отрицательной оси Y, мой вектор F направлен вверх Это значит, что когда я пытаюсь двигаться вперед, глядя вниз, я начинаю двигаться вверх.

Обычно, когда я смотрю вниз и поворачиваюсь на 180 градусов, моя ось Y вектора F инвертируется, что заставляет меня двигаться во всех противоположных направлениях.

Есть ли понимание того, что происходит и как это исправить?

...