3.1 KiB
3.1 KiB
Phase 2: Физический интегратор
Status: ⬜ Not Started Parent plan: 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