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

cma*_*ann 9 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

我该怎么做呢?

Pau*_*ois 8

我不认为这些答案中的任何一个是正确的.

Andres是正确的,四元数没有手性.Handedness(或者我称之为"轴惯例"是人类应用的属性;它是我们将"向前,向右,向上"的概念映射到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);
Run Code Online (Sandbox Code Playgroud)

第1-4行只是/sf/answers/2766335561/的方法:如何在矩阵上执行基于更改的基础.

第5行很有意思.我们知道mat_to_quat()仅适用于纯旋转矩阵.我们怎么知道m_unity是一个纯粹的旋转?它当然可以想象它不是,因为unityToRos和rosToUnity都有行列式-1(由于手性切换).

手波浪的答案是手性切换两次,因此结果没有手性开关.更深层次的答案与相似变换保留运算符的某些方面这一事实有关,但我没有足够的数学来证明.

请注意,这将为您提供正确的结果,但如果unityToRos是一个简单的矩阵(例如,仅使用轴交换),您可以更快地完成.但是你应该通过扩展这里完成的数学来得到更快的方法.


Men*_*rel 7

我认为解决方法是:

Given:    Right Hand: {w,x,y,z}
Convert:  Left Hand: {-w,z,y,x}
Run Code Online (Sandbox Code Playgroud)

团结一致:

 new Quaternion(rhQz,rhQy,rhQx,-rhQw)
Run Code Online (Sandbox Code Playgroud)


And*_*res 6

好吧,为了清楚起见,四元数实际上并没有用手.它们是无用的(参见维基百科关于四元数的文章).但是,从四元数转换为矩阵确实具有与之相关的手性.请参阅http://osdir.com/ml/games.devel.algorithms/2002-11/msg00318.html 如果您的代码执行此转换,您可能必须有两个单独的函数才能转换为左手矩阵或右手矩阵矩阵.

希望有所帮助.

  • 我认为用户真正要问的是"如何改变我的基础的惯用手段会影响我的旋转四元数?" 这是一个有效的问题.方向是关于向量空间的数据,而不是它的变换(包括四元数和矩阵表示). (3认同)