Beispiel #1
0
        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);
        }
Beispiel #2
0
        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;
            }
        }
Beispiel #3
0
        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);
        }