C# 如何计算两个向量之间的角度,以进行旋转?

C# 如何计算两个向量之间的角度,以进行旋转?,c#,opengl,math,unity3d,directx,C#,Opengl,Math,Unity3d,Directx,我有两个原点相同的向量,我只想旋转一个来匹配另一个。然而,我就是找不到能够计算两者之间的x角、y角和z角(世界坐标)的数学。 在局部坐标中也可以得到这个角度,我不知道这是否有帮助,但是围绕前向向量(局部Y)的旋转可以是任何不重要的东西。我只需要我的目标朝向正确的方向 我该怎么办?有很多方法可以做到这一点。首先让我建议使用叉积,因为它比大多数备选方案(如四元数)更容易理解,并且可能为您指明正确的方向 基本上,两个向量(a和b)之间的叉积会产生第三个向量(c),它与这两个向量垂直。值得注意的是,第三

我有两个原点相同的向量,我只想旋转一个来匹配另一个。然而,我就是找不到能够计算两者之间的x角、y角和z角(世界坐标)的数学。 在局部坐标中也可以得到这个角度,我不知道这是否有帮助,但是围绕前向向量(局部Y)的旋转可以是任何不重要的东西。我只需要我的目标朝向正确的方向


我该怎么办?

有很多方法可以做到这一点。首先让我建议使用叉积,因为它比大多数备选方案(如四元数)更容易理解,并且可能为您指明正确的方向

基本上,两个向量(
a
b
)之间的叉积会产生第三个向量(
c
),它与这两个向量垂直。值得注意的是,第三个向量的长度正好是
length(a)*length(b)*sin(θ)
,其中θ是
a
b
之间的角度

下面是它的外观:

c.x = a.y * b.z - a.z * b.y
c.y = a.z * b.x - a.x * b.z
c.z = a.x * b.y - a.y * b.x
一个非常简单的公式

现在的技巧是规范化
a
b
。这意味着将其长度设置为1。这是通过取向量并将每个分量除以其长度来实现的

length_a = sqrt(a_old.x * a_old.x + a_old.y * a_old.y + a_old.z * a_old.z)
a.x = a_old.x / length_a
a.y = a_old.y / length_a
a.z = a_old.z / length_a
使用两个归一化向量作为叉积的输入将导致
c
的长度为
1*1*sin(θ)
或仅
sin(θ)

(另一种选择是,您也可以使用点产品,正如Dmitry Bychenko在评论中指出的那样)


下一步你能做什么?现在,您可以使用旋转手柄围绕向量
c
自由旋转
a
b
。但是请注意,要做到这一点,您需要再次规范化
c

有很多方法。首先让我建议使用
叉积
,因为它比大多数备选方案(如四元数)更容易理解,并且可能为您指明正确的方向

基本上,两个向量(
a
b
)之间的叉积会产生第三个向量(
c
),它与这两个向量垂直。值得注意的是,第三个向量的长度正好是
length(a)*length(b)*sin(θ)
,其中θ是
a
b
之间的角度

下面是它的外观:

c.x = a.y * b.z - a.z * b.y
c.y = a.z * b.x - a.x * b.z
c.z = a.x * b.y - a.y * b.x
一个非常简单的公式

现在的技巧是规范化
a
b
。这意味着将其长度设置为1。这是通过取向量并将每个分量除以其长度来实现的

length_a = sqrt(a_old.x * a_old.x + a_old.y * a_old.y + a_old.z * a_old.z)
a.x = a_old.x / length_a
a.y = a_old.y / length_a
a.z = a_old.z / length_a
使用两个归一化向量作为叉积的输入将导致
c
的长度为
1*1*sin(θ)
或仅
sin(θ)

(另一种选择是,您也可以使用点产品,正如Dmitry Bychenko在评论中指出的那样)


下一步你能做什么?现在,您可以使用旋转手柄围绕向量
c
自由旋转
a
b
。但是请注意,您需要再次规范化
c

angle=Math.Acos((x1*x2+y1*y2+z1*z2)/Math.Sqrt(x1*x1+y1*y1+z1*z1)/Math.Sqrt(x2*x2+y2*y2+z2*z2))
?这是两个右边的角度?我需要xAngle、yAngle和zAngle来进行旋转。好吧,你必须定义什么是
xAngle
;如果它是
(1,0,0)
向量和给定向量之间的角度,
xAngle=Math.Acos(x1/Math.Sqrt(x1*x1+y1*y1+z1*z1))
;差异(你必须旋转的程度)
xAngleDelta=Math.Acos(x1/Math.Sqrt(x1*x1+y1*y1+z1*z1))-Math.Acos(x2/Math.Sqrt(x2*x2+y2*y2+z2*z2))
角度=Math.Acos((x1*x2+y1*y2+z1*z2)/Math.Sqrt(x1*x1+y1+y1+z1*z1)/Math.Sqrt(x2*x2+y2+y2*z2))这是两者之间的直角?我需要xAngle、yAngle和zAngle来进行旋转。好吧,你必须定义什么是
xAngle
;如果它是
(1,0,0)
向量和给定向量之间的角度,
xAngle=Math.Acos(x1/Math.Sqrt(x1*x1+y1*y1+z1*z1))
;差异(必须旋转多少)
xAngleDelta=Math.Acos(x1/Math.Sqrt(x1*x1+y1*y1+z1*z1))-Math.Acos(x2/Math.Sqrt(x2*x2+y2*y2+z2*z2))