c++ - 四元数转EulerXYZ,如何区分负四元数和正四元数

标签 c++ geometry quaternions euler-angles

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

使用 MathGeoLib:

X 轴:

x   0.80878228  float
y   -0.58810818 float
z   0.00000000  float

Y轴:

x   0.58811820  float
y   0.80877501  float
z   0.00000000  float

Z轴:

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 的一个错误,还是一些奇怪的细微差别,或者也许有人可以向我解释逻辑上发生了什么。

还有一些甚至不是负面的情况

X 轴:

-0.71492511 y=-0.69920099 z=0.00000000

Y轴:

0.69920099 y=-0.71492511 z=0.00000000

Z轴:

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

最佳答案

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

关于c++ - 四元数转EulerXYZ,如何区分负四元数和正四元数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30834254/

相关文章:

c++ - 在 C++ 中克隆一个 wchar_t*

c++ - 使用 Gloox C/C++ 的 XMPP 握手流程

text - 带有弯曲文本路径的 SVG 文本对齐问题

c# - 四元数反向旋转?

opengl - 翻译四元数

c++ - Glm 四元数观察函数

c++ - 在 C++ 中访问和插入 map 的 map (嵌套 map )

c++ - 变量模板的编译器问题

algorithm - 如何确定点是否在 3D 三角形内?

algorithm - 多边界框包含检测算法