【发布时间】:2020-06-25 11:26:06
【问题描述】:
我正在尝试在 OpenGL 中实现一个可以移动和旋转的相机。我希望相机围绕相机当前正在查看的 XZ 平面上的一个点(Y 向上)旋转(即 XZ 平面和相机方向的交点)。实现这一目标的最佳方法是什么?
【问题讨论】:
-
制作一个以交点为中心的球形相机,如果你使用glm或类似的可以计算lookAt矩阵的库,这很简单。
我正在尝试在 OpenGL 中实现一个可以移动和旋转的相机。我希望相机围绕相机当前正在查看的 XZ 平面上的一个点(Y 向上)旋转(即 XZ 平面和相机方向的交点)。实现这一目标的最佳方法是什么?
【问题讨论】:
假设您想围绕P(x, 0, z) 平面上的点P(x, 0, z) 旋转相机
一种方法是调用glRotatef(theta, px, py, pz),它将当前矩阵乘以旋转矩阵(theta 围绕矢量(px, py, pz) 的角度旋转)
由于您想绕任意点而不是原点旋转,您需要先平移坐标轴:
glTranslatef(x, 0, z);
glRotatef(thetax, 1, 0, 0);
glRotatef(thetay, 0, 1, 0);
glRotatef(thetaz, 0, 0, 1);
glTranslatef(-x, 0, -z);
或者,您可以使用gluLookAt(cx, cy, cz, px, py, pz, ux, uy, uz),它为(cx, cy, cz) 处的摄像机创建一个视图矩阵,该矩阵查看(px, py, pz),(ux, uy, uz) 是指向“向上”的向量(摄像机的滚动)
我想你希望你的相机到你的点的距离保持不变,所以在球坐标系中表达你的相机坐标会很方便
x = rsin(θ)cos(φ)
y = rsin(θ)sin(φ)
z = rcos(θ)
【讨论】: