1

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

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

我知道缩放很容易,我只需要连接到眼睛矢量的深度分量(gluLookAt),但我不太确定如何实现另外两个,平移和轨道。有没有人这样做过?

4

2 回答 2

3

我不能使用好的 ol'“变换场景以使其看起来像相机移动”

OpenGL没有相机。所以你最终会这样做。

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

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

于 2012-05-15T22:40:32.857 回答
1

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

这很简单:你只需 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) 点。您基本上是沿着一条该位置中心的假想射线。
  • 现在,您的相机仍然可以查看该向量周围的任何方向(例如,它可能是倒置的,但仍沿同一方向查看)。上向量是向量,而不是位置。它与从该位置到中心的那个假想矢量一起形成一个平面。这是相机的 yz 平面。
于 2012-05-19T08:08:16.953 回答