예제 #1
0
        public override bool Intersect(Ray ray, ref Hit hit, float tmin = 0f, float tmax = float.MaxValue)
        {
            Vector3 oc = ray.origin - center;
            // Le rayon pointe-t-il vers la sphere ?
            float b = Vector3.Dot(oc, ray.direction);
            // Le rayon est-t-il suffisamment proche ?
            float c            = Vector3.Dot(oc, oc) - radius * radius;
            float discriminant = b * b - c;

            if (discriminant > 0f)
            {
                float sqrD = (float)Math.Sqrt(discriminant);
                float t    = (-b - sqrD);
                if (t < tmax && t > tmin)
                {
                    hit.point  = ray.Eval(t);
                    hit.normal = (hit.point - center);
                    hit.normal.Normalize();
                    return(true);
                }
                t = (-b + sqrD);
                if (t < tmax && t > tmin)
                {
                    hit.point  = ray.Eval(t);
                    hit.normal = (hit.point - center);
                    hit.normal.Normalize();
                    hit.t = t;
                    return(true);
                }

                return(false);
            }
            else
            {
                return(false);
            }
        }