Extrapolation Rotation Bug
Posted: 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:
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);
}
}