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

标签 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

我该怎么做呢?

最佳答案

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

安德烈斯认为四元数没有手性 (*) 是正确的。惯用手(或我称之为“轴惯例”)是人类应用的属性;这就是我们如何将“向前、向右、向上”的概念映射到 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);
    

    第 1-4 行只是 https://stackoverflow.com/a/39519079/194921 的方法:“你如何在矩阵上执行基变换?”

    第 5 行很有趣。我们知道 mat_to_quat()仅适用于纯旋转矩阵。我们怎么知道m_unity是纯旋转?当然可以想象它不是,因为unity_to_rosros_to_unity两者都具有行列式 -1(作为惯用手切换的结果)。

    Hand-wavy 的答案是,左撇子切换了两次,所以结果没有左撇子切换。更深层次的答案与相似变换保留了运算符的某些方面这一事实有关,但我没有足够的数学来证明。

    请注意,这将为您提供正确的结果,但如果 unity_to_ros,您可能可以更快地完成此操作。是一个简单的矩阵(比如,只有一个轴交换)。但是您可能应该通过扩展此处完成的数学来推导出更快的方法。

    (*) 实际上,Hamilton 和 JPL 四元数是有区别的;但每个人都使用汉密尔顿,所以没有必要用它来搅浑水。

    关于math - 将四元数从右手坐标翻转到左手坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1274936/

    相关文章:

    Java 数学练习未给出正确答案

    javascript - Math.floor(Math.random() * (Max - Min + 1) + Min) 如何在 JavaScript 中工作? (理论)

    c++ - 用于透视投影的相机旋转

    计算 N 组总成本的算法

    c# - 除法不返回我期望的十进制值

    javascript - 在使用 pdf.js 渲染的 Canvas 上平移 pdf 文件时出现问题?

    qt - 来自向量 x y z 分量的四元数 - 在 Qt 中

    javascript - Three.js:寻找生成对象并为曲线上的对象设置动画

    c++ - HugeInt 的重载除法运算符

    opencv - OpenCV 3d重建:编译错误模棱两可的调用重载函数