【问题标题】:Calculate 3D Euler angle between two 3D vectors?计算两个 3D 向量之间的 3D 欧拉角?
【发布时间】:2014-04-30 14:15:55
【问题描述】:

假设我有 2 个 3D 向量,每个向量都描述 3D 空间中的一个方向(或旋转,但我不确定该术语是否正确)。我将如何计算两个向量之间的差异作为欧拉角?也就是说,如果我将角度应用于第一个向量,它会旋转到等于另一个?我了解欧拉角如何存在问题并且依赖于实现,但我不知道这对我这样的问题有什么影响。

澄清一下,当我说“3D 矢量”时,我指的是您在大多数 3D 建模包或 Unity(这是我正在使用的)中获得的“平移”小工具。

编辑:实际上我只是回顾了我正在使用的“向量”,我所说的并不完全正确。我实际上有 6 个向量,每个旋转 3 个。每个向量都是 3D 空间中从旋转中心偏移的位置。这可能会让一个已经很困难的问题变得几乎不可能,对吧?

附加信息:好的,所以我已经弄清楚了我真正想问的问题(因为这个问题做得很糟糕),它更适用于 Unity ,所以我问了一个更具体的 Unity 问题over on Unity Answers

我通常不理解网上发布的数学公式,所以 C++ 风格的伪代码对我来说是最有帮助的。

任何帮助将不胜感激,如果我的问题缺少某些信息,请询问更多:)

【问题讨论】:

  • 当你说你有 6 个向量时?你的意思是你有 2 个正交向量集,因为你有 2 个完全定义的矩阵,并且你想要从一个空间到另一个空间的变换矩阵,这被分解为欧拉旋转。你使用什么轮换顺序?
  • .... 是英文的?我不知道你刚才说了什么。我可能会在我的问题中使用某些正确的术语,但最好是假设我对...一无所知......好吧,任何事情。

标签: vector 3d rotation unity3d angle


【解决方案1】:

如果您要进行 3d,您需要了解线性代数和矩阵表示法。[1]仿射 4x4 矩阵是我见过的所有 3d 应用程序中空间变换的基础(欧拉角只是提供了描述该矩阵的替代方法)。甚至统一使用矩阵,尽管为了能够有效地执行欧拉-拉格朗日粒子运动方程,他们更喜欢具有分解形式。一个矩阵用 4 个向量对整个空间进行编码。在这种情况下,这在概念上很容易(不是矩阵的唯一用途),矩阵编码方向 x y z 和偏移向量 w。

矩阵表示法有用的原因是:可以操纵普通数学符号等事物。如果你记得从学校解决 x 来自:

a * x = b

两边除以a,得到

a/a * x = b /a ->
x = b / a 

现在,如果您有 2 个空间,每个空间有 3 个向量,那么您基本上在原点有 2 个完全形成的空间。假设向量跨越一个 3D 空间(换句话说,不要全部指向一个平面,如果它们相互正交则更好,在这种情况下,您可以直接使用变换函数)。这意味着你有 3 个空格。所以你的问题是你知道2个空格。您需要知道空间 A -> 空间 B 的空间变换(习惯上给矩阵大写字母以表示它们更复杂)。这是数学上的:

A * X = B

其中 * 是矩阵乘法,A、X 和 B 是变换矩阵。所以然后除以 A,但是没有矩阵除法,幸运的是有逆矩阵除法是乘以逆,所以这就是我们所做的。另外一个注意旋转不是可交换的,所以我们需要指定我们在哪一侧相乘,因为 A 在 X 之前,我们在左侧乘以 A 的倒数。所以我们得到:

A^-1 * A * X = A^-1 * B

其中 ^-1 表示矩阵逆。这简化为:

I * X = A^-1 * B ->
X = A^-1 * B

X 是旋转空间。在统一代码中,这看起来像:

X = A.inverse * B

其中 X、A 和 B 是 Matrix4x4 元素您使用的语言可能有其他约定我在这里使用 java 脚本参考。您可以将此矩阵转换为四元数,然后从那里转换为欧拉角,可以在here 找到一个示例。

如何从向量中形成 A 和 B?只需将起始空间的向量放入 A 的 0-2 列,将目标空间对应于 B 列[2]。

[1] 是的,它是强制性的,它比最初看起来要简单得多。虽然没有它们你可以活得很远,但使用它们并不比说围绕 x 轴来回旋转某某更难。还要学习quats。

[2] 我应该检查一下,但 unity 似乎使用列矩阵,所以应该是正确的

PS:顺便说一句,如果您有嘈杂的数据并且每个实例有超过 3 个向量,那么您可以使用最小二乘法来平均矩阵 t 一个 3 x 3 子矩阵。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多