C++ 使用gluLookAt的OpenGL相机旋转
我正在尝试使用gluLookAt在OpenGL固定函数管道中实现FPS样式的相机。鼠标应在任何给定方向上旋转相机 我存储相机的位置: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) 我希望我的相机能够沿着偏航和俯仰方向移动,但不能滚动 在每一帧之后,我将鼠标的坐标重置
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)。注视、向上和右/左向量应该相互垂直