水利工程三维可视化的技术路径选择
一、模型轻量化
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 精度瓦片。
- 线性工程长:渠道、堤防包围盒极大但有效内容稀疏, 空间索引若按规则方块切分会产生大量空瓦片, 要按工程走向做条带切分或沿桩号分段建索引。
- 需要叠加水文与监测数据:水位、流量、位移、渗压这些时序数据 要和空间位置绑定。常见做法是监测点用独立的点图层,位置存在库里、 符号化在前端做、数值按时间范围拉取,不要做成模型构件。
四、性能瓶颈与选型
- 面数:单帧绘制调用(draw call)比总面数更致命。 10 万个面若拆成 2000 个网格,比 100 万个面合成 30 个网格还慢, 所以要合并静态网格、用实例化渲染画重复构件。
- 纹理:单张 4096×4096 的贴图在移动端可能直接失败, 统一压到 2048 并按需加载。
- 地形瓦片:瓦片数量过多会让主线程被解析和几何构建卡死, 限制并发请求数(6~10 个)并把解析放到 Worker 里。
- 并发访问:几十人同时打开高精度模型时,带宽往往比服务器算力 更早成为瓶颈,要开 gzip/brotli 并做缓存。
| 场景 | 推荐路径 | 关键取舍 |
|---|---|---|
| 内部技术交底 | CS 桌面端或局域网 BS,LOD3 全精度 | 可牺牲加载速度,换构件级精度与剖切能力 |
| 对外成果展示 | BS + Three.js,LOD2 为主 + 重点单体 LOD3 | 首屏 3 秒内出画面,宁可少展示细节 |
| 运行期监测平台 | BS + Cesium 地理底座,模型 LOD1/LOD2 | 模型是背景,数据图层才是主体 |
五、代价与坑
- 浏览器内存上限:单场景几何数据建议控制在 300 MB 以内, 超过这个量级,无论显卡多好,切视角时页面都可能崩溃。
- 移动端支持是另一套工程:移动端 GPU 的填充率和显存带宽都差一个档次, 同一场景在桌面流畅、手机上可能只有 8 帧,要单独做更激进的 LOD 策略。
选型逻辑:先看场景范围决定用不用地理引擎,再看交付对象决定 BS 还是 CS, 最后按使用频次决定轻量化力度。