我正在构建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矩阵旋转3D向量的方法
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度偏航旋转时,我的F向量y轴会反转,这使我向所有相反的方向移动。
对正在发生的事情以及如何纠正这一点有何见解?