我正在尝试使用OpenGL实现一个应用程序,我需要实现基本的相机移动:轨道,平移和缩放。
为了让它更清晰,我需要Maya式的相机控制。由于应用程序的性质,我无法使用好的“变换场景使其看起来像相机移动”。所以我坚持使用变换矩阵,gluLookAt等。
放大我知道这很简单,我只需要挂钩眼睛向量的深度组件(gluLookAt),但我不太确定如何实现另外两个,平移和轨道。有没有人这样做过?
答案 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,这将改变摄像机绕轨道运行的点。
*唯一的另一个棘手的问题是学习完全这意味着什么。澄清一下,因为缺乏互联网: