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);
}
}