最简短的总结是,四元数只是旋转矩阵的简写。4x4矩阵需要16个单独的值,而四元数可以表示4中完全相同的旋转。
对于数学上的偏见,我完全知道上述内容过于简化。
为了提供更多细节,让我们参考Wikipedia文章:
单元四元数提供了一种方便的数学符号,用于表示三维物体的方向和旋转。与欧拉角相比,它们的组成更简单,并且避免了万向节锁定问题。与旋转矩阵相比,它们在数值上更稳定,并且效率更高
从开头的一段不清楚,四元数不仅方便,而且很独特。如果对象具有特定方向,可以在任意数量的轴上扭曲,则存在一个表示该方向的唯一四元数。
再次,对于数学上的倾向,我上面的唯一性注释假定为右旋。 有一个等效的左手四元数沿相反的方向绕相反的轴旋转。
出于简单说明的目的,这是区别,没有区别。
如果您想制作一个简单的四元数来表示绕轴的旋转,则可以通过以下几步操作来达到目标:
- 选择旋转轴
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};请注意将这些除以2:将确保轮换中没有混乱。使用法向旋转矩阵,向右旋转90度与向左旋转270度相同。与这两个旋转等效的四元数是不同的:您不能将另一个混淆。
编辑:回应评论中的问题:
让我们通过设置以下参考框架来简化问题:
- 选择屏幕的中心作为原点(我们将围绕它旋转)。
- X轴指向右边
- Y轴指向上方(屏幕顶部)
- Z轴指向屏幕,指向您的脸部(形成漂亮的右手坐标系)。
因此,如果我们有一个示例对象(例如箭头),该对象从指向右侧(x轴正方向)开始。如果我们将鼠标从x轴上移,则鼠标将为我们提供正x和正y。因此,完成一系列步骤:
double theta = Math.atan2(y, x);// Remember, Z axis = {0, 0, 1};// pseudo pre 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};


