Допустим, ваш клиент получает новое обновление скорости позиции в момент времени currentTime
.Затем вам нужно сохранить текущую позицию / скорость, целевую позицию / скорость, текущее время и время, когда вы ожидаете следующее обновление:
function updateFromServer(position, velocity) {
startP = currentPosition; //the current position of the player
startV = currentVelocity;
targetP = position;
targetV = velocity;
startT = currentTime; //the current time of the game
endT = startT + 0.1; //expect the next update in 100 ms
}
После того, как вы сохранили эти данные, вы можетеобновите кадр, используя интерполяцию.Если вы находитесь за пределами интервала [startT, endT]
, вы можете просто продолжить равномерное движение:
function frameUpdate(deltaT) {
if(currentTime > endT)
//uniform motion
currentPosition += deltaT * currentVelocity;
else {
//cubic Hermite interpolation
var t = (currentTime - startT) / (endT - startT); //interpolation parameter
var t2 = t * t;
var t3 = t2 * t;
currentPosition =
(2 * t3 - 3 * t2 + 1) * startP +
(t3 - 2 * t2 + t) * (endT - startT) * startV +
(-2 * t3 + 3 * t2) * endP +
(t3 - t2) * (endT - startT) * endV;
currentVelocity = 1 / (endT - startT) * (
(6 * t2 - 6 * t) * startP +
(3 * t2 - 4 * t + 1) * (endT - startT) * startV +
(-6 * t2 + 6 * t) * endP +
(3 * t2 - 2 * t) * (endT - startT) * endV);
}
}
Обратите внимание, что формулы в этом фрагменте не являются допустимым кодом JavaScript.Они должны быть переведены в любую библиотеку, которую вы используете.