Движок 2D-физики: всё, что нужно знать
Движок 2D-физики просчитывает, как объекты на плоскости движутся, сталкиваются и реагируют на силы — только по осям X и Y. Фактический стандарт здесь Box2D: на нём работают Unity и GDevelop, а Godot использует собственный движок. Объясняем, что делает 2D-физический движок, как устроено обнаружение столкновений и цикл симуляции, как соотносятся ведущие движки и из-за каких ошибок настройки (неверный масштаб мира, перемещение статических тел, создание связей каждый кадр) физика ощущается «неправильно».
Движок 2D-физики — это программный слой, благодаря которому объекты в плоской игре движутся, падают, сталкиваются и отскакивают так, будто у них есть настоящая масса и инерция. Каждый раз, когда персонаж приземляется на платформу, ящик падает с уступа, а мяч отскакивает от стены, движок приложил силы, учёл их в движении и разрешил столкновение — и всё это только по осям X и Y.
Если из всей статьи запомнить одно, пусть будет это: фактический стандарт здесь — Box2D, а самая частая причина того, что физика в 2D-игре «ощущается не так», — неверный масштаб мира, когда в решатель, ждущий метры, подают пиксели. Всё остальное — детали вокруг этих двух фактов.
Мировой рынок игровых движков растёт быстро: по данным Grand View Research, в 2024 году он составил около 3,07 миллиарда долларов и к 2030 году достигнет 8,35 миллиарда при среднегодовом росте 18,4%. И именно 2D — среда большинства независимых и мобильных проектов, ведь плоскость дешевле симулировать и она работает на более слабом железе. Этот материал рассказывает, что на самом деле делает 2D-физический движок, как устроено обнаружение столкновений, как соотносятся ведущие движки и каких ошибок настройки стоит избегать.
Что делает движок 2D-физики
Физический движок вычисляет силы в симуляции так, чтобы объекты вели себя по законам физики, и затем переводит эти силы в движение. В 2D всё происходит на плоскости: нет глубины, перспективы и объёмной массы. Это убирает целую ось вычислений — именно поэтому 2D-физика работает быстрее и дешевле 3D и доминирует на мобильных устройствах.
Каждый шаг симуляции проходит один и тот же цикл:
- Приложить силы. Гравитация, пружины, ввод игрока и связи действуют на тела.
- Вычислить ускорение. Второй закон Ньютона, F = ma, превращает силу в ускорение.
- Учесть ускорение в скорости. Ускорение обновляет скорость каждого тела за временной шаг.
- Сдвинуть объект. Скорость перемещает тело, после чего столкновения находятся и разрешаются.
2D-движок ведает тремя вещами: динамикой (силами, ускорением, моментом вращения), кинематикой (движением и положением) и столкновениями (их обнаружением и разрешением). Чего стандартные движки не делают — так это деформации: они симулируют твёрдые тела, которые не гнутся и не ломаются. Ткани, верёвки, мягкие тела и жидкости выходят за эти рамки. Если нужна симуляция жидкости, берут расширение: LiquidFun от Google добавил к Box2D частицы, жидкости и мягкие тела.
Базовые компоненты
Любой крупный 2D-движок — готовый или самописный — собран из одних и тех же частей.
Мир физики — контейнер, который хранит глобальные настройки: гравитацию (с отдельными компонентами X и Y), масштаб гравитации для каждого тела и временной шаг, на котором работает симуляция.
Твёрдые тела — то, что движется на самом деле. Каждое тело относится к одному из трёх типов:
| Тип тела | Действует ли гравитация? | Как перемещается | Для чего подходит |
|---|---|---|---|
| Динамическое | Да | Силами, импульсами, скоростью | Всё, что должно реагировать на физику: персонажи, ящики, мячи |
| Статическое | Нет | Никак — его ставят один раз | Земля, стены, постоянные платформы |
| Кинематическое | Нет | Его двигают вручную через скорость | Движущиеся платформы, вращающиеся опасности |
Физические свойства определяют поведение тела при контакте. Плотность задаёт массу (в 2D — масса, делённая на площадь). Трение сопротивляется скольжению по поверхности: почти ноль для льда, около единицы для песка. Упругость, или отскок, — какую долю энергии тело сохраняет после удара: ноль для мёртвого груза и 0,8 и выше для резинового мяча.
Связи и ограничения соединяют тела в системы: шарнирные связи для петель и колёс, призматические — для скольжения вдоль оси, связи на расстоянии — чтобы удерживать два тела на заданной длине. Именно они позволяют собирать тряпичных кукол, верёвочные мосты и механизмы.
Как устроено обнаружение столкновений
Это самая дорогая часть физической симуляции. Если объектов N, возможных пар N(N−1)/2 — для ста объектов это примерно 5000 проверок на каждом шаге. Ни один движок не проверяет их все. Вместо этого используется двухфазный подход.
Широкая фаза — быстрый приближённый проход, который отбрасывает пары, заведомо не способные столкнуться. Стандартный инструмент — выровненный по осям ограничивающий прямоугольник (AABB): дешёвый прямоугольник вокруг каждого объекта. Если прямоугольники не пересекаются, объекты не могут касаться, и пара отбрасывается сразу. В результате остаётся короткий список пар, которые могли бы столкнуться.
Узкая фаза выполняет точную и дорогую геометрическую проверку только для этого короткого списка. Она вычисляет реальные точки контакта, нормаль столкновения и то, насколько сильно формы пересекаются, — глубину проникновения, нужную решателю, чтобы растолкать тела.
Разрешение столкновения затем разводит объекты. Стандартный метод — импульсный: движок прикладывает мгновенное изменение скорости (импульс), пропорциональное обратной массе каждого тела. Поэтому боулингный шар почти не замедляется, ударив шарик для пинг-понга, а шарик улетает — большую часть импульса забирает более лёгкое тело.
Для быстро движущихся объектов важно ещё одно понятие — непрерывное обнаружение столкновений (CCD). Без него пуля, летящая за кадр дальше собственной длины, может проскользнуть сквозь тонкую стену: движок просто не заметит пересечения, потому что оно произошло между шагами. CCD «размазывает» движение объекта вдоль шага, чтобы поймать такие промахи. В Box2D эта возможность есть, в Chipmunk2D — нет.
Ведущие движки 2D-физики в сравнении
Большинство разработчиков вообще не выбирает физический движок напрямую — оно пользуется тем, что встроен в игровой движок. Но если вы подбираете библиотеку или хотите понять, на чём работаете, вот как соотносятся основные варианты.
| Движок | Язык | Где силён | CCD | Лицензия |
|---|---|---|---|---|
| Box2D | C/C++ | Стандарт; на нём Unity и GDevelop | Да | MIT |
| Chipmunk2D | C | Лёгкие переносимые нативные игры | Нет | MIT |
| Matter.js | JavaScript | Браузерные игры, простой API | Нет | MIT |
| Planck.js | JavaScript | Веб-игры, которым нужен уровень Box2D | Да | MIT |
| Rapier | Rust / WASM | Современные 2D и 3D, детерминированный мультиплеер | Да | Apache-2.0 / MIT |
Box2D, созданный Эрином Катто и выпущенный в 2007 году, — движок, на котором работает 2D-режим Unity и физическое поведение в GDevelop. Он быстрый, стабильный, хорошо задокументированный и ограничен 2D-телами: мягких тел и жидкостей в нём из коробки нет. Godot — заметное исключение: его 2D-физика по умолчанию работает на собственном движке Godot Physics 2D, а Box2D (или Rapier) доступен только как стороннее дополнение. Chipmunk2D — более лёгкая библиотека на C; её главное ограничение — отсутствие CCD, что критично для шутеров и пинбола, но не для медленных игр.
Для браузера Matter.js освоить проще всего, а Planck.js — порт Box2D на JavaScript — выбирают, когда в браузере нужны возможности и производительность Box2D. Rapier, написанный на Rust со сборкой в WebAssembly, работает и с 2D, и с 3D, запускается в браузере и предлагает детерминированный режим, что делает его привлекательным для многопользовательских игр, где состояние физики должно оставаться синхронным.
Как настроить симуляцию 2D-физики
Рабочая симуляция строится за четыре шага. Если правильно выполнить первый, большинство проблем исчезает.
- Сначала задайте масштаб мира. Решите, сколько пикселей составляют один метр, до того как тронете какое-либо значение. Box2D лучше всего работает с движущимися объектами размером примерно от 0,1 до 10 метров. Если спрайт игрока ростом 64 пикселя изображает человека, используйте 64 px = 1 м. Одно это решение убирает ту самую «ватную» и вялую физику, которая губит большинство первых попыток.
- Правильно назначьте типы тел. Если объект реагирует на физику — он динамический. Если это постоянная декорация — статический. Если вы двигаете его сами, но он должен толкать другие тела (движущаяся платформа) — кинематический. Путаница здесь — источник большинства жалоб вида «моя платформа дёргается».
- Начните с разумных значений. Плотность около 1,0 (вода), трение 0,3–0,5 для обычных поверхностей, упругость 0,0–0,2 для большинства объектов и 0,8 и выше для прыгучих. Дальше настраивайте на ощущение.
- Запускайте физику с фиксированным шагом. Физика должна шагать с постоянной частотой — по умолчанию в Unity это 50 шагов в секунду, — независимо от частоты кадров. Привяжите её к кадровому циклу, и игра будет вести себя по-разному на экранах 60 и 144 Гц.
О том, как устроен цикл настройки — как менять массу, трение и гравитацию и сразу видеть результат, — читайте в материале про редактор физики в реальном времени. А если вы только знакомитесь с базовыми идеями, в руководстве по основам геймдизайна рассказано, как физика вписывается в общий цикл прототипирования и плейтестинга.
Частые ошибки
Большинство сломанных 2D-симуляций возникает из одного и того же короткого списка.
| Ошибка | Что происходит | Как исправить |
|---|---|---|
| Пиксели вместо метров | Объекты оказываются огромными для физики, гравитация почти их не сдвигает, всё медленное и невесомое | Переводите пиксели в метры и держите движущиеся тела в диапазоне 0,1–10 м |
| Перемещение статического тела | Дёрганье, телепорты, отказ корректно сталкиваться | Используйте кинематическое тело для всего, что двигаете вручную |
| Создание связей каждый кадр | Сотни связей за секунды, скачки памяти, падения | Создавайте связи один раз, при старте сцены |
| Игнорирование затухания | Объекты крутятся и скользят бесконечно, словно в вакууме | Добавьте небольшое линейное и угловое затухание (около 0,01–0,1) |
| Привязка физики к частоте кадров | Поведение меняется между устройствами и частотами кадров | Держите физику на фиксированном шаге |
Ошибку с масштабом стоит выделить особо: никакая подстройка отдельных тел её не исправит, потому что внутренняя математика решателя рассчитана на метры. Задайте масштаб правильно с самого начала — и остальная настройка пойдёт легко.
Движки физики за пределами игр
Физические движки давно вышли за рамки развлечений. В робототехнике и исследованиях искусственного интеллекта симуляторы тренируют алгоритмы манипуляции и передвижения в виртуальных песочницах, прежде чем что-либо коснётся реального железа: MuJoCo, открытый Google DeepMind, стал стандартом для обучения с подкреплением. В инженерии такие инструменты, как Project Chrono, проводят мультифизические симуляции и проверяют механические конструкции до дорогостоящей реальной прототипизации. Для этих задач важнее всего детерминированность — точное повторение результата при тех же входных данных, — и движки для критически важных применений выбирают не те, что для игр.
Где место Egmatic
2D-физический движок мощен, но его настройка остаётся циклом: поменял значение — пересобрал — посмотрел — повторил. В Egmatic 2D-физика встроена прямо в редактор, поэтому можно сдвинуть контур столкновения, усилить гравитацию или изменить трение и тут же увидеть, как симуляция отреагирует, — без пересборки и без очередного прохода через сборку. Это превращает свойственную физике настройку на ощущение в нечто ближе к живому редактированию. А в сочетании с редактированием сцен в том же инструменте весь 2D-рабочий процесс — дизайн, логика, физика — остаётся в одном быстром цикле.
Заключение
Движок 2D-физики симулирует твёрдые тела на плоскости: прикладывает силы, учитывает их в движении и находит и разрешает столкновения через схему «широкая фаза, затем узкая». Стандарт — Box2D, и Unity с GDevelop уже работают на нём, а Godot поставляется с собственным движком. Какой именно движок вы используете, менее важно, чем два решения: правильно задать масштаб мира, чтобы решатель работал в привычных ему метрах, и держать физику на фиксированном шаге, чтобы она вела себя стабильно. Добейтесь этого — и всё остальное, типы тел, материалы, связи, столкновения, займёт свои места.
Источники
- Box2D — бесплатный открытый 2D-физический движок твёрдого тела, созданный Эрином Катто и выпущенный под лицензией MIT — Box2D.org и Википедия: Box2D
- Box2D настроен на метры и лучше всего работает с движущимися телами размером примерно от 0,1 до 10 метров; не используйте пиксели как единицы — Box2D FAQ
- 2D-физика в Unity работает на Box2D; в Unity 6.3 появилась низкоуровневая 2D-физика на базе Box2D версии 3 — Unity Discussions: Low-level 2D Physics in Unity 6.3 и Unity 2D Physics (Box2D): importance of scale
- 2D-физика в Godot по умолчанию работает на собственном движке (Godot Physics 2D / PhysicsServer2D); Box2D доступен только как стороннее дополнение — Godot, задача #10592: Box2D physics engine implementation и дополнение godot-box2d
- Rapier — открытый физический движок для 2D и 3D на Rust со сборкой в WebAssembly и детерминированным режимом — Rapier.rs и @dimforge/rapier2d-deterministic в npm
- Chipmunk2D — лёгкая библиотека 2D-физики твёрдого тела на C под лицензией MIT — Chipmunk2D
- Мировой рынок игровых движков в 2024 году оценён примерно в 3 072,6 млн долларов и к 2030 году достигнет 8 345,2 млн долларов при среднегодовом росте 18,4% — Grand View Research: Game Engines Market
- Непрерывное обнаружение столкновений (CCD) не даёт быстро движущимся объектам проскакивать сквозь тонкие поверхности; в Box2D оно поддерживается — Box2D на GitHub
- Unity считает физику с фиксированным шагом (по умолчанию 0,02 с, то есть 50 Гц), независимо от частоты кадров — Руководство Unity: Time and Fixed Timestep
- MuJoCo — открытый физический симулятор, широко применяемый в робототехнике и обучении с подкреплением — MuJoCo
Похожие статьи
10 лучших инструментов для быстрого прототипирования игр (2026)
Правильный инструмент для прототипирования сокращает недели разработки. Вот 10 инструментов, отобранных по скорости, стоимости и пригодности для прототипирования 2D-игр — от no-code движков до профессиональных фреймворков.
8 главных инструментов MonoGame, которыми пользуется каждый профи
MonoGame — это C#-фреймворк, а не готовый движок, поэтому профессиональные разработчики закрывают недостающее проверенным набором инструментов. Восемь самых ходовых: конвейер контента MGCB, библиотеки MonoGame.Extended и Nez для недостающих возможностей движка, FlatRedBall с GUM как движок и редактор интерфейса, Aseprite и MonoGame.Aseprite для спрайтов, Tiled и LDtk для уровней и TexturePacker для атласов. В руководстве объяснено, что делает каждый инструмент и как они сочетаются.
Buildbox против конкурентов: честное сравнение 2026
Buildbox позволяет создавать игры без программирования, но делёж рекламной выручки 70/30 и отсутствие экспорта на консоли делают его трудно рекомендуемым. Честное сравнение с Construct 3, GDevelop, GameMaker, Godot и Egmatic.