Что такое симуляция: время как маленькие шаги
Физический движок — это цикл, который много раз за секунду продвигает мир на крошечный шаг времени.
Симуляция — приближённое воспроизведение поведения системы во времени путём многократного применения её законов на малых интервалах $\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$ — параметр модели, баланс точности и скорости.