/// <summary> /// 检测当前平截头体与指定的平截头体是否相交 /// </summary> /// <param name="frustum">要检测的平截头体</param> /// <returns>如果相交,返回true,否则,返回false</returns> public bool Intersects(BoundingFrustum frustum) { Vector3 closestPoint; if (frustum == null) { throw new ArgumentNullException("frustum"); } if (this.gjk == null) { this.gjk = new Gjk(); } this.gjk.Reset(); Vector3.Sub(ref this.cornerArray[0], ref frustum.cornerArray[0], out closestPoint); if (closestPoint.LengthSquared() < 1E-05f) { Vector3.Sub(ref this.cornerArray[0], ref frustum.cornerArray[1], out closestPoint); } float maxValue = float.MaxValue; float num3 = 0f; do { Vector3 vector2; Vector3 vector3; Vector3 vector4; Vector3 vector5; vector5.X = -closestPoint.X; vector5.Y = -closestPoint.Y; vector5.Z = -closestPoint.Z; this.SupportMapping(ref vector5, out vector4); frustum.SupportMapping(ref closestPoint, out vector3); Vector3.Sub(ref vector4, ref vector3, out vector2); float num4 = ((closestPoint.X * vector2.X) + (closestPoint.Y * vector2.Y)) + (closestPoint.Z * vector2.Z); if (num4 > 0f) { return(false); } this.gjk.AddSupportPoint(ref vector2); closestPoint = this.gjk.ClosestPoint; float num2 = maxValue; maxValue = closestPoint.LengthSquared(); num3 = 4E-05f * this.gjk.MaxLengthSquared; if ((num2 - maxValue) <= (1E-05f * num2)) { return(false); } }while (!this.gjk.FullSimplex && (maxValue >= num3)); return(true); }
/// <summary> /// 检测当前平截头体是否与指定的包围球相交 /// </summary> /// <param name="box">要检测的包围球</param> /// <param name="result">[输出参数] 如果相交,返回true,否则,返回false</param> public void Intersects(ref BoundingSphere sphere, out bool result) { Vector3 unitX; Vector3 vector2; Vector3 vector3; Vector3 vector4; Vector3 vector5; if (this.gjk == null) { this.gjk = new Gjk(); } this.gjk.Reset(); Vector3.Sub(ref this.cornerArray[0], ref sphere.Center, out unitX); if (unitX.LengthSquared() < 1E-05f) { unitX = Vector3.UnitX; } float maxValue = float.MaxValue; float num3 = 0f; result = false; Label_005A: vector5.X = -unitX.X; vector5.Y = -unitX.Y; vector5.Z = -unitX.Z; this.SupportMapping(ref vector5, out vector4); sphere.SupportMapping(ref unitX, out vector3); Vector3.Sub(ref vector4, ref vector3, out vector2); float num4 = ((unitX.X * vector2.X) + (unitX.Y * vector2.Y)) + (unitX.Z * vector2.Z); if (num4 <= 0f) { this.gjk.AddSupportPoint(ref vector2); unitX = this.gjk.ClosestPoint; float num2 = maxValue; maxValue = unitX.LengthSquared(); if ((num2 - maxValue) > (1E-05f * num2)) { num3 = 4E-05f * this.gjk.MaxLengthSquared; if (!this.gjk.FullSimplex && (maxValue >= num3)) { goto Label_005A; } result = true; } } }
/// <summary> /// 检测当前平截头体是否与指定的包围盒相交 /// </summary> /// <param name="box">要检测的包围盒</param> /// <param name="result">[输出参数] 如果相交,返回true,否则,返回false</param> public void Intersects(ref BoundingBox box, out bool result) { Vector3 closestPoint; Vector3 vector2; Vector3 vector3; Vector3 vector4; Vector3 vector5; if (this.gjk == null) { this.gjk = new Gjk(); } this.gjk.Reset(); Vector3.Sub(ref this.cornerArray[0], ref box.Min, out closestPoint); if (closestPoint.LengthSquared() < 1E-05f) { Vector3.Sub(ref this.cornerArray[0], ref box.Max, out closestPoint); } float maxValue = float.MaxValue; float num3 = 0f; result = false; Label_006D: vector5.X = -closestPoint.X; vector5.Y = -closestPoint.Y; vector5.Z = -closestPoint.Z; this.SupportMapping(ref vector5, out vector4); box.SupportMapping(ref closestPoint, out vector3); Vector3.Sub(ref vector4, ref vector3, out vector2); float num4 = ((closestPoint.X * vector2.X) + (closestPoint.Y * vector2.Y)) + (closestPoint.Z * vector2.Z); if (num4 <= 0f) { this.gjk.AddSupportPoint(ref vector2); closestPoint = this.gjk.ClosestPoint; float num2 = maxValue; maxValue = closestPoint.LengthSquared(); if ((num2 - maxValue) > (1E-05f * num2)) { num3 = 4E-05f * this.gjk.MaxLengthSquared; if (!this.gjk.FullSimplex && (maxValue >= num3)) { goto Label_006D; } result = true; } } }