我正在尝试使用 OpenGL 实现一个应用程序,我需要实现基本的相机运动:轨道、平移和缩放。
为了让它更清晰一点,我需要类似 Maya 的相机控制。由于应用程序的性质,我不能使用“转换场景以使其看起来像相机移动”这样的好方法。所以我坚持使用变换矩阵、gluLookAt 等。
我知道缩放很容易,我只需要连接到眼睛矢量的深度分量(gluLookAt),但我不太确定如何实现另外两个,平移和轨道。有没有人这样做过?
我不能使用好的 ol'“变换场景以使其看起来像相机移动”
OpenGL没有相机。所以你最终会这样做。
我知道缩放很容易,我只需要挂钩眼睛矢量的深度分量(gluLookAt),
这不是Zoom,这是Dolly。缩放意味着改变投影体积的限制,即正射投影的范围,或透视的视野。
您已经遇到的 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,这将改变相机围绕其运行的点。
*唯一另一个棘手的问题是准确了解这一切的含义。澄清一下,因为互联网缺乏: