题
在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 是绕圆移动的度数。
我的最终结果是相机仍然沿着原点旋转,而不是圆心。谁能帮我解决这个问题吗?谢谢!
解决方案
您需要:
- 绕原点旋转相机,然后平移 (*)
或者:
- 使用
gluLookAt
保持相机指向圆心
(*) 旋转函数通常绕原点旋转。绕另一个点旋转 P
你必须:
- 翻译(-P)
- 旋转
- 翻译(P)
其他提示
这有点令人困惑,但我认为你应该:
// 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)
请注意,不得更改订单。
为什么要麻烦旋转相机并且不旋转场景呢?
它更加直截了当。只需在原点周围旋转模型视图矩阵。你会得到完全相同的结果。
我发现使用gluLookAt()更容易解决这样的问题。您可以为摄像机定义路径(圆圈很简单!)并保持“中心”状态。点固定(即你正在看的东西)。
唯一可能的技巧是定义一个好的向量 - 但通常不会做太多的工作。如果路径和目标点在同一平面上,则每次都可以使用相同的向上矢量!
不隶属于 StackOverflow