将 3 轴矢量转换为轴/角度

Convert 3 axis vectors to axis/angle

本文关键字:转换 角度      更新时间:2023-10-16

我有这个源代码,它旋转了在X,Y和Z上对齐的三个轴:

    Quaternion<float> orientation = transform.getOrientation();
    Vector3<Vector3<float>> axis(
        orientation.rotate(Vector3<float>(1.0, 0.0, 0.0)),
        orientation.rotate(Vector3<float>(0.0, 1.0, 0.0)),
        orientation.rotate(Vector3<float>(0.0, 0.0, 1.0))
    );

从"轴"变量中,我想重建四元数。我有一个四元数构造函数,它允许我从轴和角度构造它。

我该怎么做?提前谢谢你。

有一个很好的维基百科页面描述了四元数和空间旋转。具体来说,"与矩阵表示之间的转换"部分。

请务必注意该页面引用的以下要点,"将旋转矩阵转换为四元数时必须小心,因为当旋转矩阵的轨迹(对角线元素的总和)为零或非常小时,几种简单的方法往往是不稳定的。

通常,从旋转矩阵(本质上是您所构建的)转换为四元数是一个坏主意。旋转矩阵必须是特殊的正交矩阵,它是所有可能的 3x3 矩阵的非常小的子集。在计算矩阵时,您几乎总是会失去一些精度,因此它不会精确正交。事实上,这是四元数优先用于表示三维旋转的原因之一。一般来说,如果你能避免转换,只使用四元数,你会更好。

该页面上有一种算法,可以提供一种稳定的方法,可能足以满足您的目的。但是根据个人经验,我可以告诉您,在大多数情况下,您应该期望在操作中失去一些精度。