VISSIM(由 PTV Group 开发的微观交通仿真软件)与 Three.js 的交互方式,与 SUMO 类似,但技术细节有所不同。因为 VISSIM 是商业闭源软件,其数据获取和控制主要依赖于 COM 接口(Windows 平台)或 VISSIM 的 API(如 VAP)。
一、核心思路
将 VISSIM 仿真的实时车辆、行人、信号灯等动态数据导出 → 通过后端服务传输到 Web 前端 → 用 Three.js 渲染 3D 场景。
整个流程其实就三步:
- 从 VISSIM 获取仿真数据(位置、速度、ID 等)
- 将数据推送到 Web 前端(通常通过 WebSocket 或 HTTP)
- 前端用 Three.js 实时更新 3D 对象
二、具体实现步骤
1. 使用 VISSIM 的 COM 接口(Python / C#)
VISSIM 提供了基于 COM 自动化的接口,可在 Windows 上通过 Python(使用 win32com)、C# 等语言控制 VISSIM 并读取仿真状态。这里以 Python 为例,演示如何读取车辆位置并发送。
import win32com.client
import time
import json
import websocket
# 启动或连接 VISSIM
vissim = win32com.client.Dispatch("Vissim.Vissim")
vissim.LoadNet("my_network.inpx")
vissim.LoadLayout("my_layout.layx")
sim = vissim.Simulation
net = vissim.Net
# 建立 WebSocket 连接
ws_url = "ws://localhost:8080"
ws = websocket.create_connection(ws_url)
# 运行仿真并实时读取
for step in range(1000):
sim.RunSingleStep()
# 获取当前步的车辆数据
vehicles = net.Vehicles.GetList()
for v in vehicles:
pos = v.Position
speed = v.Speed
data = {"id": v.ID, "x": pos[0], "y": pos[1], "speed": speed}
ws.send(json.dumps(data))
time.sleep(0.1)
这段代码展示了最基础的闭环:加载路网、单步运行、提取数据并通过 WebSocket 推送。注意 RunSingleStep() 是逐帧控制的关键,配合 sleep 可以调节仿真速度与通信频率。实际运行时可能会遇到网络延迟问题,建议在后端做简单的缓冲处理。
2. 前端 Three.js 渲染
后端推送的数据通常是经纬度或网格坐标。在 Three.js 中,我们需要维护一个场景图,根据车辆 ID 查找对应的 Mesh 对象,然后更新其 属性。如果车辆数量较多,建议使用 InstancedMesh 优化性能,避免频繁创建销毁对象带来的开销。


