我正在尝试使用 gluLookAt 在 OpenGL 固定功能管道中实现 FPS 风格的相机。鼠标应在任何给定方向上旋转相机。
我存储相机的位置:
float xP;
float yP;
float zP;
我存储视线坐标:
float xL;
float yL;
float zL;
向上 vector 始终设置为 (0,1,0)
我按如下方式使用这个相机:gluLookAt(xP,yP,zP, xL,yL,zL, 0,1,0);
我希望我的相机能够沿偏航和俯仰移动,但不能滚动。
每一帧之后,我都会将鼠标的坐标重新设置到屏幕中间。由此我可以得到 x 和 y 的变化。
如何转换每帧后 x 和 y 的变化,以适本地改变观察坐标(xL、yL、zL)来旋转相机?
最佳答案
从一组 vector 开始:
fwd = (0, 0, -1);
rht = (1, 0, 0);
up = (0, 1, 0);
鉴于你的 x
和 y
,取自你提到的鼠标位置,足够小你可以直接将它们分别作为偏航和俯仰旋转。使用偏航值将 rht
和 fwd
vector 旋转到 up
vector 上,而不是将 fwd
vector 旋转到 >rht
具有间距值。这样你的相机就会有一个新的前进方向(fwd
vactor),你可以从中得到一个新的观察点(L = P + fwd
例)。
您必须记住限制俯仰旋转,不要让 fwd
和 up
vector 在某个点平行。您可以通过每次进行俯仰旋转时重新创建 up
vector 来防止这种情况 - 只需在 rht
和 fwd
vector 之间进行叉积。不过这里有个旁注——这样 up
并不总是 (0,1,0)。
关于c++ - 使用 gluLookAt 的 OpenGL 相机旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49352747/