29

在 OpenGL 中,我试图围绕一个点旋转相机,相机与该点的距离为 r,并且在旋转时面向该点。换句话说,我希望相机沿距离中心半径为 r 的圆的圆周移动,相机在圆周上的任何点面向中心。

假设在 3d 空间中,圆的中心是 (3, 0, 3);

我试过了:

// move to center of circle    
glTranslatef(-3, 0, -3)
// move a distance away from the circle
glTranslatef(0, 0, r);
// rotate along the y "up" axis
glRotatef(CameraAngle, 0, 1, 0);

其中 CameraAngle 是围绕圆圈移动的度数。

我的最终结果是相机仍然沿原点旋转,而不是圆心。谁能帮我解决这个问题?谢谢!

4

4 回答 4

29

您需要:

  • 围绕原点旋转相机,然后平移它 (*)

或者:

  • 用于gluLookAt保持相机指向圆心

(*) 旋转函数通常围绕原点旋转。要围绕另一个点旋转,P您必须:

  • 翻译(-P)
  • 旋转
  • 翻译(P)
于 2008-11-13T17:48:52.880 回答
13

这有点令人困惑,但我认为你应该:

// move camera a distance r away from the center
glTranslatef(0, 0, -r);

// rotate 
glRotatef(angley, 0, 1, 0);
glRotatef(anglex, 1, 0, 0);

// move to center of circle    
glTranslatef(-cx, -cy, -cz)

请注意,不得更改订单。

于 2009-04-03T07:18:55.263 回答
2

为什么要麻烦旋转相机而不是旋转场景本身呢?
它更直接。只需围绕原点旋转模型视图矩阵。你会得到完全相同的结果。

于 2008-11-13T18:49:38.733 回答
1

我发现使用 gluLookAt() 可以更轻松地解决此类问题。您为相机定义一条路径(一个圆圈很简单!)并保持“中心”点固定(即您正在看的东西)。

唯一可能的技巧是定义一个好的向上向量——但通常不需要太多的工作。如果路径和目标点在同一平面上,则每次都可以使用相同的向上向量!

于 2008-11-13T17:53:41.203 回答