C++ 使用gluLookAt的OpenGL相机旋转

C++ 使用gluLookAt的OpenGL相机旋转,c++,opengl,camera,C++,Opengl,Camera,我正在尝试使用gluLookAt在OpenGL固定函数管道中实现FPS样式的相机。鼠标应在任何给定方向上旋转相机 我存储相机的位置: float xP; float yP; float zP; 我存储了look-at坐标: float xL; float yL; float zL; 上方向向量始终设置为(0,1,0) 我使用这个相机如下:gluLookAt(xP,yP,zP,xL,yL,zL,0,1,0) 我希望我的相机能够沿着偏航和俯仰方向移动,但不能滚动 在每一帧之后,我将鼠标的坐标重置

我正在尝试使用gluLookAt在OpenGL固定函数管道中实现FPS样式的相机。鼠标应在任何给定方向上旋转相机

我存储相机的位置:

float xP;
float yP;
float zP;
我存储了look-at坐标:

float xL;
float yL;
float zL;
上方向向量始终设置为
(0,1,0)

我使用这个相机如下:
gluLookAt(xP,yP,zP,xL,yL,zL,0,1,0)

我希望我的相机能够沿着偏航和俯仰方向移动,但不能滚动

在每一帧之后,我将鼠标的坐标重置到屏幕的中间。从这里我可以得到x和y的变化


如何转换每帧后x和y的变化,以适当地更改注视坐标(xL、yL、zL)以旋转相机?

从一组矢量开始:

fwd = (0, 0, -1);
rht = (1, 0, 0);
up = (0, 1, 0);
假设从您提到的鼠标位置获取的
x
y
足够小,您可以将它们分别作为偏航和俯仰旋转直接获取。使用偏航值在
up
矢量上旋转
rht
fwd
矢量,然后使用俯仰值在
rht
矢量上旋转
fwd
vactor。这样,您的相机将有一个新的前进方向(
fwd
vactor),您可以从中获得一个新的视点(
L=P+fwd


您必须记住限制俯仰旋转,使
fwd
up
矢量在某个点上不平行。您可以通过在每次进行俯仰旋转时重新创建
up
矢量来防止这种情况-只需在
rht
fwd
vactors之间做一个叉积即可。不过这里有一个旁注-这样
up
并不总是(0,1,0)。

注视、向上和右/左向量应该相互垂直