最简短的总结是四元数只是旋转矩阵的简写。 4x4 矩阵需要 16 个单独的值,而四元数可以用 4 表示完全相同的旋转。
对于数学爱好者来说,我完全意识到上面的内容过于简单化了。
为了提供更多细节,让我们参考维基百科文章:
单位四元数提供了方便
表示的数学符号
物体的方向和旋转
在三个维度上。与欧拉相比
它们的角度更容易组合并且
避免万向节锁问题。
与旋转矩阵相比,它们是
数值更稳定并且可能
更高效
从开头的段落中还不清楚的是,四元数不仅方便,而且是唯一的。如果一个对象有一个特定的方向,在任意数量的轴上扭曲,则存在一个唯一的四元数来表示该方向。
再次,对于数学倾向的人,我上面的独特性评论假设右手旋转。存在一个等效的左手四元数,它绕相反的轴以相反的方向旋转。
为了简单解释,这是有区别的,没有区别。
如果您想制作一个表示绕轴旋转的简单四元数,可以通过以下一系列简短步骤来实现:
- 选择你的旋转轴
v = {x, y, z}
。出于礼貌,请选择一个单位向量:如果它的长度还不是 1,请将所有分量除以 v 的长度。
- 选择您想要围绕该轴转动的旋转角度并将其命名为
theta
.
- 可以使用下面的示例代码计算等效单位四元数:
四元数构造:
q = { cos(theta/2.0), // This is the angle component
sin(theta/2.0) * x, // Remember, angle is in radians, not degrees!
sin(theta/2.0) * y, // These capture the axis of rotation
sin(theta/2.0) * z};
请注意这些除以二的操作:这确保了轮换中不会出现混乱。对于普通旋转矩阵,向右旋转 90 度与向左旋转 270 度相同。相当于这两种旋转的四元数是不同的:您不能将其中一个与另一个混淆。
编辑:回答评论中的问题:
让我们通过设置以下参考系来简化问题:
- 选择屏幕中心作为原点(我们将围绕该中心旋转)。
- X轴指向右侧
- Y 轴指向上方(屏幕顶部)
- Z 轴指向屏幕外的您的脸部(形成一个漂亮的右手坐标系)。
因此,如果我们有一个示例对象(例如箭头),它首先指向右侧(正 x 轴)。如果我们将鼠标从 x 轴向上移动,鼠标将为我们提供正 x 和正 y。因此,完成一系列步骤:
double theta = Math.atan2(y, x);
// Remember, Z axis = {0, 0, 1};
// pseudo code for the quaternion:
q = { cos(theta/2.0), // This is the angle component
sin(theta/2.0) * 0, // As you can see, the zero components are ignored
sin(theta/2.0) * 0, // Left them in for clarity.
sin(theta/2.0) * 1.0};