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); } }