我在将四元数转换为欧拉角时遇到了一些问题。
我遵循了维基百科上的C++代码,我认为我在汇编中复制它做得很好,问题是我的代码将WXYZ值转换为ZYX,而不是XYZ顺序。
C++代码:https://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles#Source_Code_2
(提供的asm代码仅计算滚转轴(
//ROLL
finit
fld dword ptr [WRot]
fld dword ptr [ZRot]
fmulp st(1),st(0)
fld dword ptr [XRot]
fld dword ptr [YRot]
fmulp st(1),st(0)
faddp st(1),st(0)
mov dword ptr [Math],40000000 //2
fld dword ptr [Math]
fxch
fmulp st(1),st(0)
fstp dword ptr [sinr_cosp] //sinr_cosp
finit
fld dword ptr [YRot]
fld dword ptr [YRot]
fmulp st(1),st(0)
fld dword ptr [ZRot]
fld dword ptr [ZRot]
fmulp st(1),st(0)
faddp st(1),st(0)
mov dword ptr [Math],40000000 //2
fld dword ptr [Math]
fxch
fmulp st(1),st(0)
mov dword ptr [Math],3F800000 //1
fld dword ptr [Math]
fxch
fsubp st(1),st(0)
fstp dword ptr [cosr_cosp] //cosr_cosp
finit
fld dword ptr [sinr_cosp]
fld dword ptr [cosr_cosp]
fpatan
mov dword ptr [Math],42652EE1 //57.29577951308232
fld dword ptr [Math]
fxch
fmulp st(1),st(0)
fstp dword ptr [Roll] //Roll value
使用https://quaternions.online/我设置了如下值:
w: 0.549
x: 0.747
y: 0.092
z: 0.363
应用时,应输出的XYZ顺序:
x: 100.000
y: 40.000
z: 20.000
But my code produces:
x: 98.527
y: -26.213
z: 36.644
我该怎么解决?我在哪里可以找到一个合适的工作C++代码作为将Quat转换为XYZ的参考?
我不认为这是内存分配的问题,每个浮动值之间都有8字节的间隔。
我也发现了这个有趣的回复https://stackoverflow.com/a/27496984/13741865它显示了不同的可能情况,但对我来说,理解起来有点复杂,因为它没有注释,我很想知道哪个公式适用于哪个旋转(对于XYZ情况(。
我还处于组装的早期发展阶段,可能对术语还不够了解。
我希望我已经补充了所有可能的细节,我提前感谢您的关注。
问题在于公式本身,维基百科中提供的souce代码是为ZYX顺序制作的(上面对代码进行了评论,我没有注意到(。
我所做的是花时间阅读这里提供的答案https://stackoverflow.com/a/27496984/13741865,分析代码并修复我制作的代码。
这提供了正确的输出
finit
fld dword ptr [WRot]
fld dword ptr [WRot]
fmulp
fld dword ptr [XRot]
fld dword ptr [XRot]
fmulp
faddp
fld dword ptr [YRot]
fld dword ptr [YRot]
fmulp
fsubp
fld dword ptr [ZRot]
fld dword ptr [ZRot]
fmulp
fsubp
fld dword ptr [XRot]
fld dword ptr [YRot]
fmulp
fld dword ptr [WRot]
fld dword ptr [ZRot]
fmulp
fsubp
mov dword ptr [Math],0 //hex of 0
fld dword ptr [Math]
mov dword ptr [Math],40000000 //hex of 2
fld dword ptr [Math]
fsubp
fxch
fmulp
fxch
fpatan
mov dword ptr [Math],42652ee1 //hex of 57.29577951308232
fld dword ptr [Math]
fxch
fmulp
fstp dword [Roll] //Roll value
感谢大家
也许只是算法中的四元数约定与您预期的不同。尝试将四元数的共轭值输入到算法中。即,反转Xrot、Yrot和Zrot输入的符号。不幸的是,根据我的经验,大多数发布在网上的四元数信息很少讨论发布算法的假定四元数约定(包括你提到的四元数来在线链接(。你编码的网站完全有可能采用与四元数在线网站不同的约定。