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

时间:2015-01-25 10:54:25

标签: c++ math

我有这个源代码,可以在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))
    );

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

我该怎么做? 提前谢谢。

1 个答案:

答案 0 :(得分:1)

有一个很好的维基百科页面描述Quaternions and spatial rotation。具体来说,部分&#34;转换到矩阵表示和从矩阵表示转换。&#34;

请务必注意从该页引用的以下几点,&#34;将旋转矩阵转换为四元数时必须小心,因为当跟踪时,几个简单的方法往往不稳定(总和旋转矩阵的对角元素是零或非常小。&#34;

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

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