LWJGL FPS相机矢量图

时间:2019-05-21 13:43:31

标签: lwjgl

我正在构建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轴会反转,这使我向所有相反的方向移动。

对正在发生的事情以及如何纠正这一点有何见解?

0 个答案:

没有答案