OpenGL围绕一个点旋转相机

时间:2008-11-13 17:43:39

标签: opengl camera rotation 3d

在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 个答案:

答案 0 :(得分:25)

您需要:

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

或:

  • 使用gluLookAt让相机指向圆圈的中心

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

  • 翻译(-P)
  • 旋转
  • 翻译(P)

答案 1 :(得分:9)

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

// 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)

请注意,不得更改订单。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

我发现使用gluLookAt()更容易解决这样的问题。你定义了一个摄像机的路径(圆圈很容易!)并保持“中心”点固定(即你正在看的东西)。

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