config.example.json 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. {
  2. "_readme": [
  3. "驾驶舱部署配置模板。用法:复制成同目录的 config.json 再按环境填写 —— config.json 不入库(见根 .gitignore)。",
  4. "分层覆盖顺序(后者覆盖前者):内置默认 → 构建期 VITE_COCKPIT_* → 本文件 → 宿主注入的 globalThis.__COCKPIT_CONFIG__。",
  5. "启用本文件(默认不探测,免得每页刷 404):宿主页加一行 window.__COCKPIT_CONFIG_URL__ = 'auto',或构建期设 VITE_COCKPIT_CONFIG_URL=auto(也可以给绝对 URL 从后端拉)。",
  6. "dataSource 默认 mock:只有显式写 real 才会请求真实后端,mock 与真接口走同一个适配层(services/cockpitApi.js)。",
  7. "api.token / ws.token 是给开发与联调用的只读令牌;生产环境应由网关/反向代理在转发时补 Authorization 头,这里留空即可。",
  8. "本项目优先用内网离线数据:底图默认 natural-earth(Cesium 自带离线影像,无需账号/外网/密钥)。在线源(tianditu 需 tk、arcgis-imagery 免 key)只作为可选项。",
  9. "map.basemap.source 取值:none(不配底图)/ natural-earth(离线,推荐)/ xyz(任意 {z}/{x}/{y} 模板,本地或自建瓦片)/ tianditu(需 tk)/ arcgis-imagery(在线,免 key)。",
  10. "map.terrain.url 指向量化网格 DEM 目录(内含 layer.json);map.overlays[] 叠本地精细影像(TMS 用 {reverseY},bounds 填数据实际范围)。",
  11. "map.performance 是渲染开销档(票 35/59):不写 = 用代码默认档(resolutionScale 0.75 / msaaSamples 0 / fxaa / atmosphere / globeScreenSpaceError 3 / terrainVertexNormals / ibl / maxConcurrentRequests 6)。**写哪项覆盖哪项**,没写的继续用默认;回退到整改前画面写 {\"resolutionScale\":1,\"msaaSamples\":4,\"atmosphere\":true,\"globeScreenSpaceError\":2}。弱机可再降:resolutionScale 0.65、tilesetScreenSpaceErrorScale 1.2、discreteLod true。",
  12. "map.detail.tiers 是**层级表**(票 61 第十六轮,为五级 LOD 准备):形如 [{name, geometry, activateWithinM}, …],按距离从远到近声明,运行时会用「上界 ≥ 距离里最小的那个」并据此反解精模阈值;不写就是默认五级(6000/3000/1600/600/250)。注意当前资产只有 coarse/preview/fine 三种几何,所以第 0-1 级与第 3-4 级暂时落在同一份几何上——等票 91 产出 medium 级资产后自动生效。",
  13. "map.detail 里另有 fineScreenSpaceError(默认 24) 与 fineFoveated(默认 false) 两项,专管『近景建筑是不是精模』:细模区域 tileset 的层级是 preview(ge=48) → fine(ge=0),窗户/立面全在 fine 层,要靠屏幕空间误差下钻。实测 sse=115 只有 293m 内才有窗、sse=24 有 1403m —— 阈值越大越省性能但越早变火柴盒。fineFoveated=true 会让屏幕中心比边缘更精细(同距离也不一致),默认关闭以保证『同距离同细节』。",
  14. "map.detail 是细模覆盖档(票 61):控制'精模由近及远覆盖到多远、驻留多少'。frontier 可写 minRadius(600)/maxRadius(6000)/growFactor(1.18)/growIntervalMs(400)/shrinkFactor(0.35)/moveWindowMs(220);budget 可写 maxContents(1200)/maxDecodedBytes(384MiB,规划估算值,约为磁盘/GPU 的 4.5 倍;低配机调低)。成像含义:镜头动 → 收到近景保住帧率;镜头停 → 一拍一拍往远处铺,直到 maxRadius 或预算用完。",
  15. "map.tilesets[] 是 3D Tiles / 倾斜摄影入口,每项一个 tileset.json 的 URL(没有根 tileset.json 的数据先别填;详见 docs/cockpit-deployment.md)。可选 maximumScreenSpaceError 控制几何误差,maximumDistance 控制批次距离剔除,loadDistance 控制批次懒加载距离,eager=false 可避免启动时初始化该批次;模型量大时优先拆成带 viewerRequestVolume 的小瓦片,远景粗模应与精模共用 GIS 足印,避免用道路填充模型代替建筑位置;运行时按距离加载并串行等待内容处理。",
  16. "map.ui.debug 控制界面形态:null(默认)= 跟随构建模式(开发构建显示诊断信息、生产构建自动收敛成干净形态);写 true 可在生产包里临时打开诊断读数。",
  17. "map.viewMode.pipeline 可调管线视图的倾角/距离系数/地形与模型的半透明程度。",
  18. "map.primaryArea.bounds 是主场景区矩形 [西, 南, 东, 北](度),与 map.overlays[].bounds 同口径;顺序必须自己写好(west<east、south<north),运行时不翻转。不填或顺序非法 → 区域限位与自建雾气整体关闭,引擎浮标如实写明原因。下面的坐标是本部署(沅陵县城)的契约示例,换部署请按自己的数据重算。",
  19. "map.fog 是区内视距雾(只在主场景区内生效)。默认 18000 m 起雾、42000 m 完全遮蔽、#bdcdd6;色值必须是 #rrggbb,且正式色相要偏冷白灰、不得发绿(现场复核)。本模板里的 fadeInMs/fadeOutMs 与高度带是**代码默认(规格取向)**,不是某个部署的现场值 —— 现场按观感调好后请在自己那份 config.json 里覆盖,别改回本模板。altitudeFullM/altitudeZeroM 是相机高度收口的两端:相机高于后者时雾收到 0(否则高空时整个地球会被涂成雾色 —— 退出会「地球变白」)。**必须 altitudeZeroM > altitudeFullM**,写反等于关掉这层保护(配置层会报 issue,但不替你改值)。altitudeSlewMs 是这层收口的**时间限速**,保证雾不会「一瞬间产生或消失」(返回全球时相机 range 跨 1.6e6 倍,不加限速就会跳变)。enabled=false 可整级关掉这层效果(限位不受影响)。",
  20. "map.grade 是一张图整幅调色(科技蓝滤镜):常驻全屏处理级,在雾之后执行(雾出的白也被统一成冷蓝调)。saturation/brightness/contrast 是色彩学三系数(1 = 原样),tint 是 #rrggbb 目标色调、tintStrength 是阴影向它混合的上限(实际权重随暗部加深,高光几乎不动)。刻意**不做** hue-rotate 双色:状态点的红/绿是第一线索,色相顺序不能动。enabled=false 可整级关掉;脏值一律退回代码默认。",
  21. "map.handover 是粗→精影像交接:全球/引导态隐藏精细影像,进区后等雾形成保护且瓦片可显示才渐显,返回反向交接(影像先收、雾后撤)。fadeMs 是渐显/收起时长(现为 380 ms:雾是距离雾、盖不住屏幕中心的脚下街区,渐显期间中心是「粗糙底图(陆地偏绿)↔ 精细影像」的混合,窗口越长那段绿越明显,故调短);minEdgeOcclusion 是相机到影像边处要求的雾遮蔽率(0–1,与 map.fog 的距离端点同源);requireTilesLoaded=false 可放宽『等瓦片』这一条。enabled=false 则精细层常显(回到交接之前的行为)。绝不承诺『边缘已被遮住』,那段观感请在真实画面上验收。",
  22. "map.locate.point/device 可覆盖完整定位视角的 heading/pitch/range(米);缺省点位 0/-55/500、设备 0/-55/150。设备档供后续设备联动票消费。",
  23. "map.cesium.enabled=false 可以让中央一张图退回临时影像兜底;map.cesium.baseUrl 只在把 Cesium 静态资源放到别处时才填(需绝对 URL)。",
  24. "ws.url 供票 15 的状态推送使用。"
  25. ],
  26. "version": 1,
  27. "dataSource": "mock",
  28. "api": {
  29. "baseUrl": "",
  30. "token": ""
  31. },
  32. "ws": {
  33. "url": "",
  34. "token": ""
  35. },
  36. "map": {
  37. "basemap": {
  38. "source": "natural-earth",
  39. "url": "",
  40. "subdomains": [],
  41. "minimumLevel": null,
  42. "maximumLevel": null,
  43. "credit": ""
  44. },
  45. "tianditu": {
  46. "token": "",
  47. "layer": "img"
  48. },
  49. "terrain": {
  50. "url": "",
  51. "requestVertexNormals": true
  52. },
  53. "overlays": [],
  54. "tilesets": [],
  55. "performance": null,
  56. "detail": { "frontier": null, "budget": null },
  57. "overlap": {
  58. "maxFan": 10
  59. },
  60. "locate": {
  61. "point": { "heading": 0, "pitch": -55, "range": 500 },
  62. "device": { "heading": 0, "pitch": -55, "range": 150 }
  63. },
  64. "primaryArea": {
  65. "bounds": [110.328749941417, 28.3917230659234, 110.465779226663, 28.4913038992907]
  66. },
  67. "fog": {
  68. "enabled": true,
  69. "startDistance": 18000,
  70. "endDistance": 42000,
  71. "color": "#bdcdd6",
  72. "fadeInMs": 800,
  73. "fadeOutMs": 400,
  74. "altitudeFullM": 20000,
  75. "altitudeZeroM": 42000,
  76. "altitudeSlewMs": 400
  77. },
  78. "handover": {
  79. "enabled": true,
  80. "fadeMs": 380,
  81. "minEdgeOcclusion": 0.9,
  82. "requireTilesLoaded": true
  83. },
  84. "grade": {
  85. "enabled": true,
  86. "saturation": 0.82,
  87. "brightness": 0.96,
  88. "contrast": 1.08,
  89. "tint": "#2fa8ff",
  90. "tintStrength": 0.26
  91. },
  92. "ui": {
  93. "debug": null
  94. },
  95. "cesium": {
  96. "enabled": true,
  97. "baseUrl": ""
  98. }
  99. }
  100. }