四元数到EulerXYZ,如何区分负四元数和正四元数

时间:2015-06-14 20:33:15

标签: c++ geometry quaternions euler-angles

我一直试图弄清楚这些之间的区别,以及为什么ToEulerXYZ没有得到正确的轮换。

使用MathGeoLib:

axisX:

x   0.80878228  float
y   -0.58810818 float
z   0.00000000  float

axisY:

x   0.58811820  float
y   0.80877501  float
z   0.00000000  float

axisZ:

x   0.00000000  float
y   0.00000000  float
z   1.0000000   float

代码:

Quat aQ = Quat::RotateAxisAngle(axisX, DegToRad(30)) * Quat::RotateAxisAngle(axisY, DegToRad(60)) * Quat::RotateAxisAngle(axisZ, DegToRad(40));
float3 eulerAnglesA = aQ.ToEulerXYZ();

Quat bQ = Quat::RotateAxisAngle(axisX, DegToRad(-150)) * Quat::RotateAxisAngle(axisY, DegToRad(120)) * Quat::RotateAxisAngle(axisZ, DegToRad(-140));
float3 eulerAnglesB = bQ.ToEulerXYZ();

ToEulerXYZ得到{x = 58.675510 y = 33.600880 z = 38.327244 ...}(转换为度数时)。

我能看到的唯一区别是四元数是相同的,但一个是负数。 ToEulerXYZ是错误的,因为一个应该是负数({x = -58.675510 y = -33.600880 z = -38.327244 ...})(bQ)

AQ是:

 x  0.52576530  float
 y  0.084034257 float
 z  0.40772036  float
 w  0.74180400  float

虽然bQ是:

 x  -0.52576530 float
 y  -0.084034257    float
 z  -0.40772036 float
 w  -0.74180400 float

这只是MathGeoLib的错误,或者是一些奇怪的细微差别,或者有人可以向我解释逻辑上发生了什么。

还有其他方案甚至不是负面的

axisX:

-0.71492511 y=-0.69920099 z=0.00000000

axisY:

0.69920099 y=-0.71492511 z=0.00000000

axisZ:

x=0.00000000 y=0.00000000 z=1.0000000

代码:

Quat aQ = Quat::RotateAxisAngle(axisX, DegToRad(0)) * Quat::RotateAxisAngle(axisY, DegToRad(0)) * Quat::RotateAxisAngle(axisZ, DegToRad(-90));
float3 eulerAnglesA = aQ.ToEulerXYZ();

Quat bQ = Quat::RotateAxisAngle(axisX, DegToRad(-180)) * Quat::RotateAxisAngle(axisY, DegToRad(180)) * Quat::RotateAxisAngle(axisZ, DegToRad(90));
float3 eulerAnglesB = bQ.ToEulerXYZ();

这两者都产生相同的四元数!

x   0.00000000  float
y   0.00000000  float
z   -0.70710677 float
w   0.70710677  float

2 个答案:

答案 0 :(得分:2)

四元数-q和q是不同的;但是,由两个四元数表示的旋转是相同的。这种现象通常通过说四元数提供double cover旋转组SO(3)来描述。要看这个的代数非常简单:给定由四元数p表示的向量和由四元数q表示的旋转,旋转为qpq^{-1}。另一方面,-qp(-q)^{-1} = -1qp(q)^{-1}(-1) = q(-1)p(-1)q^{-1} = qp(-1)^2q^{-1} = qpq^{-1},相同的旋转。四元数通常不通勤,因此pq != qp用于一般四元数,但像-1这样的标量会与四元数通信。

我相信ToEulerXYZ在这两种情况下应该是相同的。它似乎是。

答案 1 :(得分:0)

根据我的记忆,四元数可以被认为是围绕任意轴的旋转。

这有助于直观地理解为什么总会有两个四元数来表示给定的旋转。

在0,0,1附近旋转90°与在0,0,-1附近旋转270°相同。

即。在0,0,1附近逆时针转动四分之一圈,在0,0,-1附近顺时针转动四分之一圈。

您可以使用拇指作为旋转轴进行检查,并在手指弯曲的方向上旋转90°。