float.NaN
是未定义的(对于实数)数学运算的结果,例如0 / 0
(从文档中注意,x / 0
其中x != 0
宁愿返回正无穷或负无穷大)或负值的平方根。一旦一个操作中的一个操作者已经是NaN
然后整个操作又返回NaN
。
第二个(负值的平方根)在这里不会发生,因为您使用的是平方值,所以很可能您的向量的大小为0
.
如果您查看Vector2
源代码,您会发现它们的实现Vector2.Angle
或Vector2.SignedAngle
(您应该使用 btw,因为它们已经过测试并且更有效)。
public static float Angle(Vector2 from, Vector2 to)
{
// sqrt(a) * sqrt(b) = sqrt(a * b) -- valid for real numbers
float denominator = (float)Math.Sqrt(from.sqrMagnitude * to.sqrMagnitude);
if (denominator < kEpsilonNormalSqrt)
return 0F;
float dot = Mathf.Clamp(Dot(from, to) / denominator, -1F, 1F);
return (float)Math.Acos(dot) * Mathf.Rad2Deg;
}
// Returns the signed angle in degrees between /from/ and /to/. Always returns the smallest possible angle
public static float SignedAngle(Vector2 from, Vector2 to)
{
float unsigned_angle = Angle(from, to);
float sign = Mathf.Sign(from.x * to.y - from.y * to.x);
return unsigned_angle * sign;
}
在那里你会发现他们检查的第一件事是
float denominator = (float)Math.Sqrt(from.sqrMagnitude * to.sqrMagnitude);
if (denominator < kEpsilonNormalSqrt)
return 0F;
这基本上可以确保两个给定的向量都具有“足够大”的量级,尤其是不是的向量0
;)
长话短说:不要重新发明轮子,而是使用已经内置的Vector2.Angle
或Vector2.SignedAngle