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