OpenGL围绕一个点旋转相机

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个回答

29

您需要执行以下操作之一:

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

或者:

  • 使用gluLookAt函数使相机始终指向圆心

(*) 旋转函数通常是围绕原点进行旋转。要围绕另一个点P旋转,您需要执行以下操作:

  • 平移(-P)
  • 旋转
  • 平移(P)

我已经用"四元数原型"(在我的向量类中使用的简单方法,可以将一个向量围绕另一个向量旋转)来完成了这个任务。看起来更加灵活 =) - shybovycha

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)

注意顺序不得改变。


2

为什么要费心旋转相机而不是旋转场景本身?
直接绕原点旋转模型视图矩阵更加简单明了。这样可以得到完全相同的结果。


9
在这种情况下,相机是通过旋转模型视图矩阵来实现的,因此旋转模型视图矩阵就相当于旋转相机。旋转场景涉及到使用不同的顶点位置等...我认为你的帖子有点令人困惑。 - jheriko

1

我发现使用gluLookAt()解决这类问题更容易。你可以为相机定义一个路径(圆形很容易!),并保持“中心”点固定(即你要看的东西)。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接