示例#1
0
        /// <summary>
        /// Raycasts and stops at the first hit.
        /// </summary>
        /// <param name="from">From.</param>
        /// <param name="to">To.</param>
        /// <returns></returns>
        public HitResult Raycast(Vector3 from, Vector3 to)
        {
            var result = new HitResult(); //result.Succeded is false by default

            var fullDistance = (to - from).LengthSquared();

            using (var rcb = new BulletSharp.ClosestRayResultCallback(from, to))
            {
                collisionWorld.RayTest(ref from, ref to, rcb);

                if (rcb.CollisionObject == null)
                {
                    return(result);
                }
                result.Succeeded          = true;
                result.Collider           = (PhysicsComponent)rcb.CollisionObject.UserObject;
                result.Normal             = rcb.HitNormalWorld;
                result.Point              = rcb.HitPointWorld;
                result.FullLength         = fullDistance;
                result.NormalizedDistance = -1.0f;
                result.StartPoint         = from;
            }

            return(result);
        }
示例#2
0
        /// <summary>
        /// Perform a raycast test and return colliding results, using native bullet objects.
        /// </summary>
        /// <param name="bStart">Start ray vector (bullet vector).</param>
        /// <param name="bEnd">End ray vector (bullet vector).</param>
        /// <param name="resultsCallback">BulletSharp results callback.</param>
        internal RaycastResults Raycast(BulletSharp.Math.Vector3 bStart, BulletSharp.Math.Vector3 bEnd, BulletSharp.RayResultCallback resultsCallback)
        {
            // perform the ray test
            _world.RayTestRef(ref bStart, ref bEnd, resultsCallback);

            // create results object to return
            RaycastResults results = new RaycastResults();

            // parse data based on type
            // closest result / closest but not me types:
            if (resultsCallback is BulletSharp.ClosestRayResultCallback)
            {
                // convert to closest results type
                BulletSharp.ClosestRayResultCallback closestReults = resultsCallback as BulletSharp.ClosestRayResultCallback;

                // set results data
                results.HasHit = closestReults.HasHit;
                if (results.HasHit)
                {
                    results.Collisions = new RaycastResults.SingleResult[1];
                    results.Collisions[0].HitFraction     = closestReults.ClosestHitFraction;
                    results.Collisions[0].CollisionNormal = ToMonoGame.Vector(closestReults.HitNormalWorld);
                    results.Collisions[0].CollisionPoint  = ToMonoGame.Vector(closestReults.HitPointWorld);
                    results.Collisions[0].CollisionBody   = (closestReults.CollisionObject.UserObject as BasicPhysicalBody).EcsComponent;
                }
            }
            // all results type
            else if (resultsCallback is BulletSharp.AllHitsRayResultCallback)
            {
                // convert to all results type
                BulletSharp.AllHitsRayResultCallback allResults = resultsCallback as BulletSharp.AllHitsRayResultCallback;

                // set results data
                results.HasHit = allResults.HasHit;
                if (results.HasHit)
                {
                    results.Collisions = new RaycastResults.SingleResult[allResults.CollisionObjects.Count];
                    for (int i = 0; i < allResults.CollisionObjects.Count; ++i)
                    {
                        results.Collisions[i].HitFraction     = allResults.HitFractions[i];
                        results.Collisions[i].CollisionNormal = ToMonoGame.Vector(allResults.HitNormalWorld[i]);
                        results.Collisions[i].CollisionPoint  = ToMonoGame.Vector(allResults.HitPointWorld[i]);
                        results.Collisions[i].CollisionBody   = (allResults.CollisionObjects[i].UserObject as BasicPhysicalBody).EcsComponent;
                    }
                }
            }

            // finally, return parsed results
            return(results);
        }
示例#3
0
        /// <summary>
        /// Raycasts and stops at the first hit.
        /// </summary>
        /// <param name="from">From.</param>
        /// <param name="to">To.</param>
        /// <returns></returns>
        public HitResult Raycast(Vector3 from, Vector3 to)
        {
            var result = new HitResult(); //result.Succeded is false by default

            using (var rcb = new BulletSharp.ClosestRayResultCallback(from, to))
            {
                collisionWorld.RayTest(ref from, ref to, rcb);

                if (rcb.CollisionObject == null)
                {
                    return(result);
                }
                result.Succeeded = true;
                result.Collider  = (Collider)rcb.CollisionObject.UserObject;
                result.Normal    = rcb.HitNormalWorld;
                result.Point     = rcb.HitPointWorld;
            }

            return(result);
        }
示例#4
0
        /// <summary>
        /// Raycasts and stops at the first hit.
        /// </summary>
        /// <param name="from">From.</param>
        /// <param name="to">To.</param>
        /// <returns></returns>
        public HitResult Raycast(Vector3 from, Vector3 to)
        {
            var result = new HitResult(); //result.Succeded is false by default

            using (var rcb = new BulletSharp.ClosestRayResultCallback(from, to))
            {
                collisionWorld.RayTest(ref from, ref to, rcb);

                if (rcb.CollisionObject == null) return result;
                result.Succeeded = true;
                result.Collider = (PhysicsComponent)rcb.CollisionObject.UserObject;
                result.Normal = rcb.HitNormalWorld;
                result.Point = rcb.HitPointWorld;
            }

            return result;
        }