我需要从右翻转一个四元数:
x = left to right
y = front to back
z = top to bottom
到左手坐标,其中:
x = left to right
y = top to bottom
z = front to back
我该怎么做呢?
发布于 2016-09-15 20:08:58
我认为这些答案中没有一个是正确的。
Andres说四元数没有利手(*)是正确的。利手性(或者我称之为“轴约定”)是人类应用的一种属性;它是我们将“向前、向右、向上”的概念映射到X、Y、Z轴的方式。
这些事情都是真的:
不正确的旋转矩阵(正交、行列式1等)可以转换为单位四元数并返回,恢复原始的不是纯旋转的矩阵(具有行列式-1的矩阵,例如翻转单轴的矩阵)也称为“不正确的旋转”,并且不能转换为单位四元数并返回。您的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的行列式(由于用手切换的结果)。
手部挥动的答案是,左撇子正在切换两次,因此结果没有左撇子切换。更深层的答案是,相似性转换保留了运算符的某些方面,但我没有足够的数学知识来证明这一点。
请注意,这将给出正确的结果,但如果unity_to_ros
是一个简单的矩阵(例如,仅通过轴交换),您可能会更快地完成此操作。但您可能应该通过扩展这里完成的数学运算来推导出更快的方法。
(*)实际上,Hamilton和JPL四元数之间是有区别的;但是每个人都在使用Hamilton,所以没有必要用它来混水摸鱼。
发布于 2017-01-28 13:45:16
我认为解决方案是:
Given: Right Hand: {w,x,y,z}
Convert: Left Hand: {-w,z,y,x}
统一地说:
new Quaternion(rhQz,rhQy,rhQx,-rhQw)
发布于 2009-08-20 15:13:59
好的,先说清楚,四元数实际上并不是用手的。它们是徒手的(参见维基百科上关于四元数的文章)。然而,从四元数到矩阵的转换确实有与之相关的惯用手。参见http://osdir.com/ml/games.devel.algorithms/2002-11/msg00318.html如果您的代码执行此转换,则可能必须使用两个单独的函数来转换为左手矩阵或右手矩阵。
希望这能有所帮助。
https://stackoverflow.com/questions/1274936
复制