水利工程三维可视化的技术路径选择

一、模型轻量化

1. 减面与几何清理

  • 删内部构造:闸墩内部、底板以下的桩基埋深,外观上看不到的一律删。
  • 合并共面:Revit 导出常见大量碎三角面,用 merge vertices 加公差合并,通常能砍掉 20%~35%。
  • 控制曲率细分:管道、弧形翼墙这类曲面,弦高容差放到 5~10 mm 即可,面数能降一个量级。

2. LOD 分级

同一个水闸做三档:LOD1 只有外轮廓体块,LOD2 去掉内部构造和设备细节, LOD3 只在近距离调起,分档按屏幕投影面积判断。

3. 外部参照合并与格式转换

建模时分专业用外部参照组织是对的,但导出前必须固化,否则常出现构件丢失 或位置漂移,多专业参照同一构件时会产生重复网格。

转换路径适用场景主要问题
IFC → glTF / GLB 单体水闸、泵站厂房、机电设备 构件层级可能被压平,属性需另存 JSON
IFC → 3D Tiles 大范围地形 + 多单体集群、线性工程 需先切分空间索引,切分策略影响加载
原生模型 → 自定义二进制 对首屏速度要求极高的展示型项目 格式私有,后续维护成本高
转换一定会丢信息。IFC 的属性集、构件关联关系、材质分区,转成 glTF 后基本不复存在。 稳妥做法是几何走 glTF,属性单独导出成以构件 ID 为主键的 JSON 按需反查。

二、Web 渲染方案对比

Three.js 直接加载

自由度高,加载 glTF 就是几行代码,材质、剖切、漫游这些交互想怎么做就怎么做。 代价是地理场景要自己搭:坐标转换、地形切片、地球曲率处理全部得手写。 范围只有单个水闸或一段 2 km 渠道时,直接上 Three.js 最省事。

Cesium 做地理场景

当范围到几十公里河道、需要叠加真实地形与影像、或要和桩号经纬度严格对应时, Cesium 的价值就出来了:地形瓦片加载、LOD 调度、坐标系统、时间轴动画 (洪水演进、水位过程)都是现成的。缺点是包体积大、启动慢,且本质是地理引擎, 对精细 BIM 单体的构件级交互支持较弱。

BS 与 CS 之争

维度BS(浏览器)CS(桌面端程序)
部署与更新改完即生效,无需安装需分发安装包,版本管理麻烦
大模型承载受限,通常需降到 100 万面以内可承载千万面级别
移动端可访问,但体验受限基本不支持
GPU 利用率受浏览器限制可直连显卡,性能上限高
并发访问天然支持多人同时查看需另配许可与并发管理

对外展示走 BS,内部高强度建模审查走 CS, 两者共用同一份轻量化后的模型数据。

三、水利场景的特殊性

  • 地形范围大:一条 30 km 的河道,若地形精度取 1 m 网格, 单是地形网格就上亿个点,必须做成瓦片金字塔按视锥裁剪加载, 远景用 30 m 甚至 90 m 精度瓦片。
  • 线性工程长:渠道、堤防包围盒极大但有效内容稀疏, 空间索引若按规则方块切分会产生大量空瓦片, 要按工程走向做条带切分或沿桩号分段建索引。
  • 需要叠加水文与监测数据:水位、流量、位移、渗压这些时序数据 要和空间位置绑定。常见做法是监测点用独立的点图层,位置存在库里、 符号化在前端做、数值按时间范围拉取,不要做成模型构件。

四、性能瓶颈与选型

  1. 面数:单帧绘制调用(draw call)比总面数更致命。 10 万个面若拆成 2000 个网格,比 100 万个面合成 30 个网格还慢, 所以要合并静态网格、用实例化渲染画重复构件。
  2. 纹理:单张 4096×4096 的贴图在移动端可能直接失败, 统一压到 2048 并按需加载。
  3. 地形瓦片:瓦片数量过多会让主线程被解析和几何构建卡死, 限制并发请求数(6~10 个)并把解析放到 Worker 里。
  4. 并发访问:几十人同时打开高精度模型时,带宽往往比服务器算力 更早成为瓶颈,要开 gzip/brotli 并做缓存。
场景推荐路径关键取舍
内部技术交底 CS 桌面端或局域网 BS,LOD3 全精度 可牺牲加载速度,换构件级精度与剖切能力
对外成果展示 BS + Three.js,LOD2 为主 + 重点单体 LOD3 首屏 3 秒内出画面,宁可少展示细节
运行期监测平台 BS + Cesium 地理底座,模型 LOD1/LOD2 模型是背景,数据图层才是主体

五、代价与坑

  • 浏览器内存上限:单场景几何数据建议控制在 300 MB 以内, 超过这个量级,无论显卡多好,切视角时页面都可能崩溃。
  • 移动端支持是另一套工程:移动端 GPU 的填充率和显存带宽都差一个档次, 同一场景在桌面流畅、手机上可能只有 8 帧,要单独做更激进的 LOD 策略。
选型逻辑:先看场景范围决定用不用地理引擎,再看交付对象决定 BS 还是 CS, 最后按使用频次决定轻量化力度。