有没有办法可以计算 Unity 中两个 3D 矢量之间的实际角度?Vector3.Angle 给出两个向量之间的最短角度。我想知道以顺时针方式计算的实际角度。
3 回答
这应该是你需要的。 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
如果您只使用加法和减法,这很容易。看这个:
/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;
}
这就是我的意思:如果我们是顺时针方向并且角度是负数,例如 -170 使其变为 180,则使用这个等式。"180-|angle|+180" 你已经知道角度是负数,所以,使用 "180-(-angle)+180" 并加上 180 的 "360 + angle"。然后如果是顺时针,继续,如果是逆时针,使角度为负,这是因为 360 角度的另一部分(即 360 + 角度的互补)是“360 -(360 + 角度)”或“360 - 360 - 角度”或“(360 - 360) - 角度”,再一次,或“- 角度”。所以我们开始了......你完成的角度。
尝试使用Vector3.Angle(targetDir, forward);
既然你想要它们之间的最短角度,那么如果返回的值超过 180 度,只需用这个值减去 360 度。
查看http://answers.unity3d.com/questions/317648/angle-between-two-vectors.html