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

Math 将四元数从右手坐标系转换为左手坐标系,math,graphics,3d,Math,Graphics,3d,在我的3d程序中,对象的旋转由四元数表示,如[0.130526,0.0,0.0,0.991445]。该程序使用右手坐标系,Z轴指向上(与3ds max中类似): 另一方面,我的应用程序使用左手坐标系,Y轴向上: 如何将四元数从一个坐标系转换到另一个坐标系,相对于哪个轴向上?角度x围绕轴(u,v,w)的旋转可以用四元数表示,四元数的实部cos(x/2)和虚部sin(x/2)*(u,v,w) 如果轴坐标在原始三面体中为(u,v,w),则它们在您的三面体中为(u,w,v) 因此,如果原始四元数是(

在我的3d程序中,对象的旋转由四元数表示,如
[0.130526,0.0,0.0,0.991445]
。该程序使用右手坐标系,Z轴指向上(与3ds max中类似):

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


如何将四元数从一个坐标系转换到另一个坐标系,相对于哪个轴向上?

角度x围绕轴(u,v,w)的旋转可以用四元数表示,四元数的实部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)来表示。

这是一个稍微不同的问题的浓缩版本

即使两个坐标系是同一个坐标系,您所问的问题也会出现;事实证明,惯用手的翻转并不会使问题变得更难。下面是一般的操作方法。要更改四元数的基,请从ROS(右手,Z向上)更改为Unity(左手,Y向上):

第1-4行是简单的方法:“如何在矩阵上执行基础更改?”

第5行很有趣;并非所有矩阵都转换为四元数,但如果ros_到_的单位正确,则此转换将成功


请注意,这将给您一个正确的结果,但它需要经过大量的工作——矩阵之间的转换,一些乘法,一个求逆。但是你可以检查它的结果,然后写一个重新排列或翻转轴的特例版本,比如aka.nice派生的版本。

可能重复@PaulR你引用的问题是5yo,涵盖了我问题的一半(交换轴),并且没有得到回答(除了“你不能”当我清楚地看到它每天都在工作时——一些软件能够将它们转换为模型导出,但不幸的是,我没有它的源代码。)@PolGraphic现在这个问题有了一个很好的答案!我将在这里总结相关要点。只是为了确认:
a
是本例中的旋转角度,
b
=
u
c
=
v
d
=
w
,对吗?@calvin a是四元数cos(x/2)的实部,旋转角度是x。b、 c,d是四元数的非真实部分,等于轴坐标u,v,w乘以sin(x/2)作为后续,如何将位置坐标从右手改为左手?假设我有(x1,y1,z1),我把它转换成(x1,-y1,z1)就足够了吗?
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);