public Sweep SweepCollideInto(AABBCollider colliding, Vector3D collidingVelocity, AABBCollider[] colliders) { //AABB box = collider.AABB; AABB col = colliding.AABB; Vector3D delta = collidingVelocity; colliders = colliders.OrderBy(c => Vector3D.Distance(col.Position, c.Center)).ToArray(); Sweep nearest = new Sweep(); nearest.Time = 1.0D; nearest.Position = col.Position + delta; for (int i = 0, il = colliders.Length; i < il; i++) { Sweep sweep = this.SweepCollide(colliding, delta, colliders[i]); if (sweep.Time < nearest.Time) { nearest = sweep; } } return(nearest); }
public Sweep SweepCollide(AABBCollider colliding, Vector3D collidingVelocity, AABBCollider collider) { AABB box = colliding.AABB; AABB col = collider.AABB; Vector3D delta = collidingVelocity; Sweep sweep = new Sweep(); if (delta == Vector3D.Zero) { sweep.Position = box.Position; sweep.Hit = this.Collide(colliding, collider); if (sweep.Hit.HasHit) { sweep.Hit.Time = 0.0D; sweep.Time = 0.0D; } else { sweep.Time = 1.0; } return(sweep); } sweep.Hit = new RayBoxCollisionProvider().Collide(new Ray(box.Position, delta, delta.Length), collider, box.Extents); if (sweep.Hit.HasHit) { sweep.Time = WMath.Clamp(sweep.Hit.Time - Physics.Epsilon, 0, 1); sweep.Position = box.Position + delta * sweep.Time; Vector3D direction = delta.Normalized; sweep.Hit.Position = new Vector3D( WMath.Clamp(sweep.Hit.Position.X + direction.X * box.Extents.X, col.Position.X - col.Extents.X, col.Position.X + col.Extents.X), WMath.Clamp(sweep.Hit.Position.Y + direction.Y * box.Extents.Y, col.Position.Y - col.Extents.Y, col.Position.Y + col.Extents.Y), WMath.Clamp(sweep.Hit.Position.Z + direction.Z * box.Extents.Z, col.Position.Z - col.Extents.Z, col.Position.Z + col.Extents.Z) ); } else { sweep.Position = box.Position + delta; sweep.Time = 1.0D; } return(sweep); }