2015-06-14 252 views
1

我一直在试图弄清楚它们之间的区别,以及为什么ToEulerXYZ没有得到正确的旋转。四元数到EulerXYZ,如何区分负四元数和正四元数

使用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

四元数-q和q是不同的;然而,由两个四元数表示的旋转是相同的。这种现象通常被称为四元数提供旋转组SO(3)的double cover。看到这个代数很简单:给定一个由四元数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在两种情况下都应该是相同的,看起来是这样。

0

从我记得的四元数可以被认为是围绕任意轴的旋转。

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

围绕0,0,1旋转90°将与围绕0,0,-1旋转270°相同。

I.e.在0,0,1周围逆时针四分之一圈与在0,0,-1周围顺时针圈四分之一圈相同。

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

+0

在“绝对轮换你最终结束”中看起来确实如此,但是当去欧拉时有一个区别。也就是说,当你动画时,单向旋转手臂,另一个向后旋转。这些数据是否完全因四元数而丢失? –

+0

我不知道,但“四元数插值”可能是搜索的术语。 –