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