3D翻译相对于3D旋转

我正在尝试将相机移动编程为相对于相机旋转。 (无论俯仰,偏航,滚动,前进总是向前),我希望能够向前,向后,向左,向右,向上和向下移动。

我不想使用matrix。

我想用标准的math库中的sin和cos。

相机在所有3轴上旋转。 旋转顺序是z(roll),y(pitch),x(yaw)。 当所有旋转为0时,正z是向前,正y是向下,正x是左。

到目前为止,我已经得到了前进和后退的工作,

velZ = speed * cos(rotX) * cos(rotY); velY = speed * sin(rotY); velX = speed * sin(-rotX) * cos(rotY); 

如果有人知道如何做到这一点,或知道在哪里可以find这方面的信息,将不胜感激。

在中立位置,你已经定义了正向Z向量(0,0,1)。 有两个vector垂直于该vector(如果我们忽略符号),向上(0,1,0)和向左(1,0,0)。

最简单的方法是创建所有三个向量,并应用matrix变换来查找“摄像机空间”中的向左,向上和向前的向量。

 Matrix transform = Matrix.CreateFromYawPitchRoll(y, pr); Vector3 forward = Vector3.Transform(transform, new Vector3(0, 0, 1)); Vector3 left = Vector3.Transform(transform, new Vector3(1, 0, 0)); Vector3 up = Vector3.Transform(transform, new Vector3(0, 1, 0)); 

你不一定需要一个matrix。 您也可以使用交叉产品find左上matrix。 ( 在这里可以看到 Unity的文档,但是math原理一般适用)。

一旦你有了所有的三个vector,你可以通过简单地将正确的vector(乘以运动速度)添加到相机位置(并查看)vector来进行移动和向上移动。 例如:

 public void MoveLeft(float speed) { camera.Position = camera.Position + (left * speed); }