public void HandleMovementRequest( MovementXzRequest request ) { Environment.Environment env = m_Scene.Objects.GetFirstOfType< Environment.Environment >( ); IEnvironmentCollisions collisions = env.EntityCollisions; Vector3 move = new Vector3( request.DeltaX, 0, request.DeltaZ ); Collision col = collisions.CheckMovement( Travel.EndPosition, move ); if ( col == null ) { Travel.EndPosition += move; } else { // Slide... Point3 stopPt = col.CollisionPoint + col.CollisionNormal * 0.1f; Point3 slidePt = stopPt; Vector3 perpCollisionNormal = new Vector3( col.CollisionNormal.Z, col.CollisionNormal.Y, -col.CollisionNormal.X ); float dp = move.MakeNormal( ).Dot( perpCollisionNormal ); float slideBias = 0.4f; float mod = ( dp < 0 ) ? -Functions.Pow( -dp, slideBias ) : Functions.Pow( dp, slideBias ); slidePt += perpCollisionNormal * ( move.Length * ( 1 - col.T ) * mod ); if ( !collisions.IsPointInObstacle( slidePt ) ) { Travel.EndPosition = slidePt; } else { Travel.EndPosition = stopPt; } } }
public void HandleMovement( MovementXzRequest movement ) { NextPosition += new Vector3( movement.DeltaX, 0, movement.DeltaZ ); }