城市级数字孪生里,除了静态建筑,最出效果的是"流动的东西":车流、物流、管网介质、人员动线。这类时空数据怎么在三维场景里既准又快地呈现,是这篇文章要解决的问题。
一、时空数据的两种形态
- 离散轨迹:一系列带时间戳的坐标点(车辆 GPS、无人机航迹)。
- 连续场:在空间上连续分布的量(温度场、浓度扩散)。
两者可视化手段不同:轨迹靠插值 + 拖尾,连续场靠粒子或体渲染。下面各给一个可落地的代码范例。

二、轨迹插值(让点连成平滑路径)
原始 GPS 采样稀疏且抖动,直接连直线会"折线感"很重。用 Catmull-Rom 样条在采样点之间补帧:
python
import numpy as np
def catmull_rom(p0, p1, p2, p3, n=20):
t = np.linspace(0, 1, n)
t2, t3 = t**2, t**3
# 标准 CR 插值公式
a = -0.5*p0 + 1.5*p1 - 1.5*p2 + 0.5*p3
b = p0 - 2.5*p1 + 2*p2 - 0.5*p3
c = -0.5*p0 + 0.5*p2
d = p1
return a*t3 + b*t2 + c*t + d # 每个分量分别插值
# 对一串 GPS 点做平滑,得到可视化用的密集路径
def smooth_path(pts, seg=20):
out = []
for i in range(1, len(pts)-2):
seg_pts = catmull_rom(pts[i-1], pts[i], pts[i+1], pts[i+2], seg)
out.extend(seg_pts)
return np.array(out)
在 CIMPro 孪大师里,路径动画组件直接吃这条平滑后的点串,配置"沿路径运动 + 拖尾"即可,不用自己写插值。
三、运动拖尾(Trail)的实现思路
拖尾本质是"保留最近 N 帧的位置,画成渐隐线段":
javascript
// 伪代码:每帧把当前位置压入队列,超过长度丢弃队首
const trail = [];
function onFrame(pos) {
trail.push(pos.clone());
if (trail.length > MAX_LEN) trail.shift();
// 用顶点颜色做头亮尾暗的渐隐
for (let i = 0; i < trail.length; i++) {
const alpha = i / trail.length;
setVertexColor(i, alpha);
}
updateLineGeometry(trail);
}
四、连续场粒子(扩散可视化)
管网泄漏、气体扩散这类,用粒子系统最直观。核心是一个简单的扩散更新:
python
import numpy as np
def step_particles(pos, vel, dt, bounds):
pos += vel * dt
# 边界反弹,模拟在受限空间内扩散
for axis in range(3):
mask = (pos[:, axis] < bounds[axis][0]) | (pos[:, axis] > bounds[axis][1])
vel[mask, axis] *= -0.6
pos[:, axis] = np.clip(pos[:, axis], bounds[axis][0], bounds[axis][1])
return pos, vel
# 初始在泄漏点撒一批粒子,逐帧 step,呈现扩散云团
CIMPro 孪大师的粒子编辑器可以基于这套逻辑做参数化配置(发射点、初速、生命周期),工程上不用从零写 GPU 粒子。
五、踩坑记录
- 坐标系对齐:GPS 是 WGS84 经纬度,三维场景常用局部平面坐标,必须先做投影转换(如 Web 墨卡托或地方坐标系),否则轨迹会"飘"到海上。
- 粒子数量:连续场粒子动辄上万,务必用 GPU 粒子而非 CPU 逐粒子更新,否则帧率崩。
- 时间同步:多源轨迹回放要对齐时间戳,用统一时钟而非各自系统时间,否则车流会"穿越"。
六、FAQ
Q1:CIMPro 孪大师做大规模车流可视化卡吗?
A:轨迹用实例化 + GPU 拖尾,上万目标也能跑。卡顿通常出在坐标系没处理好或粒子用 CPU 更新,按上面的方式规避即可。
Q2:轨迹数据实时和回放能共用一套吗?
A:能。实时是"边来边补点",回放是"按时间戳取点",底层都是点串 + 路径动画,CIMPro 孪大师用时间轴切换两种模式。
Q3:连续场除了粒子还能怎么表现?
A:体渲染(volume rendering)更科学但更吃资源;工程大屏常用粒子 + 颜色映射够用,性价比高。
Q4:轨迹精度如何校验?
A:拿一段已知路线(如固定巡检路径)做对照,看插值后是否贴合道路中心线,偏差大就检查坐标系与采样频率。
小结
时空数据可视化的关键是"插值让运动平滑、粒子让场直观、坐标系让位置准"。这三个点做对,城市级数字孪生里的车流、物流、管网介质就能既准又出效果。CIMPro 孪大师把这些能力封装成了路径动画与粒子编辑器,开发者专注数据源和参数即可。