OpenGL旋转问题

Spl*_*lit 1 c++ opengl camera

在我的OpenGL应用程序中,我有一个使用键盘(移动)和鼠标(环顾四周)控制的相机.

到目前为止,每个人都做得很好,我注意到如果我将相机在Y轴上移动到300以上,那么当移动鼠标时它会开始变得混乱.例如,如果我转到Y = 310,并且向上移动鼠标,当它开始向上看时,它也会开始向左转.

我不确定这是什么原因.有人可以帮忙吗?

下面是代码,为gluLookAt()提供前向和上升位置

双cosR,cosP,舒适; //来自双sinR,sinP,sinY的sin/cos的临时值; //输入的滚动/俯仰/偏航

if(Yaw > 359) Yaw = 0;
if(Pitch > 359) Pitch = 0;
if(Yaw < 0) Yaw = 359;
if(Pitch < 0) Pitch = 359;


cosY = cosf(Yaw*3.1415/180);
cosP = cosf(Pitch*3.1415/180);
cosR = cosf(Roll*3.1415/180);
sinY = sinf(Yaw*3.1415/180);
sinP = sinf(Pitch*3.1415/180);
sinR = sinf(Roll*3.1415/180);

//forward position
forwardPos.x = sinY * cosP*360;
forwardPos.y = sinP * 360;
forwardPos.z = cosP * -cosY*360;

//up position
upPos.x = -cosY * sinR - sinY * sinP * cosR;
upPos.y = cosP * cosR;
upPos.z = -sinY * sinR - sinP * cosR * -cosY;
Run Code Online (Sandbox Code Playgroud)

Mic*_*gan 8

Gimble Lock. 这里解释一下.

四元数是这个问题的标准解决方案.

简而言之,当您在上面的计算中两个轴角相互接近时,会导致可用运动的损失.你需要第四个自由度来防止这种情况 - 这就是Quaternion数学允许的.