首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将四元数从右手坐标翻转到左手坐标

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

Stack Overflow用户
提问于 2009-08-13 22:19:55
回答 6查看 21.4K关注 0票数 11

我需要从右翻转一个四元数:

x = left to right

y = front to back

z = top to bottom

到左手坐标,其中:

x = left to right

y = top to bottom

z = front to back

我该怎么做呢?

EN

回答 6

Stack Overflow用户

发布于 2016-09-16 04:08:58

我认为这些答案中没有一个是正确的。

Andres说四元数没有利手(*)是正确的。利手性(或者我称之为“轴约定”)是人类应用的一种属性;它是我们将“向前、向右、向上”的概念映射到X、Y、Z轴的方式。

这些事情都是真的:

不正确的旋转矩阵(正交、行列式1等)可以转换为单位四元数并返回,恢复原始的不是纯旋转的矩阵(具有行列式-1的矩阵,例如翻转单轴的矩阵)也称为“不正确的旋转”,并且不能转换为单位四元数并返回。您的mat_to_quat()例程可能不会崩溃,但它不会给您正确的答案(在这种意义上,交换惯用手的quat_to_mat(mat_to_quat(M)) == M).

  • A变基的行列式为-1。这是一个不正确的旋转:相当于一个围绕原点的镜像组成的旋转(可能是身份)。

要更改四元数的基数,例如从ROS (右手)更改为Unity (左手),我们可以使用的方法。

代码语言:javascript
代码运行次数:0
运行
复制
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是一个简单的矩阵(例如,仅通过轴交换),您可能会更快地完成此操作。但您可能应该通过扩展这里完成的数学运算来推导出更快的方法。

(*)实际上,Hamilton和JPL四元数之间是有区别的;但是每个人都在使用Hamilton,所以没有必要用它来混水摸鱼。

票数 10
EN

Stack Overflow用户

发布于 2017-01-28 21:45:16

我认为解决方案是:

代码语言:javascript
代码运行次数:0
运行
复制
Given:    Right Hand: {w,x,y,z}
Convert:  Left Hand: {-w,z,y,x}

统一地说:

代码语言:javascript
代码运行次数:0
运行
复制
 new Quaternion(rhQz,rhQy,rhQx,-rhQw)
票数 7
EN

Stack Overflow用户

发布于 2009-08-20 23:13:59

好的,先说清楚,四元数实际上并不是用手的。它们是徒手的(参见维基百科上关于四元数的文章)。然而,从四元数到矩阵的转换确实有与之相关的惯用手。参见http://osdir.com/ml/games.devel.algorithms/2002-11/msg00318.html如果您的代码执行此转换,则可能必须使用两个单独的函数来转换为左手矩阵或右手矩阵。

希望这能有所帮助。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1274936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档