/// <summary>
/// Maintains the position of the character's body above the ground.
/// </summary>
/// <param name="supportLocationVelocity">Velocity of the support point connected to the supportEntity.</param>
/// <param name="supportNormal">The normal at the surface where the ray hit the entity.</param>
/// <param name="supportDistance">Distance from the character to the support location.</param>
private void support(Vector3 supportLocationVelocity, Vector3 supportNormal, float supportDistance, float dt)
{
//Put the character at the right distance from the ground.
float supportVerticalVelocity = Math.Max(supportLocationVelocity.Y, -0.1f);
float heightDifference = this.SupportHeight - supportDistance;
this.Body.Position += (new Vector3(0, MathHelper.Clamp(heightDifference, (supportVerticalVelocity - 10.0f) * dt, (supportVerticalVelocity + 10.0f) * dt), 0));
//Remove from the character velocity which would push it toward or away from the surface.
//This is a relative velocity, so the velocity of the body and the velocity of a point on the support entity must be found.
float bodyNormalVelocity = Vector3.Dot(this.Body.LinearVelocity, supportNormal);
float supportEntityNormalVelocity = Vector3.Dot(supportLocationVelocity, supportNormal);
Vector3 diff = (bodyNormalVelocity - supportEntityNormalVelocity) * -supportNormal;
diff.Y = Math.Max(diff.Y, 0);
this.Body.LinearVelocity += diff;
BEPUphysics.Entities.Entity supportEntity = this.SupportEntity;
if (supportEntity != null && supportEntity.IsAffectedByGravity)
{
Vector3 supportLocation = this.SupportLocation;
Vector3 impulse = (this.Body.Mass * 1.5f) * ((Space)this.Space).ForceUpdater.Gravity * dt;
supportEntity.ApplyImpulse(ref supportLocation, ref impulse);
supportEntity.ActivityInformation.Activate();
}
}