I'm trying to get this object to move right across the screen until it gets close to the center and arc down smoothly into a straight downward movement. Here's what I've tried:

if (position.X < -5000)
   Velocity = Vector3.Right * speed;
else if (position.X < -1000)
   Velocity = new Vector3(
   MathHelper.Lerp(Velocity.X, 0, (float)gameTime.ElapsedGameTime.TotalSeconds), 
   MathHelper.Lerp(Velocity.Y, -1, (float)gameTime.ElapsedGameTime.TotalSeconds), 0) 
   * speed;
   Velocity = Vector3.Down * speed;

However, when it gets to where it should be arcing, it just moves to the right at blinding speed and vanishes before it hits the point where it should be going straight down. If I remove the else if, it does a sharp direction shift no problem. What am I doing wrong in that section?


Your problem is (float)gameTime.ElapsedGameTime.TotalSeconds. Those Lerp functions you're using want a value that varies from 0 to 1, while TotalSeconds is going to keep increasing forever.

Maybe instead pass in the amount of time that has passed since the object started turning, and stop lerping after a time of 1?

  • \$\begingroup\$ gameTime.ElapsedGameTime.TotalSeconds is going to be the time since the last update. You're thinking of gameTime.TotalGameTime.TotalSeconds, which is the total from the start of the game. \$\endgroup\$ – Fibericon Mar 14 '12 at 3:17
  • \$\begingroup\$ Whoops! Either way, it's not the value that he actually wants to be passing into the Lerp. \$\endgroup\$ – Trevor Powell Mar 14 '12 at 4:58

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.