Extrapolation Rotation Bug

Post here your questions about SFS2X. Here we discuss all server-side matters. For client API questions see the dedicated forums.

Moderators: Lapo, Bax

maxxsby
Posts: 22
Joined: 09 Jan 2023, 07:23

Extrapolation Rotation Bug

Postby maxxsby » 15 Feb 2023, 03:14

Hi, I'm trying to make an extrapolation for my multiplayer rotation, it went smooth but it also went buggy (360 no scope) whenever it Lerps from positive to negative.

You can see what I mean by seeing this

Here's my code for extrapolation:

Code: Select all

    private NetworkTransform[] bufferedStates = new NetworkTransform[20];
          private void Update() {
                // If the value we have is too old, use extrapolation based on 2 latest positions
                float extrapolationLength = Convert.ToSingle(currentTime - bufferedStates[0].TimeStamp) / 1000.0f;
                if (mode == InterpolationMode.EXTRAPOLATION && extrapolationLength < extrapolationForwardTime &&
                statesCount > 1)
                {
                    Vector3 dif = bufferedStates[0].Position - bufferedStates[1].Position;
                    Vector3 difR = bufferedStates[0].RotationY - bufferedStates[1].RotationY;
                    float distance = Vector3.Distance(bufferedStates[0].Position, bufferedStates[1].Position);
                    float distanceR = Vector3.Distance(bufferedStates[0].RotationY, bufferedStates[1].RotationY);
                    float timeDif = Convert.ToSingle(bufferedStates[0].TimeStamp - bufferedStates[1].TimeStamp) / 1000.0f;

                    if (Mathf.Approximately(distance, 0) || Mathf.Approximately(timeDif, 0))
                    {
                        transform.position = bufferedStates[0].Position;
                        transform.rotation = bufferedStates[0].Rotation;
                        return;
                    }

                    float speed = distance / timeDif;
                    float speedR = distanceR / timeDif;

                    dif = dif.normalized;
                    Vector3 expectedPosition = bufferedStates[0].Position + (dif * extrapolationLength * speed);
                    transform.position = Vector3.Lerp(transform.position, expectedPosition, Time.deltaTime * speed);
                   
                    difR = difR.normalized;
                    Vector3 expectedEulerAngles = bufferedStates[0].RotationY + (difR * extrapolationLength * speedR);
                    expectedEulerAngles = expectedEulerAngles.y > 180f ? new Vector3(0, expectedEulerAngles.y - 360, 0)
                    : expectedEulerAngles;
                   
                    Quaternion expectedRotation = Quaternion.Euler(expectedEulerAngles);
                    transform.rotation = Quaternion.Lerp(transform.rotation, expectedRotation, Time.deltaTime * speedR);
                }
             }

Return to “SFS2X Questions”

Who is online

Users browsing this forum: No registered users and 42 guests