Глава 1 • Фундамент Физических Движков

Кинематика и Численное Интегрирование

В реальном мире время непрерывно, но в играх кадры дискретны (1/60 секунды). Как заставить объекты двигаться реалистично, не взрывая симуляцию? Разбираем второй закон Ньютона, методы Эйлера и Верле.

⚖️ Эксперимент 1: Битва Интеграторов

Сравнение явного Эйлера, полунеявного Эйлера (Euler-Cromer) и метода Верле на гравитационной орбите.

💡 Увеличьте шаг времени (dt) и посмотрите, как красный шар улетает в бесконечность
Параметры симуляции
Шаг времени (dt) 0.016 с
Отображаемые методы

Почему классический Эйлер "ломается"?

В наивной реализации Явного Эйлера (Explicit Euler) новая координата считается по старой скорости. Из-за этого при каждом шаге в систему непреднамеренно "впрыскивается" избыточная кинетическая энергия. Орбита раскручивается по спирали, а пружины разносят объект в клочья!

x += v * dt;
v += a * dt;
⚠️ Явный: накапливает ошибку энергии при dt > 0.02

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

Метод Верле (Verlet Integration)

В методе Верле скорость даже не хранится в явном виде! Она неявно вычисляется из разности между текущей и предыдущей позицией.

javascript — verlet_step.js
// Verlet: супер-стабилен для верёвок и тканей!
const nextX = 2 * pos.x - prevPos.x + a.x * dt * dt;
const nextY = 2 * pos.y - prevPos.y + a.y * dt * dt;
prevPos.x = pos.x;
prevPos.y = pos.y;
pos.x = nextX;
pos.y = nextY;

🎯 Эксперимент 2: Баллистика и Силы Сопротивления

Сила тяжести, сопротивление воздуха (Drag) и коэффициент отскока (Restitution).

🖱️ Наведите мышь и кликните, чтобы выстрелить из пушки под нужным углом
Силы среды
Гравитация (g) 380 px/s²
Сопротивление воздуха 0.002
Упругость пола (Restitution) 0.70

Аэродинамическое сопротивление (Air Drag)

В вакууме траектория — идеальная парабола. Но в играх сопротивление воздуха придает сочность и управляемость:

F_drag = -0.5 · C_d · ρ · A · |v| · v

Сила направлена строго противоположно вектору скорости и растет квадратично относительно скорости: чем быстрее летит снаряд, тем жестче его тормозит воздух.

Отскок от препятствия (Restitution)

Коэффициент восстановления e ∈ [0, 1] определяет долю сохраненной скорости вдоль нормали контакта:

v_normal_after = -e · v_normal_before

При e = 1 удар идеально упругий (мячик отскакивает вечно). При e = 0 — абсолютно неупругий (прилипает к земле).

Куда двигаться дальше?

🪢

Пружины и Ткань

Закон Гука, демпфирование, верёвки и мягкое желе. Узнайте, как из простых палочек и пружин сделать реалистичный ragdoll или одежду персонажа.

💥

Столкновения и Импульсы

Детекция пересечений окружностей и многоугольников (SAT), разделение тел и расчет импульса отскока с трением.

🌊

2D Жидкости

Симуляция водной глади на соединенных столбиках (как в Terraria) и капельная жидкость на частицах с эффектом метаболов.

🧪

Большая Песочница

Единая интерактивная лаборатория: создавайте и комбинируйте пружины, шары, желе и воду прямо на экране.