示例#1
0
        public override IRayHit Intersect(IRay ray)
        {
            IVector p            = ray.Origin;
            IVector u            = ray.Direction;
            IVector v            = new Vector(this.Position, p);
            float   b            = 2 * (v.Dot(u));
            float   c            = v.Dot(v) - this.Radius.X * this.Radius.X;
            float   discriminant = b * b - 4 * c;

            if (discriminant < 0)
            {
                return(null);
            }

            float timeMinus = (b * -1 - ((float)Math.Sqrt(discriminant))) / 2;
            float timePlus  = (b * -1 + ((float)Math.Sqrt(discriminant))) / 2;

            if (timeMinus < 0 && timePlus < 0)
            {
                return(null);
            }

            IVector intersection;
            IVector normal;
            float   timeIntersection;
            bool    incoming;

            if (timeMinus < 0 && timePlus > 0)
            {
                timeIntersection = timePlus;
                intersection     = ray.GetEndAt(timePlus);
                normal           = new Vector(intersection, this.Position);
                incoming         = false;
            }
            else
            {
                timeIntersection = timeMinus;
                intersection     = ray.GetEndAt(timeMinus);
                normal           = new Vector(this.Position, intersection);
                incoming         = true;
            }

            return(new RayHit(ray, this, this, normal.Normalize(), intersection, timeIntersection, incoming));
        }
示例#2
0
        public override IRayHit Intersect(IRay ray)
        {
            float denominator = this.Normal.Dot(ray.Direction);

            if (Math.Abs(denominator) > 0.0f)
            {
                IVector difference = this.Position.Minus(ray.Origin);

                float t = difference.Dot(this.Normal) / denominator;

                if (t > 0.0f)
                {
                    IVector intersectionPoint = ray.GetEndAt(t);

                    return(new RayHit(ray, this, this, this.Normal, intersectionPoint, t, false));
                }
            }

            return(null);
        }