И снова в эфире наша рубрика: «Банальности программирования в массы»…
В этот раз хочу поделиться с народом штукой под названием «Low-pass filter».
«Ну что ты, в самом деле, опять про то, что все уже давным-давно знают» — скажут опытные программисты. «А вот ничего подобного» — отвечу им, лично я узнал об этом совсем недавно. И очень жалею, что не знал этого раньше.
Итак, вот функция для сглаживания входных данных:
def filter(a, b, dt, RC): t = dt / (RC + dt) return a + t * (b - a) |
где a — текущее значение переменной, b — следующее значение, dt — время в миллисекундах между кадрами, RC — некий коэффициент (чем больше значение, тем больше сглаживание).
Соответственно, если вам надо сгладить какое-то значение (например, позицию камеры по Y в зависимости от позиции Y главного героя), то можно применить эту функцию следующим образом (значение RC подбирается опытным путем):
def update(dt): camPosY = filter(camPosY, heroPosY, dt, 0.85) |
Кстати, тут используется линейная интерполяция, которая вкратце описана в этой заметке: «Линейная интерполяция и кривая Безье».