将四元数从右手坐标系转换为左手坐标系

问题描述 投票:9回答:2

我的3D程序,对象的旋转由像[0.130526, 0.0, 0.0, 0.991445]的四元数表示。该程序使用右手坐标系,Z轴朝上(如3ds max):

另一方面,我的应用程序使用左手坐标系,Y轴向上:

如何将四元数从一个坐标系转换为另一个坐标系,并考虑哪个轴是向上的?

math graphics 3d
2个回答
12
投票

围绕轴(u,v,w)的角度x的旋转可以由具有实部cos(x / 2)和虚部sin(x / 2)*(u,v,w)的四元数表示。

如果原始三面体中的轴坐标为(u,v,w),则它们将在您的三面体中为(u,w,v)。

因此,如果原始四元数是(a,b,c,d) - a + ib + jc + kd - 四元数必须转换为三面体中的(a,b,d,c)。

编辑

但由于你的三面体是左撇子,角度也必须反转,所以最终可以用你的三面体中的四元数(a,-b,-d,-c)表示相同的旋转。


1
投票

这是an answer的浓缩版本,略有不同的问题。

即使两个坐标系是同一个,你问的问题也会出现;事实证明,用手翻转不会使问题变得更加困难。这是一般的方法。要改变四元数的基础,比如从ROS(右手,Z向上)到Unity(左手,Y向上):

mat3x3 ros_to_unity = /* construct this by hand by mapping input axes to output axes */;
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行很有意思;并非所有矩阵都转换为quats,但如果ros_to_unity正确,则此转换将成功。

请注意,这将为您提供正确的结果,但它会经历大量的工作 - 转换为矩阵,有些乘法,转换。但是你可以检查它的结果,然后编写一个重新排列或翻转轴的特殊情况版本,比如一个aka.nice派生的。

© www.soinside.com 2019 - 2024. All rights reserved.