从右手到左手坐标翻转四元数

时间:2009-08-13 22:19:55

标签: math 3d

我需要从右边翻转四元数:
x = left to right
y = front to back
z = top to bottom

到左手坐标,其中:
x = left to right
y = top to bottom
z = front to back

我将如何做到这一点?

6 个答案:

答案 0 :(得分:7)

我认为这些答案都不正确。

Andres是正确的,四元数没有用手。用手(或者我称之为“轴惯例”)是人类应用的属性;这就是我们如何将“向前,向右,向上”的概念映射到X,Y,Z轴。

这些都是真的:

  • 纯旋转矩阵(正交,行列式1等)可以转换为单位四元数并返回,恢复原始矩阵。
  • 纯旋转的矩阵(具有行列式-1的矩阵,例如翻转单个轴的矩阵)也称为“不正确的旋转”,并且不能转换为单位四元数和背部。你的mat_to_quat()例程可能不会爆炸,但它不会给你正确答案(在quat_to_mat(mat_to_quat(M)) == M)的意义上。
  • 交换手性的基础变化具有决定因素-1。这是一个不正确的轮换:相当于一个旋转(可能是身份),由一个关于原点的镜像组成。

要改变四元数的基础,比如从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_rosros_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操纵四元数。

从右向左移动。 找到右四元数的轴和角度。 然后将轴转换为左手坐标。 取消右手角度以获得左手角度。 用左手轴和左手角构造四元数。