在Unity中有没有一种方法可以计算两个3D向量之间的实际角度?Vector3.Angle提供两个向量之间的最短角度。我想知道按顺时针方向计算得出的实际角度。
在Unity中有没有一种方法可以计算两个3D向量之间的实际角度?Vector3.Angle提供两个向量之间的最短角度。我想知道按顺时针方向计算得出的实际角度。
这应该是你需要的内容。 a
和b
是您想计算角度的向量,n
将是您所谓的“顺时针/逆时针”的平面法线。
float SignedAngleBetween(Vector3 a, Vector3 b, Vector3 n){
// angle in [0,180]
float angle = Vector3.Angle(a,b);
float sign = Mathf.Sign(Vector3.Dot(n,Vector3.Cross(a,b)));
// angle in [-179,180]
float signed_angle = angle * sign;
// angle in [0,360] (not used but included here for completeness)
//float angle360 = (signed_angle + 180) % 360;
return signed_angle;
}
为简单起见,我重复使用 Vector3.Angle
,然后从平面法线n
与a
和b
的叉积(垂直向量)之间的角度大小计算符号。
float sign = Mathf.Sign(Vector3.Dot(n,Vector3.Cross(a,b)));
。 - Ugo Heda
和b
定义了一个平面,但是有一个隐含的第三个向量,即前两个向量的叉积,它定义了平面的法线。任何a
和b
之间的角度都会围绕着第三个轴旋转。所以问题是我们应该如何旋转?两个向量之间的角度始终是正角度。Vector3.Angle(a,b) == Vector3.Angle(b,a)
。为了找到旋转方向,我们使用您确定的线路,它基本上只是将用户定义的旋转轴n
与隐式轴进行比较。如果匹配,则符号为正,否则符号为负。 - Jerdak如果你只使用加法和减法,这很容易。看这个例子:
/Degrees
float signedAngleBetween (Vector3 a, Vector3 b, bool clockwise) {
float angle = Vector3.angle(a, b);
//clockwise
if( Mathf.Sign(angle) == -1 && clockwise )
angle = 360 + angle;
//counter clockwise
else if( Mathf.Sign(angle) == 1 && !clockwise)
angle = - angle;
return angle;
}
尝试使用Vector3.Angle(targetDir, forward);
由于您想要它们之间的最短角度,所以如果返回的值大于180度,则只需用这个值减去360度。
请查看http://answers.unity3d.com/questions/317648/angle-between-two-vectors.html
Vector3.Angle
指出:“返回的角度始终是锐角...永远不会大于180度”。因此,这个答案不仅回答了问题的问题,而且还包含误导性或错误的信息。 - House