Answers:
数学上,四元数是具有4维的复数。但是在游戏开发中,四元数通常用于通过编码来描述3d空间中的旋转:
请注意,此信息是在四元数内部用正弦和余弦编码的,因此通常,您不应尝试显式设置或读取四元数的内部分量(xyzw)。这样很容易犯错误并获得无意义的结果。四元数数学库通常会提供对四元数进行运算的函数(例如,将其转换为Euler角或轴角或从Euler角或轴角转换为四元数),这确保了数学的正确性,并具有使代码易于阅读和理解的附带好处。
描述旋转的另一种方法是通过描述绕3个固定轴的x,y和z(又称Euler角)旋转多远,它只需要3个数字而不是4个,使用起来通常更直观。但是,欧拉角会遇到一个称为“ 万向节锁定”的问题:当您围绕一个轴旋转90°时,其他两个轴将变为等效。使用四元数时,不会发生此问题。
表达3d空间中旋转的另一种方法是使用4x4 变换矩阵。但是使用变换矩阵,您不仅可以旋转,而且可以缩放,平移和倾斜。如果只需要旋转,矩阵将是多余的,而四元数则是更快,更简单的解决方案。
此问题仅在3d空间中相关。在2D空间中,只有一个旋转轴。任何旋转都可以用单个浮点数或单个复数来表示,因此您没有这个问题。从理论上讲,您可以使用四元数在二维平面上表示旋转,其中轴指向(或指向)平面之外,但是通常这是多余的。
这是添加到@Philipp的答案。
另外,在2D平面上使用三个点可以获得什么优势?
如果您只想在平面上(即绕 z轴)旋转,则实际上并不需要四元数。在这种情况下,您只需要偏航角,就可以利用绕着z轴连续旋转的事实。因此,您可以按任意顺序应用轮播。
如果您在非XY平面上旋转,则情况会有所不同。此旋转等效于围绕任意3D轴旋转。现在,您有两种选择:
以3D旋转平面,使其与XY平面重合,然后偏航,然后向后变换,或者
首先将旋转视为3D模式。
第二种选择更易于编码。正如@Philipp所说,四元数避免万向节锁定(如果避免中间RPY或轴/角度转换)。
最后,什么时候使用四元数被认为是一种好习惯?
每当进行3D旋转时,最好使用四元数。
例如: