我有点困惑,无法解释这种行为:
Vector3 k = new Vector3(Mathf.NegativeInfinity, Mathf.NegativeInfinity,Mathf.NegativeInfinity);
Debug.Log(k==k); // evaluates to False
尽管
Debug.Log(Mathf.Mathf.NegativeInfinity == Mathf.Mathf.NegativeInfinity)
// evaluates to True as expected
我正在使用Unity版本5.3.5f1。
最佳答案
从Unity的documentation中,==
返回“对于真正接近相等的向量为true”。但是,当对x,y,z使用负无穷大初始化Vector时,此实现会产生问题。
让我们看看如何为==
定义Vector3
:
public static bool operator == (Vector3 lhs, Vector3 rhs) {
return Vector3.SqrMagnitude (lhs - rhs) < 9.999999E-11;
}
在执行
SqrMagnitude
之前,它将首先执行lhs - rhs
,因此让我们看一下-
的定义方式:public static Vector3 operator - (Vector3 a, Vector3 b) {
return new Vector3 (a.x - b.x, a.y - b.y, a.z - b.z);
}
但是,由于a.x,b.x ...等,这对于正常数字是很好的。如果是
Mathf.NegativeInfinity
,则减法将导致NaN
。现在,当它执行sqrMagnitude
时:public float sqrMagnitude {
get {
return this.x * this.x + this.y * this.y + this.z * this.z;
}
}
这也将返回
NaN
。在docs中,我们注意到以下内容:
因此,当我们回到此代码时:
return Vector3.SqrMagnitude (lhs - rhs) < 9.999999E-11;
它简化为
return NaN < 9.999999E-11;
,它将按照文档中的说明返回False
。另外,
Debug.Log(Mathf.Mathf.NegativeInfinity == Mathf.Mathf.NegativeInfinity)
表现出预期效果的原因已记录为here。