# Phase 2: Физический интегратор **Status:** ⬜ Not Started **Parent plan:** [PLAN.md](./PLAN.md) **Domain:** frontend ## Objective Добавить настоящую физику: тела с массой, гравитация/пружины/столкновения/трение, перетаскивание тел силой, траектории. Динамика считается движком, а не формулой. После фазы маятник/столкновения/брошенное тело идут динамически из спеки. ## Tasks - [ ] Блок `physics` в спеке: `{ enabled, gravity:{x,y}, friction, walls:[...], restitution }`. - [ ] Тело-объект: `body:{ mass, vx, vy, fixed }` — интегрируется (опора на `_fx_motion.js`, посмотреть API; не дублировать интегратор). - [ ] Пружины: `springs:[{ a, b, k, length }]` (между телами или телом и точкой-якорем). - [ ] Столкновения: упругие шары/стены (restitution), базовый бродфейз достаточно (N небольшое). - [ ] Drag тела: перетаскивание задаёт позицию/скорость (отпустил — летит). Кинематические (формульные) объекты Ф0 сосуществуют с физическими. - [ ] Траектория: накопление следа центра тела (toggle в спеке). - [ ] Демо-спеки: «маятник» (груз+нить как пружина/констрейнт), «упругие шары». ## Files to Modify/Create - `frontend/js/labs/_sim_engine.js` — физический режим, интеграция с _fx_motion (modify) - `frontend/js/labs/_sim_physics.js` — обёртка интегратора/коллизий, если чище отдельно (new, опц.) - `frontend/js/labs/_sim_demo.js` — физ-демо (modify) ## Acceptance Criteria - Тело под гравитацией падает/летит по параболе через интегратор (не по формуле). - Пружина колеблет груз; шары упруго сталкиваются; стены отражают. - Drag тела работает; формульные объекты Ф0 продолжают работать в той же сцене. ## Notes - Шаг интегратора фиксированный (накопитель dt) для стабильности. - Не переусложнять коллизии — школьный уровень (круги/стены). ## Review Checklist - [ ] Все задачи выполнены - [ ] Использует _fx_motion, без своего дубля интегратора без причины - [ ] Стабильность (нет взрыва энергии на разумных параметрах) - [ ] Нет регрессий Ф0/Ф1 ## Handoff to Next Phase