计算两个3D矢量之间的3D欧拉角?

时间:2014-04-30 14:15:56

标签: vector 3d rotation unity3d angle

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

为了澄清一点,当我说" 3D矢量"时,我正在描绘"翻译"您可以在大多数3D建模软件包或Unity中使用Gizmo(我正在使用它)。

编辑:其实我刚刚审核了"向量"我正在使用,而我所说的并不完全正确。我实际上有6个向量,每个旋转3个。每个矢量是3D空间中偏离旋转中心的位置。这可能使一个已经很难解决的问题几乎不可能,对吗?

其他信息:好的,所以我已经找到了我真正想要问的内容(因为这个问题真的很糟糕),并且它适用更多到Unity,所以我问了一个更具体的Unity问题over on Unity Answers

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

任何帮助都会非常感激,如果我的问题缺少某些信息,请直接询问:)

1 个答案:

答案 0 :(得分: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]我应该检查一下,但是统一似乎使用列矩阵所以它应该是正确的

PS:顺便说一句,如果你有噪声数据,每个实例有3个以上的矢量,那么你可以使用最小二乘法来平均矩阵t 3×3子矩阵。