我正在尝试在OpenGL中制作太空飞行模拟器的原型,但是在线阅读了很多文章之后我仍然难以让旋转工作正常(我确实有一个我不太了解的四元数相机,但它漂移了还有其他奇怪的行为。)
我正在尝试执行以下操作:
1)局部旋转 - 当用户按下箭头键时,相对于视口发生旋转(例如,向上“向上”旋转到屏幕顶部)。两个键,如Z和X,将控制船的“滚动”(围绕当前视图旋转)。
2)旋转将以轴角度格式存储(这对于OpenGL来说是最自然的,单个旋转调用,相机矢量应该正确旋转场景)。因此,给定初始角度轴矢量,以及上面提到的一个或多个局部旋转(我们可以在本地称左/右轴为“X”,“Y”为上/下轴,“Z”为滚动轴),我希望最终结果是一个新的轴角矢量。
3)避免使用四分之一并最小化矩阵的使用(出于某种原因,我发现两者都不直观)。而不是矩阵表示法,请在psuedocode中显示矢量组件以及发生的事情。
4)您应该能够在一个方向上旋转(使用箭头键)360度并返回起始视图而不会漂移。优选地,如果用户按下一个组合然后将其反转,则他们期望能够返回到其原始方向附近。
5)摄像机的起始状态位于面向轴角矢量的坐标(0,0,0)(0,0,1,0-z轴,没有开始旋转)。 “up”是(0,1,0)。
答案 0 :(得分:2)
对于spaceim,使用欧拉角方法是错误的。我尝试过这种方法,很快就放弃了。玩家想要所有的自由度,欧拉的角度不能提供,或者使其复杂化。
你真正的,真正想要的是四元数。这是我的更新代码的一部分。
Quaternion qtmp1, qtmp2, qtmp3;
Rotation r(........);
qtmp1.CreateFromAxisAngle(1., 0., 0., r.j*m_updatediff);
qtmp2.CreateFromAxisAngle(0., 1., 0., r.i*m_updatediff);
qtmp3.CreateFromAxisAngle(0., 0., 1., r.k*m_updatediff);
m_rotq = qtmp1 * qtmp2 * qtmp3 * m_rotq;
r.i
,r.j
和r.k
包含围绕某个轴的当前旋转速度。获得类似太空的感觉只是这些四元数倍增的问题。
其他一切都只是一个复杂因素。有了Euler的角度,你可以整天玩 - 事实上,整年都在玩 - 但你只会制造大量杂乱的代码。
您的每日推荐:四元数。