public RayIntersection FindFirstIntersection(Ray ray) { IList<RayIntersection> intersections = new List<RayIntersection>(); foreach (IRenderObject o in renderables) { RayIntersection intersection = o.FindFirstIntersection(ray); if (intersection != null) { intersections.Add(intersection); } } RayIntersection closestIntersection = null; float minDistance = float.MaxValue; foreach (RayIntersection ri in intersections) { float distance = Vector3f.Distance(ri.Position, ray.Start); if (distance < minDistance) { minDistance = distance; closestIntersection = ri; } } return closestIntersection; }
public RenderData CastEyeRay(Ray ray, Scene scene) { RayLifetimeManager rayManager = new RayLifetimeManager(ray, scene, renderModel); RenderData rayCastResult = rayManager.DoRayCast(); if (rayCastResult == null) { return new RenderData(new Color(0, 0, 0)); } return rayCastResult; }
public RayIntersection FindFirstIntersection(Ray ray) { Vector3f dist = ray.Start - position; float a = ray.Direction * ray.Direction; float b = 2.0f * (dist * ray.Direction); float c = (dist * dist) - (radius * radius); float d = b * b - (4.0f * a * c); //Discrimant of quadraditic equation if (d < 0.0f) { return null; //No collision } float t = (-b - d) / (2 * a); Vector3f collision = (t * ray.Direction) + ray.Start; return new RayIntersection(ray, this, collision, (ray.Start), materialData); }