【问题标题】:OpenGL rotating a camera around a pointOpenGL围绕一个点旋转相机
【发布时间】:2010-09-22 04:57:28
【问题描述】:

在 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 是围绕圆移动的度数。

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

【问题讨论】:

    标签: opengl camera rotation 3d


    【解决方案1】:

    您需要:

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

    或:

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

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

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

    【讨论】:

    • 我已经使用“四元数原型”(我的 Vector 类中的简单方法,它围绕另一个向量旋转一个)完成了这项工作。看起来更灵活 =)
    【解决方案2】:

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

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

    请注意,不得更改顺序。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 本例中的相机是通过旋转模型视图矩阵来实现的,所以旋转模型视图矩阵与旋转相机是一样的。旋转场景涉及使用不同的顶点位置等...我认为您的帖子有点混乱。
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2023-04-03
        • 1970-01-01
        • 2012-12-27
        • 1970-01-01
        • 2020-06-25
        • 1970-01-01
        • 1970-01-01
        • 2015-02-07
        • 2017-06-07
        相关资源
        最近更新 更多