Что такое симуляция: время как маленькие шаги

Физический движок — это цикл, который много раз за секунду продвигает мир на крошечный шаг времени.

Симуляция — приближённое воспроизведение поведения системы во времени путём многократного применения её законов на малых интервалах $\Delta t$.

Зачем программисту физика

Когда мяч в игре отскакивает от пола, планета летит по орбите, а ткань колышется на ветру, за этим стоит не магия, а несколько строк кода, которые тысячу раз в секунду спрашивают: «где сейчас тело и куда оно движется?». Реальная физика описана дифференциальными уравнениями — гладкими, непрерывными законами. Но компьютер не умеет работать с непрерывностью: он считает по шагам. Поэтому первая и главная идея всей вычислительной физики такова: непрерывное время мы режем на маленькие отрезки $\Delta t$ и на каждом отрезке делаем вид, что скорость и ускорение постоянны.

Эта замена и есть мост между формулой из учебника и кодом в игре. Формула говорит, каким должно быть движение в идеале; симуляция воспроизводит его пошагово, с управляемой ошибкой. Чем меньше шаг $\Delta t$, тем ближе симуляция к истине — но тем больше шагов нужно сделать. Весь курс посвящён тому, как делать эти шаги так, чтобы они были одновременно быстрыми и достаточно точными.

От производной к разности

Скорость по определению — это производная координаты по времени:

$$v = \frac{dx}{dt}.$$

Компьютер не знает, что такое предел, зато отлично умеет вычитать. Поэтому мы заменяем бесконечно малое $dt$ на конечный шаг $\Delta t$ и пишем приближённое равенство:

$$x_{n+1} \approx x_n + v_n \, \Delta t.$$

Здесь $x_n$ — положение на шаге с номером $n$, а $x_{n+1}$ — на следующем. Если за время $\Delta t$ скорость почти не меняется, ошибка мала. Точно так же ускорение $a = \frac{dv}{dt}$ превращается в правило $v_{n+1} \approx v_n + a_n \, \Delta t$. Эти два правила — фундамент, на котором стоит почти любой движок.

Первый цикл симуляции

Смоделируем самое простое: тело движется с постоянной скоростью $5$ м/с. Аналитически за время $t$ оно проходит $x = v t$. Проверим, что наш пошаговый цикл даёт то же самое.

v = 5.0      # скорость, м/с
x = 0.0      # начальная координата
dt = 0.1     # шаг времени, с
t = 0.0
for _ in range(10):
    x = x + v * dt   # продвигаем координату
    t = t + dt
    print(f"t={t:.1f}  x={x:.2f}")

Вывод:

t=0.1  x=0.50
t=0.2  x=1.00
t=0.3  x=1.50
t=0.4  x=2.00
t=0.5  x=2.50
t=0.6  x=3.00
t=0.7  x=3.50
t=0.8  x=4.00
t=0.9  x=4.50
t=1.0  x=5.00

За одну секунду тело прошло ровно $5$ метров — в точности как предсказывает $x = vt$. Для движения с постоянной скоростью наш простой цикл даёт точный результат: ошибки нет, потому что скорость и правда не меняется внутри шага.

Как работает под капотом

Внутри каждого шага происходит ровно одно умножение и одно сложение на каждую координату. Тело с положением и скоростью — это всего четыре числа в 2D: $x$, $y$, $v_x$, $v_y$. Движок хранит их в памяти и на каждом кадре обновляет. Если игра идёт на $60$ кадрах в секунду, то естественный шаг $\Delta t = \frac{1}{60} \approx 0.0167$ с. Но шаг рендера и шаг физики — это разные вещи: часто физику считают с фиксированным маленьким $\Delta t$ несколько раз за кадр, чтобы она не зависела от частоты экрана. К этому мы вернёмся.

Важно понимать: число $\Delta t$ — это не «реальное время», а параметр модели. Уменьшая его вдвое, мы удваиваем точность простых интеграторов, но и удваиваем число итераций. Поиск баланса между точностью и скоростью — центральная инженерная задача движка.

Частые ошибки

  • Забыть умножить на $\Delta t$. Если написать x = x + v, тело улетит: вы прибавляете скорость как будто за каждый шаг проходит ровно одна секунда.
  • Считать, что маленький шаг всегда «бесплатен». Шаг в $100$ раз меньше означает в $100$ раз больше вычислений; для тяжёлых сцен это критично.
  • Путать кадры рендера и шаги физики. Если привязать $\Delta t$ к частоте монитора, на быстром компьютере мир будет жить быстрее. Физику нужно отвязывать от FPS.

Итог

  • Симуляция заменяет непрерывное время дискретными шагами $\Delta t$.
  • Производные превращаются в разности: $x_{n+1} = x_n + v_n \Delta t$.
  • Для постоянной скорости шаговый цикл точен; сложности начинаются с ускорения.
  • Шаг $\Delta t$ — параметр модели, баланс точности и скорости.
Проверьте себя
1. Почему в симуляции мы заменяем dx/dt на (x_{n+1}-x_n)/Δt?
AПотому что компьютер не умеет считать пределы и работает по дискретным шагам
BПотому что так формула становится точнее реальной физики
CПотому что производные в физике не используются
DПотому что Δt всегда равно одной секунде
2. Что произойдёт, если в цикле написать x = x + v вместо x = x + v*dt?
AНичего, это эквивалентно
BТело будет двигаться так, будто каждый шаг длится 1 секунду, и улетит
CСкорость станет нулевой
DСимуляция станет точнее
3. Как связаны точность простого интегратора и шаг Δt?
AЧем больше Δt, тем точнее
BТочность не зависит от Δt
CЧем меньше Δt, тем точнее, но больше вычислений
DΔt влияет только на скорость, не на точность