OpenGL 相机旋转

use*_*091 4 opengl camera rotation

在 OpenGL 中,我正在尝试创建一个自由飞行的相机。我的问题是 Y 轴上的旋转。相机应始终在 Y 世界轴上旋转,而不是在局部方向上旋转。我尝试了几种矩阵乘法,但都没有结果。和

camMatrix = camMatrix  * yrotMatrix 
Run Code Online (Sandbox Code Playgroud)

沿局部轴旋转相机。与

camMatrix = yrotMatrix * camMatrix
Run Code Online (Sandbox Code Playgroud)

沿世界轴旋转相机,但始终围绕原点旋转。但是,旋转中心应该是相机。有人有想法吗?

Mic*_*ade 6

3D 编程更棘手的方面之一是正确地进行复杂的转换。

在 OpenGL 中,每个点都先用模型/视图矩阵转换,然后再用投影矩阵转换。

模型视图矩阵获取每个点并将其转换为从相机的角度来看它应该在的位置。投影矩阵转换点的坐标,以便可以轻松地将 X 和 Y 坐标映射到窗口。

为了获得正确的模式/视图矩阵,您必须从一个单位矩阵(一个不改变顶点的矩阵)开始,然后应用相机位置和方向的变换,然后以相反的顺序应用对象的位置和方向。

您需要记住的另一件事是,旋转始终围绕以原点 (0,0,0) 为中心的轴。因此,当您对相机应用旋转变换时,是转动它(就像转动头部一样)还是原点运行(如地球绕太阳运行)取决于您之前是否应用了平移变换。

所以如果你想旋转和环绕相机,你需要:

  1. 应用旋转以定向相机
  2. 应用翻译来定位它
  3. 应用旋转以围绕原点旋转相机
  4. (可选)应用平移以在其设置的方向移动相机以将其移动到除 (0,0,0) 以外的点的轨道上。

例如,如果您想将相机指向一个不是 (0,0,0) 的点并以设定的距离环绕该点运行,同时还能够俯仰或偏航相机,那么事情会变得更加复杂。有关WebGL 中的示例,请参见此处。寻找GLViewerBase.prototype.display.

红皮书 涵盖了更多的细节变换

还要注意gluLookAt,你可以用它瞄准的摄像机什么东西,而不必使用旋转。


Tim*_*Tim 2

如果您不想根据前一帧的相机进行变换,我的建议可能只是扔掉矩阵复合并在每一帧重新计算。我认为没有办法用单个矩阵来做你想做的事情,因为它将平移和旋转存储在一起。

我想如果您只想要一个俯仰/偏航相机,只需将这些值存储为两个浮点数,然后基于该值重建矩阵即可。也许类似伪代码:

onFrameUpdate() {
  newPos = camMatrix * (0,0,speed) //move forward along the camera axis
  pitch += mouse_move_x;
  yaw += mouse_move_y;

  camMatrix = identity.translate(newPos)
  camMatrix = rotate(camMatrix, (0,1,0), yaw)
  camMatrix = rotate(camMatrix, (1,0,0), pitch)
}
Run Code Online (Sandbox Code Playgroud)