四元数EulerXYZ,如何区分正负四元(Quaternion to EulerXYZ, how t

2019-10-23 09:26发布

我一直在试图找出它们之间的区别,为什么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

Answer 1:

四元数-q和q是不同的; 然而,由两个四元数表示的转速是相同的。 这种现象通常是由四元说提供一种描述双层盖旋转群的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应该在这两种情况下,它似乎是相同的。



Answer 2:

从我记得四元数可视为绕任意轴旋转。

这可以帮助理解为什么直觉总是会有两个四元表示给定的旋转。

旋转90°左右0,0,1将是相同旋转270°围绕0,0,-1。

即约0,0,1四分之一圈逆时针等同于四分之一圈顺时针方向绕0,0,-1。

您可以使用您的拇指旋转轴检查了这一点,并做90°旋转手指卷曲方向。



文章来源: Quaternion to EulerXYZ, how to differentiate the negative and positive quaternion