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
Collaborator

Summary

Anton: «куда делась 3D? хочу подробную 3D-модель, в идеале крутится на карте (карта как подставка-земля), видеть тень». Вернул 3D — теперь привязанный к единой программе (а не отдельный движок, как раньше).

  • Massing3DScene (three, lazy ssr:false): рисует ровно размещённые корпуса из variant.buildings_geojson (высота = floors × высота этажа), стоящие на ground-плоскости с растровым OSM-тайлом участка («карта как земля»). Солнце по времени суток отбрасывает тени (слайдер «Время суток» 6–20). 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 с honest-панелью, fallback на плоскую плашку+grid при сбое тайла/таймауте 6с, честный caption (высота этажа = норматив движка; подложка © OpenStreetMap).

Отложено (follow-up, не блокер)

  • Live-ползунок высоты этажа (Phase 2 — floorHeightM уже проброшен, caption готов к нему).
  • Полноценный 3D-рельеф местности (нужны DEM/elevation-тайлы + посадка фундаментов — отдельный эпик; ЕКБ-участки почти плоские, плоская OSM-подложка покрывает «корпуса на карте»).

Test plan

  • tsc + next lint clean; vitest geo-local 11/11; prettier
  • code-reviewer APPROVE (extraction byte-identical → кокпит без регрессий; teardown без утечек; проекция/тайлы корректны; контракт/конвенции)
  • post-deploy screenshot-verify: 3D-вкладка в §7 — корпуса стоят на OSM-карте, крутятся, тени двигаются со слайдером, число/размещение совпадает с 2D-планом

Часть epic #1953.

## Summary Anton: «куда делась 3D? хочу подробную 3D-модель, в идеале крутится на карте (карта как подставка-земля), видеть тень». Вернул 3D — теперь **привязанный к единой программе** (а не отдельный движок, как раньше). - **`Massing3DScene`** (three, lazy ssr:false): рисует **ровно размещённые корпуса** из `variant.buildings_geojson` (высота = `floors × высота этажа`), стоящие на **ground-плоскости с растровым OSM-тайлом** участка («карта как земля»). **Солнце по времени суток отбрасывает тени** (слайдер «Время суток» 6–20). **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 с honest-панелью, fallback на плоскую плашку+grid при сбое тайла/таймауте 6с, честный caption (высота этажа = норматив движка; подложка © OpenStreetMap). ### Отложено (follow-up, не блокер) - Live-ползунок высоты этажа (Phase 2 — `floorHeightM` уже проброшен, caption готов к нему). - Полноценный 3D-рельеф местности (нужны DEM/elevation-тайлы + посадка фундаментов — отдельный эпик; ЕКБ-участки почти плоские, плоская OSM-подложка покрывает «корпуса на карте»). ## Test plan - [x] tsc + next lint clean; vitest geo-local 11/11; prettier - [x] code-reviewer ✅ APPROVE (extraction byte-identical → кокпит без регрессий; teardown без утечек; проекция/тайлы корректны; контракт/конвенции) - [ ] post-deploy screenshot-verify: 3D-вкладка в §7 — корпуса стоят на OSM-карте, крутятся, тени двигаются со слайдером, число/размещение совпадает с 2D-планом Часть epic #1953.
bot-backend added 1 commit 2026-06-30 11:55:39 +00:00
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
5339aeb72e
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-тайлы — отдельный эпик).
bot-backend merged commit daf4ebefc2 into main 2026-06-30 11:58:47 +00:00
bot-backend deleted branch feat/concept-3d-massing 2026-06-30 11:58:48 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2109
No description provided.