如何在OpenGL中实现基本的相机操作?

时间:2012-05-15 22:33:40

标签: opengl graphics camera

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

为了让它更清晰,我需要Maya式的相机控制。由于应用程序的性质,我无法使用好的“变换场景使其看起来像相机移动”。所以我坚持使用变换矩阵,gluLookAt等。

放大我知道这很简单,我只需要挂钩眼睛向量的深度组件(gluLookAt),但我不太确定如何实现另外两个,平移和轨道。有没有人这样做过?

2 个答案:

答案 0 :(得分:3)

  

我无法使用好的''变换场景使其看起来像相机移动“

OpenGL没有相机。所以你最终会做到这一点。

  

放大我知道这很简单,我只需要挂钩眼睛向量的深度组件(gluLookAt),

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

答案 1 :(得分: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)点。你基本上是在想象中的光线位置中心。
  • 现在,你的相机仍然可以看到周围的任何方向这个向量(例如,它可能是倒置的,但仍然朝着同一方向看)。向上矢量是一个矢量,不是一个位置。它与从位置到中心的假想矢量一起形成一个平面。这是相机的y-z平面。