Ejemplo n.º 1
0
        /// <summary>
        /// Casts a ray into the scene and returns the first intersected collidable object.
        /// </summary>
        /// <param name="startposition">World space start position of the ray.</param><param name="endposition">World space end position of the ray.</param><param name="firsthit">Output intersection information.</param>
        /// <returns>
        /// Returns true if an intersection occurs.
        /// </returns>
        public bool RayCast(Vector3 startposition, Vector3 endposition, out RayCollisionPoint firsthit)
        {
            Ray   ray;
            float length;

            if (!TestRay(ref startposition, ref endposition, out ray, out length))
            {
                firsthit = new RayCollisionPoint();
                return(false);
            }

            return(RayCast(ray, length, out firsthit));
        }
Ejemplo n.º 2
0
        public static RayCollisionPoint GetCollision(Ray ray, BoundPlaneCollision plane)
        {
            RayCollisionPoint rcp = RayOnPlaneCollision.GetCollision(ray, plane, out float s1, out float s2);

            if (!rcp.DidCollide)
            {
                return(rcp);
            }

            rcp.SetCollide(plane.Restriction(s1, s2));

            return(rcp);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Casts a ray into the scene and returns all intersected collidable object.
        /// </summary>
        /// <param name="hits">Resulting intersection information.</param><param name="ray">Normalized world space ray.</param><param name="castdistance">Distance to cast ray.</param>
        public void RayCast(List <RayCollisionPoint> hits, Ray ray, float castdistance)
        {
            var results = new List <RayCastResult>();

            if (Space.RayCast(ray, castdistance, results))
            {
                foreach (var result in results)
                {
                    var collisionPoint = new RayCollisionPoint();
                    BuildRayRollisionPoint(ref collisionPoint, result);
                    hits.Add(collisionPoint);
                }
            }
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Casts a ray into the scene and returns the first intersected collidable object.
        /// </summary>
        /// <param name="ray">Normalized world space ray.</param><param name="castdistance">Distance to cast ray.</param><param name="firsthit">Output intersection information.</param>
        /// <returns>
        /// Returns true if an intersection occurs.
        /// </returns>
        public bool RayCast(Ray ray, float castdistance, out RayCollisionPoint firsthit)
        {
            RayCastResult result;

            if (!Space.RayCast(ray, castdistance, out result))
            {
                firsthit = new RayCollisionPoint();
                return(false);
            }

            firsthit = new RayCollisionPoint();
            BuildRayRollisionPoint(ref firsthit, result);
            return(true);
        }
Ejemplo n.º 5
0
        private void BuildRayRollisionPoint(ref RayCollisionPoint rayCollisionPoint, RayCastResult rayCastResult)
        {
            rayCollisionPoint.ContactTime   = rayCastResult.HitData.T;
            rayCollisionPoint.ContactPoint  = rayCastResult.HitData.Location;
            rayCollisionPoint.SurfaceNormal = rayCastResult.HitData.Normal;
            if (rayCollisionPoint.SurfaceNormal != Vector3.Zero)
            {
                rayCollisionPoint.SurfaceNormal.Normalize();
            }

            var collisionObject = rayCastResult.HitObject.Tag as ICollisionObject;

            if (collisionObject != null)
            {
                rayCollisionPoint.ContactObject = collisionObject;
                rayCollisionPoint.Material      = collisionObject.DefaultCollisionMaterial;
            }
        }
Ejemplo n.º 6
0
        public RayCollisionPoint CollideRay(Ray ray)
        {
            // get all objects
            var collidables = ColliderObjects.GetAllObjects((GameObject go) => go is ICollidable);

            var nearestCollision = new RayCollisionPoint();

            foreach (var collidable in collidables)
            {
                //Console.WriteLine($"Testing RCP with {collidable}");

                RayCollisionPoint rcp = CollisionManager.GetRayCollision(ray, collidable.Collision);

                // check if the point is closer
                if (rcp.DidCollide && rcp.RayDistance < nearestCollision.RayDistance && rcp.RayDistance >= 0.0f)
                {
                    nearestCollision = rcp;
                }
            }


            return(nearestCollision);
        }