四元数到欧拉XYZ,如何区分负四元数和正四元数
Quaternion to EulerXYZ, how to differentiate the negative and positive quaternion
我一直在试图弄清楚它们之间的区别,以及为什么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 是不同的;但是,两个四元数表示的旋转是相同的。这种现象通常用四元数提供旋转群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在这两种情况下应该是相同的,它似乎是相同的。
根据我的记忆,四元数可以被认为是围绕任意轴的旋转。
这有助于直观地理解为什么总是有两个四元数来表示给定的旋转。
围绕 0,0,1 旋转 90° 与围绕 0,0, -1 旋转 270° 相同。
即围绕 0,0,1 逆时针旋转四分之一圈与围绕 0,0, -1 周围顺时针旋转四分之一圈相同。
您可以使用拇指作为旋转轴,并按照手指卷曲的方向进行 90° 旋转。
- 单元测试欧拉到四元数实现失败
- 零四元数和任何向量都不为零的特征积,这是一个错误吗?
- 将四元数旋转的游戏对象旋转另一个四元数时出现问题
- 在OpenGL(GLM/C++)中使用四元数旋转时出现问题
- 想要将 CGAL 与四元数相结合是否合乎逻辑
- Eigen::Quaternion FromTwoVectors() 不返回有效的四元数
- C++四元数方程程序
- 四元数旋转不起作用
- 四元数和翻译
- 使用四元数防止绕某个轴旋转
- 如何使用四元数来描述超过360度的旋转角度?
- 四元数旋转错误
- 为什么我简单的四元数乘法比SSE快
- 特征:将矩阵3d旋转转换为四元数
- 从四元数查看矩阵
- 用四元数绕轴旋转矢量
- 基于四元数的相机不需要的卷轴
- 在C++中使用1D FFT的四元数FFT
- 四元数到轴的角度
- 四元数 -> 欧拉角 -> 旋转矩阵问题 (GLM)