/// <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); }
/// <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); }
/// <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); }
/// <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; }