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

C++ 四元数到EulerXYZ,如何区分负四元数和正四元数,c++,geometry,quaternions,euler-angles,C++,Geometry,Quaternions,Euler Angles,我一直在试图找出它们之间的区别,以及为什么ToEulerXYZ没有得到正确的旋转 使用MathGeoLib: axisX: x 0.80878228 float y -0.58810818 float z 0.00000000 float -0.71492511 y=-0.69920099 z=0.00000000 axisY: x 0.58811820 float y 0.80877501 float z 0.00000000 float 0.69920

我一直在试图找出它们之间的区别,以及为什么ToEulerXYZ没有得到正确的旋转

使用MathGeoLib:

axisX:

x   0.80878228  float
y   -0.58810818 float
z   0.00000000  float
-0.71492511 y=-0.69920099 z=0.00000000
axisY:

x   0.58811820  float
y   0.80877501  float
z   0.00000000  float
0.69920099 y=-0.71492511 z=0.00000000
axisZ:

x   0.00000000  float
y   0.00000000  float
z   1.0000000   float
x=0.00000000 y=0.00000000 z=1.0000000
代码:

ToEulerXYZ和ToEulerXYZ都得到{x=58.675510 y=33.600880 z=38.327244…}(转换为度时)

我能看到的唯一区别是,四元数是相同的,但有一个是负数。不过,ToEulerXYZ是错误的,因为其中一个应该是负数({x=-58.675510y=-33.600880z=-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:

x   0.80878228  float
y   -0.58810818 float
z   0.00000000  float
-0.71492511 y=-0.69920099 z=0.00000000
axisY:

x   0.58811820  float
y   0.80877501  float
z   0.00000000  float
0.69920099 y=-0.71492511 z=0.00000000
axisZ:

x   0.00000000  float
y   0.00000000  float
z   1.0000000   float
x=0.00000000 y=0.00000000 z=1.0000000
代码:

这两者产生相同的四元数

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

根据我的记忆,四元数可以看作是绕任意轴旋转

这有助于直观地理解为什么总是有两个四元数代表一个给定的旋转

围绕0,0,1旋转90°与围绕0,0,-1旋转270°是一样的

即,逆时针绕0,0,1转四分之一圈与顺时针绕0,0,-1转四分之一圈相同


你可以用拇指作为旋转轴,沿着手指卷曲的方向旋转90°。

四元数-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在这两种情况下应该是相同的,它看起来是一样的。

在“你最终到达的绝对旋转点”中似乎确实如此,但在使用Euler时,会有不同。即,设置动画时,一个方向将手臂旋转一个方向,另一个方向将手臂向后旋转。四元数是否完全丢失了这些数据?我不知道,但“四元数插值”可能是需要搜索的术语。