我需要从右边翻转四元数:
x = left to right
y = front to back
z = top to bottom
到左手坐标在哪里:
x = left to right
y = top to bottom
z = front to back
我该怎么做呢?
我不认为这些答案中的任何一个是正确的.
Andres是正确的,四元数没有手性.Handedness(或者我称之为"轴惯例"是人类应用的属性;它是我们将"向前,向右,向上"的概念映射到X,Y,Z轴的方式.
这些都是真的:
要改变四元数的基础,比如从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是一个简单的矩阵(例如,仅使用轴交换),您可以更快地完成.但是你应该通过扩展这里完成的数学来得到更快的方法.
我认为解决方法是:
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)
好吧,为了清楚起见,四元数实际上并没有用手.它们是无用的(参见维基百科关于四元数的文章).但是,从四元数转换为矩阵确实具有与之相关的手性.请参阅http://osdir.com/ml/games.devel.algorithms/2002-11/msg00318.html 如果您的代码执行此转换,您可能必须有两个单独的函数才能转换为左手矩阵或右手矩阵矩阵.
希望有所帮助.