【发布时间】:2013-01-18 01:45:33
【问题描述】:
我在 3D 世界中有一架飞机,它的方向以任何方式保存(例如俯仰、偏航和滚动)。现在,当我想让飞机左转时,但 glRotatef 并没有做这项工作,因为它坚持全局坐标并且不关心飞机的旋转,并且简单地改变偏航也无济于事,因为这也不是相对于飞机的实际旋转,只有当飞机直飞到地平线时才意味着“左”。我需要的是这样的:
float pitch = 10 , yaw = 20, roll = 30; //some initial values
Turn(&pitch, &yaw, &roll , 5, 0 , 0 ) //calculate new pitch, yaw and roll as if
//the plane had turned 5 degrees to the right (relative to its current orientation and roll!)
//pitch, yaw and roll are updated to reflect the new orientation.
许多人建议使用四元数,但我不知道如何将它们实现为 Turn 函数(一个工作示例是 Blitz3D,它具有用于全局旋转的“RotateEntity”函数,如 glRotatef 和用于基于旋转的“TurnEntity”方向)我认为该功能在内部是这样工作的:
- 将俯仰、偏航、滚动转换为像 EulerToQuat 这样的四元数 OpenGL + SDL rotation around local axis
- 使用四元数数学执行局部旋转(未找到源)
- 将四元数转换回偏航、滚动、俯仰(未找到源)
【问题讨论】:
-
解决问题的不是四元数,而是小旋转的累积解决了问题,使用四元数的原因是因为矩阵会产生可能会累积的舍入误差,而四元数可以很容易地归一化......这可能会更好地解释:arcsynthesis.org/gltut/Positioning/Tutorial%2008.html,阅读本章,四元数的用法可能会变得更加清晰,希望这有助于=D
-
感谢卢克,教程帮助了一点 :-) (可能与你同在...)
标签: c++ opengl 3d quaternions