【问题标题】:How do I implement basic camera operations in OpenGL?如何在 OpenGL 中实现基本的相机操作?
【发布时间】:2012-05-15 22:33:40
【问题描述】:

我正在尝试使用 OpenGL 实现一个应用程序,我需要实现基本的相机运动:轨道、平移和缩放。

为了让它更清晰一点,我需要类似 Maya 的相机控制。由于应用程序的性质,我不能使用“转换场景以使其看起来像相机移动”这样的好方法。所以我坚持使用变换矩阵、gluLookAt 等。

我知道缩放非常简单,我只需要挂钩到眼睛矢量的深度分量 (gluLookAt),但我不太确定如何实现另外两个,平移和轨道。有人做过吗?

【问题讨论】:

    标签: opengl graphics camera


    【解决方案1】:

    我不能使用“转换场景以使其看起来像相机移动”这样的好方法

    OpenGL 没有摄像头。所以你最终会这样做。

    我知道缩放很简单,我只需要挂钩到眼睛矢量的深度分量 (gluLookAt),

    这不是 Zoom,这是多莉。缩放意味着改变投影体积的限制,即正射投影的范围,或透视的视野。

    【讨论】:

    • 谢谢,我实际上并不完全确定我使用的名称。所以“Zoom”就是多莉,其他名字对吗?
    • 是的,如果您将平移称为将相机旋转到位,轨道运动是指让相机围绕始终面向它的对象旋转。多莉意味着移动相机(也沿着观察轴)。请注意,所有这些也适用于正交投影。但是沿观察轴的相机小车不会改变正交图像,而使用透视它会“放大”对象。然而,缩放正在改变视图限制,并且适用于正交和透视。
    【解决方案2】:

    gluLookAt,您已经遇到过,是您的解决方案。前三个参数是相机的位置 (x,y,z),接下来的三个是相机的中心(它正在看的点),最后三个是向上向量(通常是 (0,1,0)),它定义相机的 y-z 平面。*

    这很简单:你只需 glLoadIdentity();,调用 gluLookAt(...),然后像往常一样绘制你的场景。就个人而言,我总是自己在 CPU 中进行所有计算。我发现环绕一个点是一项极其常见的任务。我的模板 C/C++ 代码使用球坐标,看起来像:

    double camera_center[3] = {0.0,0.0,0.0};
    double camera_radius = 4.0;
    double camera_rot[2] = {0.0,0.0};
    double camera_pos[3] = {
        camera_center[0] + camera_radius*cos(radians(camera_rot[0]))*cos(radians(camera_rot[1])),
        camera_center[1] + camera_radius*                            sin(radians(camera_rot[1])),
        camera_center[2] + camera_radius*sin(radians(camera_rot[0]))*cos(radians(camera_rot[1]))
    };
    gluLookAt(
           camera_pos[0],   camera_pos[1],   camera_pos[2],
        camera_center[0],camera_center[1],camera_center[2],
        0,1,0
    );
    

    很明显,您可以调整 camera_radius,这将改变相机的“缩放”,camera_rot,这将改变相机围绕其轴的旋转,或 camera_center,这将改变相机绕轨道运行的点。

    *另外一个棘手的问题是准确地了解这意味着什么。澄清一下,因为缺乏互联网:

    • 位置是摄像机的 (x,y,z) 位置。非常简单。
    • 中心是相机聚焦的 (x,y,z) 点。您基本上是沿着一条假想的射线位置中心观察。
    • 现在,您的摄像头仍可能朝任何方向围绕此向量(例如,它可能是倒置的,但仍沿同一方向看)。上向量是一个向量,不是一个位置。它与从该位置到中心的那个假想矢量一起形成一个平面。这是相机的 y-z 平面。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-22
      • 2011-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多