コード例 #1
0
ファイル: Bounds.cs プロジェクト: vladimir-tikhonov/UH5
        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);
        }