如果我忽略四元数代数的肮脏细节,我想我理解旋转和平移变换背后的数学。但仍然无法理解我做错了什么。
我为什么……
您不应该在一个rotationMatrix,directionVector或Quaternion中累积所有Euler角度。
做的事情如:
vec3 euler = vec3(yaw, pitch, roll); rot *= quaternion(euler) or self.orientation = quaternion(euler) * self.orientation
每个框架都会向存储在结构中的现有旋转添加旋转。
float deltaYaw = getInput(); float deltaPitch = getInput(); m_rotation = m_rotation * euler(deltaYaw, deltaRoll, 0.0f) is not equal to m_rotation = rotationMatrix(m_yaw + deltaYaw, m_pitch + deltaRoll, 0.0f);
在一种情况下,您可以使用deltaYaw用新的3D框架旋转已经旋转的对象。你现在申请的偏航将考虑到你所做的滚动。
oldYaw * oldRoll * deltaYaw != (oldYaw * deltaYaw) * oldRoll
另一方面,您将从网格位置到请求的欧拉角构建旋转。
是的,你说得对,它不是处理相机的便捷方式,保持偏航,俯仰和滚动变量会导致以后出现问题(gimBall锁定,相机动画会变得棘手......)。我建议看看arcBall相机 https://en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Tutorial_Arcball