Интерполяция с фиксированным временным шагом

Я пытался реализовать игровой цикл, найденный в Gafferon Games http://gafferongames.com/game-physics/fix-your-timestep/ но я сталкиваюсь с проблемой, касающейся шага интерполяции.

Текущий алгоритм выглядит так:

void draw(float interpolation)
{
//Set image coordinates to that of its collision box
image_->setX(box_.getRect().x);
image_->setY(box_.getRect().y);

if(player moving)
draw(image_->getX()*interpolation + last_x*(1-interpolation),image_->getY());
else
draw(image_->getX(),image_->getY());
}

Этот код вызывается вне физического цикла (который работает со скоростью 30 кадров в секунду) и поэтому вызывается настолько часто, насколько это возможно.

last_x переменная устанавливается внутри цикла физики на значение x изображения.

Кажется, все имеет смысл, но этот кусок кода:

draw(image_->getX()*interpolation + last_x*(1-interpolation),image_->getY());

По сути, я постоянно добавляю расстояние, основанное на последнем x (которое будет меньше текущего x), поэтому этот эффект кажется естественным, поскольку он принимает «среднее» от текущей и последней позиции, что, очевидно, будет меньше текущей x-позиции, создавая эффект, показанный ниже:

(Черный ящик — правильная позиция, красная коробка — местоположение спрайта с интерполяцией)
проблема

Итак, вопрос в том, где я ошибаюсь?

РЕДАКТИРОВАТЬ: Ну, я обнаружил, что установка координат каждый вызов рендеринга

image_->setX(box_.getRect().x);
image_->setY(box_.getRect().y);

Был корень ошибки на картинке. Однако, хотя изображение находится в правильном месте, я не вижу видимой разницы с интерполяцией, независимо от того, насколько я с ней играюсь.

Итак, я предполагаю, что последний вопрос: мой алгоритм интерполяции корректен и функционирует? Я ожидаю, что интерполяция сделает слишком много?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]