35-city-massing-redo.md 18 KB

35: 重做沅陵县城体块模型(修漏顶 / 贴合地形 / 尺度过目)

Type: task Status: claimed Labels: ready-for-agent, wayfinder:task

目标与认领

继续重做被维护者两次否决的房屋模型。2026-09-24 明确反馈:地形穿透仍在;需按顶视卫星图逐栋建模,非特写近景也要有房屋样貌;允许调用本地 Blender / 3ds Max,同类模型复用。沿用本会话认领,不另开重复票。

当前实现是 地形遮挡修复 + Blender 房屋库 + 影像足印示范街区。不是完整县城交付,也没有获得维护者视觉验收。

进度:88%

旧版 90% 结论撤回。穿透问题已完成真实渲染回归;Blender资产库、城市覆盖底册、规则小区高置信度样片以及三套空间LOD树已完成。2026-09-29 按维护者三条反馈重做旧城生成:旧城不再沿道路造房(道路改为纯排除几何),改为只接受 OSM 建筑面与 z19 卫星屋顶分割足印;所有模型强制落在主场景区内(新增 primary-area.mjs 统一裁剪/包含契约 + 6 项测试);样式由 8 种已认可变体按来源建筑确定性分配,不再是整城统一橙色尖顶。当前经 verify-city-models.mjs 验收:主场景区外 0、交通道路上 0、居民地掩膜外 0。

2026-09-30 找到权威建筑来源,影像分割方案已被取代。 按维护者要求先取 GIS 建筑数据:本地此前只用过 OSM 的 169 个建筑面,但 D:\GIS\ArcGIS\yuanling\ 下有两份 1:500 测绘 CAD 图(沅陵20240110.dwg、沅陵20240510.dwg),其 JMD(居民地)图层含 60,771 个房屋面,另有 泵站厂房/BYQ/KZD/WSL/YSL 等专业图层。用本机 ArcGIS Desktop 10.8 的 arcpy 转成 GIS 后实测:主场景区内 60,744 个房屋轮廓,41,101 个规整四角矩形、19,643 个 L 形/天井等复杂外轮廓;1:1 z19 影像对照显示轮廓精确贴合屋顶(含街面进深、天井、组合体量),精度显著优于卫星分割(后者只能给旋转矩形)。面积中位 17.1 m²、p75 68.5 m²、p95 210.4 m²;37,151 个落在既有居民地掩膜内,其余 23,593 个为掩膜外村庄/散建。数据缺失:注记 54,663 条里只有 10 条带结构类型,层高需另行估计。

2026-09-30 BIM 管线已建立并跑通(维护者确认"先尝试制作")。 链路:prepare-cad-bim.mjs(足印→ENU、城区/乡村分级、按面积估层数)→ sample-terrain-offline.mjs(原始量化网格 DEM 采样)→ seat-cad-bim.mjs(平地/台基落地 + 轮廓有效性校验)→ assemble-cad-bim.py(Blender 导出空间 LOD 树)→ verify-lod-district.mjs。

分型策略:足印矩形度 ≥0.85 且尺寸落在 asset-fit.json 窗口内的用已认可精细资产(带窗、阳台、屋面),其余按真实测绘轮廓挤出体量棱柱——不再把 L 形/天井强行套成矩形,这正是此前"误差很大"的主因。层数按足印面积估(测绘注记不含可用层数)。

计划量与座落:足印 60,744 → 建模 54,455(精细资产 13,554 / 体量 40,901;城区 33,054 / 乡村 21,401;6,289 个 <4 m² 噪点跳过)→ DEM 座落后 48,425 栋(平地 46,934 / 台基 1,491;36 个自相交/塌缩轮廓、5,772 栋因高差超出合规台基而排除并记录原因)。

首批 CIM 交付(本轮完成):全量 48,425 栋单次导出体量过大(LOD0 逾 880MB 时被取消、无完整 manifest,未作为交付),改为按分级先交付城区 BIM 首批:make-cad-bim-pilot.mjs 按居民地掩膜分层抽样(66 掩膜 1,800 / 65 掩膜 700 / 130 掩膜 300 / 126 掩膜 200,确定性哈希排序),共 3,000 栋,经 assemble-cad-bim.py --grid 16 --coarse-grid 4 导出为 city/cad-bim/lod-pilot:2,942 栋、68 细分片、9 粗父节点,LOD1 24.0MB/3,480,996 三角、LOD0 77.3MB/5,111,164 三角(58 栋为资产库无法承载而排除并记录)。verify-lod-district.mjs → passed: true。体量棱柱按真实轮廓挤出,L 形/天井/街面进深保留;精细资产用于矩形度高的房屋。

修掉的导出器缺陷(子代理首版遗留、由本人定位并修复):① 棱柱墙面四边形被加入两遍且第二遍反向绕序,每条墙边关联 4 个面、网格非流形,recalc_face_normals 无法定向,细长轮廓体积自检误判"内外翻转"——去掉重复面后恢复;② 体积自检与棱柱顶点原先用绝对 ENU 坐标(离原点约 2 km,mathutils 单精度),改为按 positionENU 构建局部坐标并加对象位移,自检数值稳定且导出节点位移与计划一致;③ 体量建筑原先额外生成"外接矩形埋地基础",与棱柱侧面共面闪烁、并在 L 形/细长轮廓上伸出建筑之外——体量棱柱已下探到 foundationBottom,故只对精细资产保留独立基础;④ 材质索引按三角面数而非面数填写,已改为"n 个墙面 + 两个顶底盖"。

仍未完成:其余 45,483 栋的分批导出(城区已含于首批的除外)、层高估计校准、三树 + CAD BIM 的运行态性能与下载量实测、维护者视觉验收。

已核验的根因

  1. 遮挡是深度配置问题,不是高程误差的自然副作用。 实际 createViewer() 未开启 globe.depthTestAgainstTerrain。在不透明球面/本地 DEM 下完全埋入的红色 GLB 仍显示 2916 像素;仅开启该项后为 0。已在 Viewer 创建和视图图层切换时保持开启;地下管线透视仍由显式 globe.translucency 控制。
  2. 旧坡屋顶存在缺面/重叠三角形。doubleSided 和法线自洽检查不能证明屋顶闭合。
  3. 旧落地检查读同一份插值网格与自报 zBase,检查固定 ±6m 方形而非旋转后的实际足印;64×64 网格实际约 62×53m,不是声称的 27m。不能叫逐栋 DEM 实测。
  4. 旧裙边把楼体连屋顶一起降低 4m,导致两层房屋在平地仅露出约 2.2m 外墙。旧足印还被轴对齐外接框替代。
  5. 旧渲染探针把 range/pitch 作为 goHome(options) 的参数传入,实际没有改变预设距离;旧截图文件名中的“2400m/1200m”等不能作为视距证据。

验收与本轮证据

  • 明确并修复地形遮挡设置:cesiumEngine.js 默认与图层切换保持 depthTestAgainstTerrain=true。
  • 地面/管线透视分开证明:tools/city-massing/verify-occlusion.mjs 在实际本地 DEM 场景验证默认地面0红像素、关闭深度2916、深度开启0、管线半透明2916、回地面0。负对照能复现原问题。
  • 新房屋基础壳/屋顶不靠双面掩盖:Blender 库的边/点流形、绕序、正体积、导出索引与法线检查通过;删除屋顶面、反转屋顶壳的负例被拒绝。适用于独立实体壳,不宣称是无相交 CAD 并集。
  • 加入可辨识房屋细节:凹入窗、玻璃、窗框、门、雨篷、阳台栏杆、瓦片/屋檐、女儿墙和退台。8 个真实楼层/尺寸变体,Z 不拉伸伪装层数;有 LOD0/LOD1 与单独地下基础。
  • 示范街区不用随机填充:31 个原始 OSM 近矩形轮廓 + 12 个从本地影像逐栋描绘的屋顶。保留来源、朝向、像素与地理坐标。
  • 实际旋转足印边界和内部按 ≤5m 间距直接向原始 DEM provider 采样,共 2531 点;缺数据就失败,无固定高程补值。
  • 楼体与基础分离:首层在该模块采样最高地表下0.25m,基础单独下延至最低地表以下3m。采样高差>2.5m时排除,不造高台。当前最高可见基础约2.19m,未证明采样点之间绝对零悬空。
  • 实际 GLB 导出校验:37 个具名节点经完整 glTF Y-up→ENU→ECEF 变换,足印锚点误差最大0.0124m(相对规划,不是测绘精度);基础与原始 DEM 控制点相交、屋顶有可用高度。横移10m/抬高5m/X缩放20%的负例均失败。
  • 完整县城覆盖和全场景“远景+中近景达标”:2026-09-29 已把旧城从“道路分组近似”换成来源足印驱动:z19 卫星屋顶分割 6,000 个足印(掩膜 65/66/126 可信,63/130 经 1:1 对照判读不可信已排除)+ 169 个 OSM 建筑面;生成 5,201 个来源模块,落地导出 4,601 个(3,359 栋来源建筑),319 个细分片 + 39 个粗父节点。仍不是全城逐栋:2,991 个模块在落地阶段排除(DEM 高差、资产比例无法承载、道路/水体/碰撞),掩膜外建成区无足印来源保持空缺,regular-estate 有 5 处影像描绘屋顶与 OSM 巷道互相矛盾待人工判定。
  • 建筑严格限制在主场景区内:新增 tools/city-massing/primary-area.mjs 作为唯一裁剪/包含契约(clipFeatureToBounds 对道路用 bboxClip、对建筑面用 intersect),city-atlas.mjs 与生成器都改用它;primary-area.test.mjs 6/6 通过;verify-city-models.mjs 对三套导出树实测主场景区外 0、交通道路上 0、居民地掩膜外 0。
  • 道路旁误放与小区错位修正:旧城生成器不再以道路为建房依据(道路仅作 3.5 m 排除走廊),模块必须完整落在来源足印内;regular-estate 的 5 处影像描绘屋顶与 OSM residential 巷道重叠(15%–55%)作为 sourceConflicts 如实记录,未擅自删楼或改路。
  • 房屋样式丰富:旧城四种体量族 × 8 个已认可变体全部投入使用(house-2f 1,316 / house 1,403 / house-4f 1,391 / slab 52 / slab-4f 65 / midrise 153 / midrise-8f 178 / midrise-wide 43),屋顶与外墙材质按来源建筑哈希在 terracotta/light-terracotta/slate/light-slate 与 cream/ivory/sand 间轮换,取代原先整城统一橙色尖顶。
  • 屋顶与真实足印完全一致:分割输出是最小外接矩形,不表达 L 形、天井、屋脊;贴邻无阴影分隔的两栋会并成一栋;暗屋顶会漏;位置不确定度约 1–2 px(0.3–0.6 m)。不是测绘几何。
  • 所有接缝檐口/阳台不相交:长条模块相接处尚需专门检查和连栋屋檐设计。
  • 复杂坡地足印定制和全部纳入:坡地已分三档处理(平地直接落地、缓坡用 ≤3.2 m 且不超过楼高 40% 的石砌台基、更陡的按实测坡向切台阶),当前 4,110 平地 / 361 台基 / 317 台阶;仍有 2,991 个来源模块因高差超出这些档位或资产比例无法承载而排除并逐条记录原因。
  • 形成空间LOD树产物:district/lod-preview(37单元,LOD1 7.04MB/790,296三角,LOD0 10.04MB/1,094,016三角)、city/regular-estate/lod-preview(15单元,LOD1 5.35MB/314,640三角,LOD0 8.12MB/449,424三角)、city/oldtown/lod-preview(4,601模块、319细分片、39粗父节点,LOD1 124.5MB/30,913,288三角,LOD0 662.6MB/43,942,492三角)。三棵树均通过 verify-lod-district.mjs 静态回验;oldtown 体量已大幅上升,运行时性能尚未复测,不能据此声称通过。
  • 接入显式模型照明契约:map.tilesets[].lighting:true 归一化后,Cesium按tileset地理包围球配置稳定局部DirectionalLight与IBL;默认配置仍关闭模型,不改变无模型部署。tileFailed同步捕获内容阶段错误。
  • 统一参数化与完整性能验收:生产配置仍为空;oldtown 从 1,436 单元增至 4,601 模块后 LOD0 已达 662.6MB,必须重新实测运行态加载与帧耗时,不能用旧的局部读数代替。详细历史记录见 .scratch/cockpit-shell-panel-layout/verify/artifacts/t35/runtime-lod/report.json(该文件描述的是改造前的旧树,已过期)。
  • 用户按实际场景确认外观;主应用正式照明/性能验收与最终部署。

输出与复现

权威建筑来源(2026-09-30 新增,取代影像分割作为建筑几何)

  • tools/city-massing/convert-dwg-to-gis.py:用 ArcGIS Desktop 10.8 的 arcpy 把测绘 DWG 转成文件地理数据库并盘点图层(CAD 无坐标系,按 CGCS2000 3 度带 GK CM 111E / EPSG:4546 定义;CADToGeodatabase 必须给参考比例,本图取 1:500)。
  • tools/city-massing/export-cad-layers.py:按 CAD 图层名取出要素、定义坐标系、投影到 WGS84 输出 SHP;跳过 MultiPatch(三维重复几何)与 Annotation(文字框)。
  • tools/city-massing/cad-shp-to-geojson.py:把 SHP 转成只含主场景区的 GeoJSON,并统计面积分布。
  • 产物:city/cad-buildings.geojson(60,744 个房屋轮廓,SHA256 4266B3EC…)、city/cad-building-labels.geojson(54,663 条注记)、city/cad-extract-report.json。
  • 复核:tools/city-massing/verify-cad-buildings.mjs → city/cad-buildings-z19-core.png(1:1 影像 + 轮廓描边,本人已读图确认贴合)、city/cad-buildings-overlay.png、city/cad-buildings-core.png。

复现命令(路径含中文,故先复制到 ASCII 临时目录):

$tmp="$env:TEMP\city-dwg"; New-Item -ItemType Directory -Force -Path $tmp | Out-Null
Copy-Item 'D:\GIS\ArcGIS\yuanling\沅陵20240510.dwg' "$tmp\yuanling-20240510.dwg" -Force
& 'C:\Python27\ArcGIS10.8\python.exe' tools/city-massing/convert-dwg-to-gis.py "$tmp\yuanling-20240510.dwg" "$tmp\cad-20240510.gdb" 500
& 'C:\Python27\ArcGIS10.8\python.exe' tools/city-massing/export-cad-layers.py "$tmp\cad-20240510.gdb" "$tmp\shp" JMD
& 'C:\Python27\ArcGIS10.8\python.exe' tools/city-massing/cad-shp-to-geojson.py "$tmp\shp" tools/city-massing/city "110.328749941417,28.3917230659234,110.465779226663,28.4913038992907"
node tools/city-massing/verify-cad-buildings.mjs

注:city/cad-building-outlines.geojson(43MB,JMD 线要素)与多边形重复,为控制仓库体积已删除,需要时按上面命令重新导出。

影像分割(已被取代,保留作对照)

  • tools/city-massing/house-library/house-library.blend、library.json、独立 GLB 和 preview.png:房屋资产库(8 个变体,已被维护者认为单栋质量基本够用)。
  • tools/city-massing/asset-fit.json:足印模块 ↔ 资产变体的唯一缩放窗口契约,生成器与 Blender 导出器共用,防止两段各自放宽标准。
  • tools/city-massing/primary-area.mjs + primary-area.test.mjs:主场景区裁剪与包含的单一契约(6 项测试)。
  • tools/city-massing/segment-imagery-footprints.mjs + city/imagery-footprints.geojson + imagery-footprints-report.json:z19 卫星屋顶分割(6,000 足印,阈值与逐掩膜可靠性写在报告里)。
  • tools/city-massing/verify-imagery-footprints.mjs + city/imagery-footprints-verify.png:1:1 卫星底图对照图,用于人工判读足印是否真的压在屋顶上。
  • tools/city-massing/generate-oldtown-fill.mjs:来源足印 → 模块计划(含 sources 与逐条 excluded 原因)。
  • tools/city-massing/seat-oldtown.mjs:平地/台基/台阶三档落地,terraced 记录台阶切分。
  • tools/city-massing/verify-city-models.mjs + city/city-model-verification.json:主场景区/交通道路/掩膜/来源验收,并把无法自动判定的来源冲突单列。
  • tools/city-massing/draw-model-coverage.mjs + city/city-model-coverage.png / city-model-coverage-core.png:生成足印叠在卫星底图上的覆盖对照。
  • tools/city-massing/district/generated/coverage.json、geometry-verification.json:示范街区的来源覆盖与 GLB 坐标检验。

本地工具:Blender 5.2.2 LTS 位于 D:/Steam/steamapps/common/Blender/blender.exe,批处理制作与导出成功。3ds Max 2024 批处理探针未进入脚本就绪状态,本次已停止,未声称用 Max 制作成功。

独立审查页:http://127.0.0.1:8092/preview.html(serve-review.mjs,只监听本机并复用8001的引擎/GIS)。不写入生产产物。旧 map.tilesets 已置空;新街区只通过审查入口展示,未擅自正式启用。

渲染与回归

  • 本轮实际跑通的验证:primary-area.test.mjs 6/6、oldtown-geometry.test.mjs 5/5、verify-lod-district.mjs 三棵树全通过、verify-city-models.mjs passed:true(主场景区外 0 / 交通道路上 0 / 掩膜外 0,5 处来源冲突如实列出)。
  • 离线视觉对照:city/imagery-footprints-verify.png(1:1 卫星底图 + 足印描边)与 city/city-model-coverage-core.png(生成足印压在城市核心卫星图上)已由本人读图判读:足印落在屋顶、街区内、河岸与山体保持空白。
  • Cesium 运行态:审查页 http://127.0.0.1:8092/preview.html 仍在,但它依赖 8001 的 dev 服务取 Cesium;本轮 8001 未在运行,因此没有重新取得运行态截图或帧率。项目规则禁止擅自启动 dev/调试服务,故运行态验收留待维护者开启服务后进行。
  • 未重跑全仓 build;按项目规则不把局部资产实验扩大成自动全仓构建。

视觉与数据限制

房屋外观比旧版实质改善,样式也不再单一,但不能把有窗的详细单元等同逐栋真实建筑复原。楼层与立面是估计;DEM 自身精度、屋顶视差和历史影像错配依然存在。影像分割足印是最小外接矩形,贴邻无阴影分隔的两栋会并成一栋、暗屋顶会漏、L 形与天井不表达,位置不确定度约 0.3–0.6 m。掩膜 63/130 的影像足印已被判为不可信并排除,但这属于人工读图判读,不是自动质量指标。允许保留数值证据,不允许据此重新声称“全城达标”。

下一步

  1. 由维护者开启 dev 服务后复测运行态:三树组合的内容队列、下载量、帧耗时与遮挡,oldtown 已增至 4,601 模块,必须重新测量。
  2. 人工判定 regular-estate 的 5 处来源冲突(影像描绘屋顶 vs OSM residential 巷道),决定改路还是改描绘。
  3. 推进仍无足印来源的区域(老城掩膜外、城南部分片区):要么补描屋顶,要么明确标注为未建模。
  4. 收窄落地阶段排除的 2,991 个模块(主要是 DEM 高差与资产比例),按需扩展资产尺寸族,而不是放宽缩放窗口。
  5. 取得维护者视觉认可后再标 100% 关闭;未关闭时不在 map 的 Decisions so far 新增已完成结论。