Я создаю камеру 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 инвертируется, что заставляет меня двигаться во всех противоположных направлениях.
Есть ли понимание того, что происходит и как это исправить?