Exemple #1
0
        public double?Intersects(BoundingBox box)
        {
            //first test if start in box
            if (Position.X >= box.Min.X &&
                Position.X <= box.Max.X &&
                Position.Y >= box.Min.Y &&
                Position.Y <= box.Max.Y &&
                Position.Z >= box.Min.Z &&
                Position.Z <= box.Max.Z)
            {
                return(0.0f);               // here we concidere cube is full and origine is in cube so intersect at origine
            }
            //Second we check each face
            Vector3 maxT = new Vector3(-1.0f);

            //Vector3 minT = new Vector3(-1.0f);
            //calcul intersection with each faces
            if (Position.X < box.Min.X && Direction.X != 0.0f)
            {
                maxT.X = (box.Min.X - Position.X) / Direction.X;
            }
            else if (Position.X > box.Max.X && Direction.X != 0.0f)
            {
                maxT.X = (box.Max.X - Position.X) / Direction.X;
            }
            if (Position.Y < box.Min.Y && Direction.Y != 0.0f)
            {
                maxT.Y = (box.Min.Y - Position.Y) / Direction.Y;
            }
            else if (Position.Y > box.Max.Y && Direction.Y != 0.0f)
            {
                maxT.Y = (box.Max.Y - Position.Y) / Direction.Y;
            }
            if (Position.Z < box.Min.Z && Direction.Z != 0.0f)
            {
                maxT.Z = (box.Min.Z - Position.Z) / Direction.Z;
            }
            else if (Position.Z > box.Max.Z && Direction.Z != 0.0f)
            {
                maxT.Z = (box.Max.Z - Position.Z) / Direction.Z;
            }

            //get the maximum maxT
            if (maxT.X > maxT.Y && maxT.X > maxT.Z)
            {
                if (maxT.X < 0.0f)
                {
                    return(null);                   // ray go on opposite of face
                }
                //coordonate of hit point of face of cube
                double coord = Position.Z + maxT.X * Direction.Z;
                // if hit point coord ( intersect face with ray) is out of other plane coord it miss
                if (coord < box.Min.Z || coord > box.Max.Z)
                {
                    return(null);
                }
                coord = Position.Y + maxT.X * Direction.Y;
                if (coord < box.Min.Y || coord > box.Max.Y)
                {
                    return(null);
                }
                return(maxT.X);
            }
            if (maxT.Y > maxT.X && maxT.Y > maxT.Z)
            {
                if (maxT.Y < 0.0f)
                {
                    return(null);                   // ray go on opposite of face
                }
                //coordonate of hit point of face of cube
                double coord = Position.Z + maxT.Y * Direction.Z;
                // if hit point coord ( intersect face with ray) is out of other plane coord it miss
                if (coord < box.Min.Z || coord > box.Max.Z)
                {
                    return(null);
                }
                coord = Position.X + maxT.Y * Direction.X;
                if (coord < box.Min.X || coord > box.Max.X)
                {
                    return(null);
                }
                return(maxT.Y);
            }
            else             //Z
            {
                if (maxT.Z < 0.0f)
                {
                    return(null);                   // ray go on opposite of face
                }
                //coordonate of hit point of face of cube
                double coord = Position.X + maxT.Z * Direction.X;
                // if hit point coord ( intersect face with ray) is out of other plane coord it miss
                if (coord < box.Min.X || coord > box.Max.X)
                {
                    return(null);
                }
                coord = Position.Y + maxT.Z * Direction.Y;
                if (coord < box.Min.Y || coord > box.Max.Y)
                {
                    return(null);
                }
                return(maxT.Z);
            }
        }
Exemple #2
0
 public void Intersects(ref BoundingBox box, out double?result)
 {
     result = Intersects(box);
 }