feat(concept): 3D-масса корпусов на карте с тенями (§7) (#1953) #2109

Merged
bot-backend merged 1 commit from feat/concept-3d-massing into main 2026-06-30 11:58:47 +00:00

1 commit

Author SHA1 Message Date
5339aeb72e feat(concept): 3D-масса корпусов на карте с тенями (§7) (#1953)
All checks were successful
CI / changes (pull_request) Successful in 7s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Successful in 1m1s
CI / openapi-codegen-check (pull_request) Successful in 1m52s
Anton: «куда делась 3D? хочу подробную 3D-модель, крутится на карте (карта как
подставка-земля), видеть тень». Вернул 3D — но привязанный к ЕДИНОЙ программе.

- Massing3DScene (three, ssr:false): рисует РОВНО размещённые корпуса из
  variant.buildings_geojson (высота = floors × высота этажа), на ground-плоскости
  с растровым OSM-тайлом участка («карта как земля»), солнце по времени суток
  отбрасывает тени (slider «Время суток»), OrbitControls + автоповорот.
- geo-local.ts: WGS84→локальные метры (equirectangular о центроиде) + slippy-tile
  математика (выбор зума ≤2×2, geo-pin плоскости теми же углами тайл-блока) — 11
  vitest. Без новых зависимостей (three+leaflet уже есть).
- Вкладка 2D/3D в «Размещение застройки»: «План (2D)» = существующая Leaflet-карта,
  «Объём (3D)» = новый вьюер. Десктоп — 3D по умолчанию, моб (<768) — 2D + 3D по тапу.
- sun.ts / three-utils.ts: sunFromHour + disposeObject вынесены из MassingScene
  (verbatim), кокпит репойнтнут на них (без изменения поведения).
- Полный teardown (RAF/RO/dispose geom+mat+CanvasTexture+renderer), WebGL-guard,
  fallback на плоскую плашку+grid при сбое тайла/таймауте 6с, честный caption
  (высота этажа норматив движка; подложка © OpenStreetMap).

Отложено (follow-up): live-ползунок высоты этажа (Phase 2); полноценный 3D-рельеф
местности (нужны DEM/elevation-тайлы — отдельный эпик).
2026-06-30 16:55:06 +05:00