我需要从右边翻转一个四元数:x = left to right
y = front to back
z = top to bottom
到左手坐标,其中:x = left to right
y = top to bottom
z = front to back
我该怎么做呢?
最佳答案
我认为这些答案中的任何一个都不正确。
安德烈斯认为四元数没有手性 (*) 是正确的。惯用手(或我称之为“轴惯例”)是人类应用的属性;这就是我们如何将“向前、向右、向上”的概念映射到 X、Y、Z 轴。
这些事情是真实的:
mat_to_quat()
例程可能不会爆炸,但它不会给你正确的答案(从 quat_to_mat(mat_to_quat(M)) == M
的意义上说)。 要改变四元数的基,比如从 ROS(右手)到 Unity(左手),我们可以使用 的方法。
mat3x3 ros_to_unity = /* construct this by hand */;
mat3x3 unity_to_ros = ros_to_unity.inverse();
quat q_ros = ...;
mat3x3 m_unity = ros_to_unity * mat3x3(q_ros) * unity_to_ros ;
quat q_unity = mat_to_quat(m_unity);
第 1-4 行只是 https://stackoverflow.com/a/39519079/194921 的方法:“你如何在矩阵上执行基变换?”
第 5 行很有趣。我们知道
mat_to_quat()
仅适用于纯旋转矩阵。我们怎么知道m_unity
是纯旋转?当然可以想象它不是,因为unity_to_ros
和 ros_to_unity
两者都具有行列式 -1(作为惯用手切换的结果)。Hand-wavy 的答案是,左撇子切换了两次,所以结果没有左撇子切换。更深层次的答案与相似变换保留了运算符的某些方面这一事实有关,但我没有足够的数学来证明。
请注意,这将为您提供正确的结果,但如果
unity_to_ros
,您可能可以更快地完成此操作。是一个简单的矩阵(比如,只有一个轴交换)。但是您可能应该通过扩展此处完成的数学来推导出更快的方法。(*) 实际上,Hamilton 和 JPL 四元数是有区别的;但每个人都使用汉密尔顿,所以没有必要用它来搅浑水。
关于math - 将四元数从右手坐标翻转到左手坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1274936/