【发布时间】:2012-05-15 22:33:40
【问题描述】:
我正在尝试使用 OpenGL 实现一个应用程序,我需要实现基本的相机运动:轨道、平移和缩放。
为了让它更清晰一点,我需要类似 Maya 的相机控制。由于应用程序的性质,我不能使用“转换场景以使其看起来像相机移动”这样的好方法。所以我坚持使用变换矩阵、gluLookAt 等。
我知道缩放非常简单,我只需要挂钩到眼睛矢量的深度分量 (gluLookAt),但我不太确定如何实现另外两个,平移和轨道。有人做过吗?
【问题讨论】:
我正在尝试使用 OpenGL 实现一个应用程序,我需要实现基本的相机运动:轨道、平移和缩放。
为了让它更清晰一点,我需要类似 Maya 的相机控制。由于应用程序的性质,我不能使用“转换场景以使其看起来像相机移动”这样的好方法。所以我坚持使用变换矩阵、gluLookAt 等。
我知道缩放非常简单,我只需要挂钩到眼睛矢量的深度分量 (gluLookAt),但我不太确定如何实现另外两个,平移和轨道。有人做过吗?
【问题讨论】:
我不能使用“转换场景以使其看起来像相机移动”这样的好方法
OpenGL 没有摄像头。所以你最终会这样做。
我知道缩放很简单,我只需要挂钩到眼睛矢量的深度分量 (gluLookAt),
这不是 Zoom,这是多莉。缩放意味着改变投影体积的限制,即正射投影的范围,或透视的视野。
【讨论】:
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,这将改变相机绕轨道运行的点。
*另外一个棘手的问题是准确地了解这意味着什么。澄清一下,因为缺乏互联网:
【讨论】: