Vector 计算两个三维矢量之间的三维欧拉角?

Vector 计算两个三维矢量之间的三维欧拉角?,vector,3d,rotation,unity3d,angle,Vector,3d,Rotation,Unity3d,Angle,假设我有两个3D向量,每个向量描述3D空间中的一个方向(或一个旋转,但我不确定这个术语是否正确)。我如何计算两个向量之间的差作为欧拉角?也就是说,如果我将角度应用于第一个向量,它将旋转以等于另一个向量?我理解Euler角度是如何存在问题并依赖于实现的,但我不知道这对像我这样的问题意味着什么 为了澄清一点,当我说“3D向量”时,我正在描绘在大多数3D建模软件包或Unity(我正在使用)中得到的“翻译”gizmo 编辑:事实上,我刚刚回顾了我正在使用的“向量”,我说的不太正确。实际上我有6个向量,每

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

为了澄清一点,当我说“3D向量”时,我正在描绘在大多数3D建模软件包或Unity(我正在使用)中得到的“翻译”gizmo

编辑:事实上,我刚刚回顾了我正在使用的“向量”,我说的不太正确。实际上我有6个向量,每个旋转3个。每个矢量都是三维空间中偏离旋转中心的位置。这可能使一个已经很难回答的问题几乎不可能,对吗

其他信息:好的,我已经确定了我真正想问的问题(因为这个问题做得很糟糕),它更适用于Unity,所以我问了一个更具体的Unity问题

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


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

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

矩阵表示法之所以有用的原因是:它可以处理像普通数学符号这样的东西。如果你还记得从学校解x:

a * x = b
把两边都除以a,你就得到了

a/a * x = b /a ->
x = b / a 
现在,如果你有两个空间,每个空间有3个向量,那么你的原点就有2个完全形成的空间。假设向量跨越一个三维空间(换句话说,不要把所有的向量都指向一个平面,如果它们彼此正交就更好了,在这种情况下,你可以直接使用变换函数)。这意味着您有3个空格。因此,您的问题是您知道2个空格。您需要知道从空格A->空格B(通常给矩阵加大号表示它们更复杂)的空间变换。这在数学上是:

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

A^-1 * A * X = A^-1 * B
其中^-1表示矩阵逆。这简化为:

I * X = A^-1 * B ->
X = A^-1 * B
X是旋转空间。在unity代码中如下所示:

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

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

[1] 是的,这是必修课,它比一开始看起来要简单得多。虽然没有它们你可以活得很远,但它们并不比说绕x轴旋转某某更难使用。还要学习四元数

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


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

当你说你有6个向量时,你的意思是你有2个正交向量集,就像你有2个完全定义的矩阵,你想从一个spac得到变换矩阵e到另一个,它被分解为euler旋转。你使用什么旋转顺序?…用英语?我不知道你刚才说了什么。我的问题中可能会使用某些正确的术语,但最好假设我对…一无所知。