两种方案对比
-
贴图流动材质(本文实现):适合大量管网,GPU 效率高,上万条管线也能跑;管线上面有连续流动色带,可调节流速、颜色、色带宽度;项目首选。
-
管线粒子流:沿着管线每隔一段生成 Billboard 粒子,适合需要气泡、油滴效果;管线一多容易卡顿,少量重点管道演示使用。
管线流动仿真流速: {{ speed }}{{tipText}}
核心知识点
1. 材质 Shader 原理
materialInput.st:polyline 的纹理 uv,s 沿着管线走向,t 垂直管线;
st.s沿着管线长度方向;czm_frameNumber基于帧号做时间,不依赖系统时间,暂停相机动画时流动不会变速;fract实现循环色带;smoothstep做柔和过渡,避免硬边锯齿。
2. 管线分类设置
- 地下管线(给排水、燃气) :
clampToGround:false,高程低于地表;配合管线埋深属性; - 架空管线(油气长输、热力):设置离地高程;
- 贴地沟渠、明渠 :
clampToGround:true;
3. 流速、流向控制
材质 uniform 暴露 speed 和 dir:
- speed:越大流动越快;0 停止;
- dir = 1 /-1,一键反转介质流向,管网调度仿真非常常用。
项目高频扩展功能
- 多介质多颜色管线
燃气、水、原油、蒸汽使用不同颜色材质;建立管线分类字典,根据介质类型自动切换材质。 - 阀门、泵、节点符号
在管线拐点添加 Billboard(阀门、泵、流量计、压力表图标);点击节点弹窗展示实时监测数据(对接物联网)。 - 爆管 / 故障告警闪烁效果
故障管线切换闪烁材质,shader 内增加sin(czm_frameNumber * 0.1)实现红闪告警。 - 管线拾取、弹窗、属性面板
绑定description,或者监听viewer.selectedEntityChanged,选中管线拉取后端实时流量压力数据。 - 管线剖面查看
选中管线,自动提取管线高程序列,绘制纵断面曲线图(距离 - 高程),水利、给排水审图必备。 - 粒子流体(气泡 / 油滴效果)
沿着 polyline 采样等距点位,定时生成半透明小圆点 billboard,沿着管线前进,到达终点销毁;适合重点管道特写展示。 - 管线遮挡透明
管线被建筑 / 地形遮挡时自动半透明,使用distanceDisplayCondition或者深度判断 shader。
踩坑清单
- ❌ 管线流动方向和管线绘制顺序相反
✅ shader 里调整dir正负,或者调换管线 positions 数组顺序; - ❌ 管线拐角处纹理拉伸变形
✅ polyline 宽度不要过大;管线转角不要过急;复杂管网分段; - ❌ 大量管线之后页面掉帧
✅ 材质复用!不要每条管线 new 一个 Material;统一共用一个 material 实例,通过属性分组控制; - ❌ 地下管线被地形盖住看不见
✅ 管线高程抬高一点,或者开启地形剖切,剖切盒切出管沟; - ❌ 流动速度在不同电脑快慢不一样
✅ 使用czm_frameNumber(示例方案),不要用czm_time,czm_time 受帧率影响。