language-agnostic - 是否有将四元数旋转转换为欧拉角旋转的算法?

标签 language-agnostic math animation quaternions euler-angles

是否有将旋转的四元数表示转换为欧拉角表示的现有算法?欧拉表示的旋转顺序是已知的,可以是六种排列中的任何一种(即 xyz、xzy、yxz、yzx、zxy、zyx)。我见过固定旋转顺序的算法(通常是 NASA 航向、倾斜、滚动约定),但没有看到任意旋转顺序的算法。
此外,由于单个方向有多个欧拉角表示,因此该结果将是模棱两可的。这是可以接受的(因为方向仍然有效,它可能不是用户期望看到的方向),但是如果有一种算法可以接受旋转限制(即自由度的数量和每个自由度的限制)考虑在内,并在给定这些约束的情况下产生“最合理的”欧拉表示。
我感觉这个问题(或类似的问题)可能存在于 IK 或刚体动力学领域。

只是为了澄清 - 我知道如何从四元数转换为所谓的“Tait-Bryan” ' 代表——我称之为“美国宇航局”公约。这是 zxy 的旋转顺序(假设“Z”轴向上的约定)。我需要一个所有轮换顺序的算法。
可能的解决方案是采用 zxy 顺序转换并从中导出其他五个用于其他旋转顺序的其他转换。我想我希望有一个更“总体”的解决方案。无论如何,我很惊讶我无法找到现有的解决方案。
此外,这也许应该是一个单独的问题,任何转换(当然,假设旋转顺序已知)都将选择一种欧拉表示,但实际上有很多。例如,给定 yxz 的旋转顺序,两个表示 (0,0,180) 和 (180,180,0) 是等效的(并且会产生相同的四元数)。有没有办法使用自由度的限制来约束解决方案?就像您在 IK 和刚体动力学中所做的那样?即在上面的示例中,如果关于 Z 轴只有一个自由度,则可以忽略第二个表示。

我在 this pdf 中找到了一篇可能是算法的论文。但我必须承认我发现逻辑和数学有点难以理解。当然还有其他解决方案吗?任意轮换顺序真的这么少见吗?肯定每个允许骨骼动画与四元数插值(即 Maya、Max、Blender 等)一起使用的主要 3D 软件包都必须完全解决这个问题?

最佳答案

这看起来像是一个被忽视的旧技术的经典案例——我设法挖出了一份 Graphics Gems IV从车库看,看起来 Ken Shoemake 不仅有一个算法可以从任意旋转顺序的欧拉角转换,而且还回答了我关于这个主题的大多数其他问题。书籍万岁。如果我能投票支持 Shoemake 先生的答案并奖励他声望点就好了。
我想建议任何使用欧拉角的人都应该从他们本地的图书馆获得一份 Graphics Gems IV 并阅读从第 222 页开始的部分。它必须是我读过的对问题最清晰、最简洁的解释。

这是我找到的有用链接 - http://www.cgafaq.info/wiki/Euler_angles_from_matrix - 这遵循与 Shoemake 相同的系统;旋转顺序的 24 种不同排列被编码为四个单独的参数 - 内轴、奇偶校验、重复和帧 - 然后允许您将算法从 24 种情况减少到 2 种情况。通常可能是一个有用的 wiki - 我还没来之前穿过它。
提供的旧链接似乎已损坏 here是“从旋转矩阵计算欧拉角”的另一个副本
”。

关于language-agnostic - 是否有将四元数旋转转换为欧拉角旋转的算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1031005/

相关文章:

javascript - 移动动画 Accordion 中的所有元素

language-agnostic - i18n 是否有 "portable"格式字符串语法?

multithreading - 对自旋锁感到困惑

algorithm - 如何计算非二次幂字母表的 de Bruijn 序列?

c++ - 使用 pow() 会出错

html - 仅在动画后使用 css 隐藏/删除 div 从 html 占用的空间

algorithm - 从 16 位值中逐行扫描位

database - 数据库级别的国际化

math - Haskell 中的守卫方程

css - 动画 SVG 以间隔运行