Изменение расчета умножения для использования Delta Time
-
28-09-2019 - |
Вопрос
function(deltaTime) {
x = x * FACTOR; // FACTOR = 0.9
}
Эта функция называется в игровой петле. Сначала предположим, что он работает с постоянной 30 кадров в секунду, так deltaTime
всегда 1/30.
Теперь игра изменилась так deltaTime
не всегда 1/30, но становится переменной. Как я могу включить deltaTime
в расчете x
Чтобы сохранить «эффект в секунду» то же самое?
И что насчет
function(deltaTime) {
x += (target - x) * FACTOR; // FACTOR = 0.2
}
Решение
x = x * Math.pow(0.9, deltaTime*30)
Редактировать
Для вашего нового обновления:
x = (x-target) * Math.pow(1-FACTOR, deltaTime*30) + target;
Чтобы показать, как я туда попал:
Пусть x0 будет начальным значением, а xn - значение после n / 30 секунд. Также пусть t = target, f = фактор. Потом:
x1 = x0 + (T-x0)F = (1-F)x0 + TF
x2 = (1-F)x1 + TF = (1-F)^2 * x0 + (1-F)TF + TF
Продолжение с x3, x4, ... покажут:
xn = (1-F)^n * x0 + TF * (1 + (1-F) + (1-F)^2 + ... + (1-F)^(n-1))
Теперь подставляя формулу для суммы геометрической последовательности, дадут результат выше. Это действительно только доказывает результат для целого числа n
, но он должен работать на все значения.
Другие советы
x = x * powf(0.9, deltaTime / (1.0f / 30.0f))