0
\$\begingroup\$

I am trying to find out a formula that calculates the actual position of a player using his speed and a destination position.

These are the informations I have:

  • Vector3 (X,Y,Z) : Current position
  • Vector3 (X,Y,Z) : Destination position
  • float : Speed

I can manage to calculate the angle between these two vectors, but I can't find an efficient formula to calculate the exact position using the speed at each loop. Do you have an idea?

EDIT*

I finally found a formula, but it's not really working as I want...

private void WalkNew()
{
    float speed = 0.1f;
    float distX = this.DestinationPosition.X - this.Position.X;
    float distZ = this.DestinationPosition.Z - this.Position.Z;
    float distance = (float)Math.Sqrt((distX * distX) + (distZ * distZ)); // distance between A and B positions

    float time = distance / speed;
    float currentTime = Time.GetTickFrom(this.lastMoveTime);
    this.lastMoveTime = Time.GetTick();
    float percentage = currentTime / time;

    if (this.Position.IsInCircle(this.DestinationPosition, 0.1f))
    {
        // We arrived
    }
    else
    {
        this.Position.X += distX / percentage;
        this.Position.Z += distZ / percentage;
    }
}

Any thoughts about this formula ?

Thanks

\$\endgroup\$
1
  • \$\begingroup\$ Dividing by a percentage is not appropriate here. Why not use the formula given by Bálint in the answer below? It will work correctly, even with fractional speeds. \$\endgroup\$
    – DMGregory
    Commented Feb 23, 2017 at 17:28

1 Answer 1

0
\$\begingroup\$

You subtract the current position from the destination position, this way you get a vector pointing to the destination.

You need to normalize this vector (divide it with it's length) and multiple with the speed. You get a velocity vector this way.

Finally you add this to the current position to get the new position.

In pseudo code:

currPos += normalize(dest - currPos) * speed

This way you don't need to uses that many costy function, such as atan2, cos or sin, only a square root.

\$\endgroup\$
4
  • \$\begingroup\$ Thanks for your answer, that's much easier than my old formula using cos and sin. Thank you, I still have an other question about the speed. My speed is between 0 and 1 (current speed is 0.1) so I shouldn't multiply but divide the normalized vector right? \$\endgroup\$
    – user59955
    Commented Feb 20, 2017 at 19:40
  • \$\begingroup\$ @Eastrall Why is your speed between 0 and 1? You generally want to avoid division, because if by any chance speed becomes 0, then it'll probably throw an error \$\endgroup\$
    – Bálint
    Commented Feb 21, 2017 at 7:12
  • \$\begingroup\$ I choose 0 and 1 because I thought it would be simple to implement this kind of formula. Maybe it is better to multiply it by 100 to obtain a % ? like: 0.1 would be 10%; 0 => 0% ; 1 => 100% ; etc... \$\endgroup\$
    – user59955
    Commented Feb 21, 2017 at 8:23
  • \$\begingroup\$ I've edit my main post with the formula \$\endgroup\$
    – user59955
    Commented Feb 23, 2017 at 16:43

You must log in to answer this question.