Issue with multiplayer interpolation

Posted by Ben Cracknell on Game Development See other posts from Game Development or by Ben Cracknell
Published on 2014-06-02T02:24:54Z Indexed on 2014/06/02 4:00 UTC
Read the original article Hit count: 434

Filed under:
|

In a fast-paced multiplayer game I'm working on, there is an issue with the interpolation algorithm. You can see it clearly in the image below.

Cyan: Local position when a packet is received

Red: Position received from packet (goal)

Blue: Line from local position to goal when packet is received

Black: Local position every frame

enter image description here

As you can see, the local position seems to oscillate around the goals instead of moving between them smoothly. Here is the code:

    // local transform position when the last packet arrived. Will lerp from here to the goal
    private Vector3 positionAtLastPacket;

    // location received from last packet
    private Vector3 goal;

    // time since the last packet arrived
    private float currentTime;

    // estimated time to reach goal (also the expected time of the next packet)
    private float timeToReachGoal;

    private void PacketReceived(Vector3 position, float timeBetweenPackets)
    {
        positionAtLastPacket = transform.position;

        goal = position;

        timeToReachGoal = timeBetweenPackets;
        currentTime = 0;

        Debug.DrawRay(transform.position, Vector3.up, Color.cyan, 5); // current local position
        Debug.DrawLine(transform.position, goal, Color.blue, 5); // path to goal
        Debug.DrawRay(goal, Vector3.up, Color.red, 5); // received goal position
    }

    private void FrameUpdate()
    {
        currentTime += Time.deltaTime;

        float delta = currentTime/timeToReachGoal;
        transform.position = FreeLerp(positionAtLastPacket, goal, currentTime / timeToReachGoal);

        // current local position
        Debug.DrawRay(transform.position, Vector3.up * 0.5f, Color.black, 5);
    }

    /// <summary>
    /// Lerp without being locked to 0-1
    /// </summary>
    Vector3 FreeLerp(Vector3 from, Vector3 to, float t)
    {
        return from + (to - from) * t;
    }

Any idea about what's going on?

© Game Development or respective owner

Related posts about multiplayer

Related posts about interpolation