我正在尝试使用gluLookAt在OpenGL固定功能管道中实现FPS样式相机。鼠标应该沿任何方向旋转相机。
我存储相机的位置:
float xP;
float yP;
float zP;
我将外观存储在坐标:
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)以旋转相机?
答案 0 :(得分:1)
从一组向量开始:
fwd = (0, 0, -1);
rht = (1, 0, 0);
up = (0, 1, 0);
鉴于你从你提到的鼠标位置取得的x
和y
足够小你可以分别直接将它们作为偏航和俯仰旋转。使用偏航值将rht
和fwd
向量旋转到up
向量上,而不是使用俯仰值在fwd
上旋转rht
个vactor。通过这种方式,您可以为您的相机(fwd
vactor)设置一个新的前进方向,您可以从中获取新的观察点(在您的情况下为L = P + fwd
)。
你必须记住限制音高旋转,不要让fwd
和up
向量在某个时刻平行。您可以通过每次轮换旋转时重新创建up
向量来防止这种情况 - 只需在rht
和fwd
个vactors之间进行交叉产品。这里有一个侧面说明 - 这种方式up
并不总是(0,1,0)。