static float CalculateSqrDistance(Vector3 rkPoint, Bounds rkBox) { Vector3 closest = rkPoint - rkBox.GetCenter(); float sqrDistance = 0.0f; for (int i = 0; i < 3; ++i) { float clos = closest[i]; float ext = rkBox.GetExtent()[i]; if (clos < -ext) { float delta = clos + ext; sqrDistance += delta * delta; closest[i] = -ext; } else if (clos > ext) { float delta = clos - ext; sqrDistance += delta * delta; closest[i] = ext; } } return(sqrDistance); }
static void CalculateClosestPoint(Vector3 rkPoint, Bounds rkBox, out Vector3 outPoint, out float outSqrDistance) { // compute coordinates of point in box coordinate system Vector3 kClosest = rkPoint - rkBox.GetCenter(); // project test point onto box float fSqrDistance = 0.0f; float fDelta; for (int i = 0; i < 3; i++) { if (kClosest[i] < -rkBox.GetExtent()[i]) { fDelta = kClosest[i] + rkBox.GetExtent()[i]; fSqrDistance += fDelta * fDelta; kClosest[i] = -rkBox.GetExtent()[i]; } else if (kClosest[i] > rkBox.GetExtent()[i]) { fDelta = kClosest[i] - rkBox.GetExtent()[i]; fSqrDistance += fDelta * fDelta; kClosest[i] = rkBox.GetExtent()[i]; } } // Inside if (fSqrDistance == 0.0F) { outPoint = rkPoint; outSqrDistance = 0.0F; } // Outside else { outPoint = kClosest + rkBox.GetCenter(); outSqrDistance = fSqrDistance; } }
static bool IntersectRayAABB(Ray ray, Bounds inAABB, out float outT0, out float outT1) { outT0 = 0; outT1 = 0; float tmin = -Mathf.Infinity; float tmax = Mathf.Infinity; float t0, t1, f; Vector3 p = inAABB.GetCenter() - ray.GetOrigin(); Vector3 extent = inAABB.GetExtent(); int i; for (i = 0; i < 3; i++) { // ray and plane are paralell so no valid intersection can be found { f = 1.0F / ray.GetDirection()[i]; t0 = (p[i] + extent[i]) * f; t1 = (p[i] - extent[i]) * f; // Ray leaves on Right, Top, Back Side if (t0 < t1) { if (t0 > tmin) { tmin = t0; } if (t1 < tmax) { tmax = t1; } if (tmin > tmax) { return(false); } if (tmax < 0.0F) { return(false); } } // Ray leaves on Left, Bottom, Front Side else { if (t1 > tmin) { tmin = t1; } if (t0 < tmax) { tmax = t0; } if (tmin > tmax) { return(false); } if (tmax < 0.0F) { return(false); } } } } outT0 = tmin; outT1 = tmax; return(true); }