我正在尝试将相机移动编程为相对于相机旋转。 (无论俯仰,偏航,滚动,前进总是向前),我希望能够向前,向后,向左,向右,向上和向下移动。
我不想使用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); }