我需要从右边翻转四元数:
x = left to right
y = front to back
z = top to bottom
到左手坐标,其中:
x = left to right
y = top to bottom
z = front to back
我将如何做到这一点?
答案 0 :(得分:7)
我认为这些答案都不正确。
Andres是正确的,四元数没有用手。用手(或者我称之为“轴惯例”)是人类应用的属性;这就是我们如何将“向前,向右,向上”的概念映射到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(由于手性切换)。
请注意,这将为您提供正确的结果,但如果unity_to_ros
是一个简单的矩阵(例如,仅使用轴交换),您可以更快地完成此操作。但是你应该通过扩展这里完成的数学来得到更快的方法。
答案 1 :(得分:6)
好的,为了清楚起见,四元数实际上并没有用手。它们是无用的(参见维基百科关于四元数的文章)。但是,从四元数转换为矩阵确实具有与之相关的手性。见http://osdir.com/ml/games.devel.algorithms/2002-11/msg00318.html 如果您的代码执行此转换,您可能必须有两个单独的函数才能转换为左手矩阵或右手矩阵。
希望有所帮助。
答案 2 :(得分:4)
我认为解决方案是:
Given: Right Hand: {w,x,y,z}
Option 1: Left Hand: {y,-z,-w,-x}
Option 2: Left Hand: {-y,z,w,x} (equivalent)
答案 3 :(得分:0)
答案 4 :(得分:0)
一旦你这样做,你就不再有四元数,即通常的乘法规则 他们不会工作。如果你交换,身份i ^ 2 = j ^ 2 = k ^ 2 = ijk = -1将不再成立 j和k(右手系统中的y和z)。
答案 5 :(得分:0)
我知道这个问题很旧,但是下面的方法已经过测试并且可以工作。 我用pyquaternion操纵四元数。
从右向左移动。 找到右四元数的轴和角度。 然后将轴转换为左手坐标。 取消右手角度以获得左手角度。 用左手轴和左手角构造四元数。