接触网三维模型 · 零件算子库
Railway Overhead Catenary System — Parametric 3D Models & Part-Operator Library
面向铁路接触网(OCS)参数化三维建模的开源交付:一套零依赖的零件算子库, 以及由该算子库生成的四个单文件、离线可用的三维模型。
English abstract — An open-source toolkit for parametric 3D modelling of railway overhead catenary systems: a dependency-free part-operator library together with four self-contained, offline-capable single-file WebGL models. No build step, no external library, no network access required.
一、概述
铁路接触网零部件种类繁多、装配约束强、尺寸受多部技术标准与图纸交叉限定。 本项目的技术路线为 零件 → 装配 → 布局 三级递进:将零件建模抽象为可复用的 零件算子,再由算子装配成柱型单元,最终布局成完整锚段。
全部模型为单文件 HTML,采用自研微型 WebGL 引擎渲染, 双击即可用浏览器打开,无需服务器、无需构建、无需联网。
二、模型清单
| 文件 | 内容 |
|---|---|
模型/接触网四跨锚段关节3D模型.html |
四跨非绝缘锚段关节 · 五柱四跨 · 简单链形悬挂 |
模型/接触网四跨锚段关节3D模型_受电弓视角版.html |
同上,附 受电弓第一人称骑乘视角 |
模型/接触网四跨锚段关节3D模型_受电弓视角版_低配.html |
同上,面向无独立显卡设备的降载版本 |
模型/接触网中间柱3D模型.html |
柱型可切换模型:内置中间柱、转换柱、中心柱、锚柱四种柱型的完整几何与装配,界面内一键切换 |
关于命名:
接触网中间柱3D模型.html沿用早期命名,实际内容不限于中间柱。 该模型内置四种柱型(colType=M中间柱 /X转换柱 /C中心柱 /A锚柱), 以及五种柱型配方,可在界面左侧「柱型(锚段)」处直接切换,无需另开文件。
模型规模实测
| 模型 | 零件数 | 顶点数 | 三角面数 |
|---|---|---|---|
| 四跨锚段关节 | 84 | 1,550,238 | 516,746 |
| ├ 其中 承力索(单件) | 1 | 709,320 | 236,440 |
| └ 其中 拉线(单件) | 1 | 159,312 | 53,104 |
| 中间柱(默认柱型) | 84 | 298,596 | 99,532 |
| 受电弓(骑乘视角) | — | — | 1,312 |
三、技术特色
3.1 承力索按绞线建模(非光滑圆柱)
承力索采用 strandCable 算子建模:中心股 + 外层 6 股沿轴线螺旋缠绕,
具有真实的绞线外观与外包络尺寸,而非简化为光滑圆柱。
模型内坚持单一事实来源:绞线外包络半径 = 0.92 × 传入半径,
故调用点统一传入 msgR / 0.92,使绞线外包络严格等于承力索设计外径 φ11。
拉线(钢绞线)、供电线与回流线(铝包钢芯铝绞线)同样按螺旋绞线建模, 其中附加导线按「降股降段」处理以控制面数,但仍保持螺旋绞线形态。
3.2 接触线按异型断面建模(含悬吊沟槽)
接触线并非圆截面,而是按 CT-120 异型断面(TB/T 2809-2017 表2) 以
CON_PROF 轮廓常量沿导线中心线挤出成型,其头部左右两侧开有悬吊沟槽、槽口朝外。
线夹亦按该断面建模:线夹片体的突出部伸入同侧沟槽腔,以啮合方式夹持, 而非以包围圆截面的方式简化处理。
3.3 线夹布置不侵入受电弓动态包络线
接触线上的各类线夹按不侵入受电弓动态包络线的原则布置与建模, 以满足受电弓取流的安全限界要求,保证弓网受流面不被线夹侵占。
3.4 技术标准符合性
模型的关键尺寸均以现行技术标准为依据,并在代码内逐条登记出处:
| 对象 | 依据 |
|---|---|
| 接触线 CT-120 异型断面 | TB/T 2809-2017 表2 |
| 棒形腕臂瓷绝缘子结构高度 H = 760 mm | TB/T 3199.1-2018 表1 |
| 承力索座型号 GDB1(适用管径 60) | TB/T 2075.1E 表6 |
| 附加导线悬挂金具(吊环/杵座鞍子/双耳鞍子) | TB/T 2075.20-2010 |
| 补偿滑轮组 G1:3(1:3 传动比) | TB/T 2075.12A(G1:3)—10 |
| 定位环、锚支定位卡子 | TB/T 2075.3B / 3C / 3D 系列 |
| 补偿滑轮间距 ≥ 500 mm | 《接触网运行维修规则》§114(四)4 |
模型内置合规审计表(dumpScene() 内 compliance 段),对中心柱接触线等高、
中心柱拉出值 200 mm、中心柱承力索高差 300 mm、上下底座竖向间距 1700 mm、
双腕臂底座沿线间距 1200 mm、线夹座至导线中心线闭合等指标逐项判定 pass / fail。
3.5 零件算子库开源(本项目核心价值)
这是本项目最主要的开放内容。
交付的不只是四个成品模型,更是生成这些模型的零件算子库:
算子/零件算子/parts.js—— 零件算子(参数进 → 几何出)算子/算子核心/geom.js—— 几何核心算子/样板/空白中间柱.html—— 空白样板,不含任何算子源码,入库即用算子/接口规范_零件资产.md—— 零件资产接口规范(见 §4)
使用者可基于算子库自行搭建新的柱型、新的锚段、乃至新的线路区段, 而不必从零复刻几何;亦可将算子库接入自身的批量建模流程。
四、三条硬接口契约
「可拼接」的前提,不是零件画得多细,而是每个零件都遵守同一份契约。
- 单一事实来源 —— 一个几何量只在一处算出,其它所有地方引用它。
- 不得依赖隐式前提 —— 语义必须写进代码,不能靠"当前数据恰好满足"。
- 无模块级可变状态 —— 零件函数必须是"参数进 → 几何出"的纯函数。
上述三条并非理论设计,每一条均源自一次真实事故,规范文档内附四例反面实证。
五、技术实现
自研微型 WebGL 引擎(不依赖 three.js 等任何第三方库):
BUF顶点缓冲 →part()分组 →withM()真矩阵栈 →upload()交错打包 (14 个 float / 顶点)→drawArrays提交;- 内置阴影通道(
SHADOW_SIZE = 2048深度贴图)、屏幕拾取、剖面、三维标注层; - 设备像素比自适应,窗口尺寸变化时重建画布。
受电弓为真三维几何,非贴图或二维叠加层:
受电弓与模型共用同一 WebGL 上下文与深度缓冲,在模型本帧绘制完成后, 以同一套投影/视图矩阵提交绘制。因此导线、腕臂、支柱与受电弓之间的遮挡关系真实正确 ——受电弓被导线遮挡的部分即被正确遮挡。
六、审计接口
模型暴露 window.__CAT,供自动化核验几何,避免以目测代替验收:
__CAT.PT // 零件类型表
__CAT.PARTNAME // 零件 id → 名称
__CAT.partGeom(id) // → { id, name, verts, tris, points[] }
__CAT.dumpScene() // 全场景快照(含合规审计段)
__CAT.pick(x, y) // 屏幕坐标拾取
骑乘视角版另有 window.__RIDE:
__RIDE.enter() / exit()
__RIDE.state // { on, x, v, mult, off, panto, ... }
__RIDE.project(p) // 世界坐标 → 屏幕 { x, y, w }
__RIDE.glInfo() // → { ok, tris, ctx, size }
验收口径:几何结论一律以工具回读为准,不以截图目测为准。
算子库附带 verify_parts_lib.py,采用 Möller–Trumbore 三角级求交、逐件顶点哈希、
帧内 gl.readPixels 回读进行比对,并内置负控
(故意注入偏差,必须报错方证明校验器本身有效)。
七、低配模式(无独立显卡设备)
针对 Windows 7 + 低主频 CPU + 小内存 + 无独立显卡 (浏览器退回 SwiftShader 纯 CPU 光栅)的部署环境,低配版做了三组降载:
| 组别 | 措施 |
|---|---|
| 像素 | 设备像素比上限 2 → 1;设像素预算 1280×720,超出则等比缩减画布(CSS 仍铺满窗口) |
| 三角 | 顶点按 10 m 线路分块重排,每帧仅提交相机 ±60 m 范围内的块;默认关闭阴影通道 |
| 面数 | 圆柱/球/多段管段数折半 |
关键约束:分块重排仅重排送往 GPU 的副本数组,原始顶点缓冲保持不变,
故 partGeom、审计与拾取的语义完全一致。
实测(开发机 RTX 4060,非目标机;每帧量以 drawArrays 插桩、3 帧采样):
| 指标 | 标准版 | 低配版 | 变化 |
|---|---|---|---|
| 全场景三角(逐件合计) | 516,746 | 289,234 | −44% |
| 全场景顶点 | 1,550,238 | 867,702 | −44% |
| 画布像素 | 2400×1401 = 3.36 Mpx | 1256×733 = 0.92 Mpx | −73% |
| 每帧提交三角 | 1,060,725 | 169,139 | −84% |
| 每帧光栅像素(含阴影通道) | 3.36 + 4.19 = 7.55 Mpx | 0.92 Mpx | −88% |
| 每帧 draw call | 3 | 15 | +12 |
| 阴影通道 | 开(2048²) | 关 | — |
draw call 由 3 增至 15,系分块剔除将单次全场景提交拆分为多个小批次所致, 由此换取 84% 的三角削减。
内存为低配设备的主要瓶颈:顶点 JS 数组约占 150–200 MB, 连同交错
Float32Array约 89 MB 与 GPU 副本约 89 MB。 因此降低面数为必要措施,而非可选项。
兼容性:全部代码为 ES5 语法(不使用箭头函数、模板字符串、let/const),
Windows 7 上可用的最高版本 Chrome 109 可直接运行。
若设备使用较新版本 Chrome 且无独立显卡,可能需以
--enable-unsafe-swiftshader(或 --use-angle=swiftshader)参数启动方可建立 WebGL 上下文。
八、已知偏差与未闭合项
本节如实登记当前版本尚未达到设计要求或尚未闭合的事项。 相关结论不得用于施工、下料或作为设计依据。
8.1 平腕臂套管双耳与承力索座的间距
部分柱型下,平腕臂上的套管双耳与承力索座在几何上被并入同一区段, 未保持规定的 300 mm 间距。该偏差在本次发布中未予修正。
8.2 补偿装置的线索缠绕方式
补偿装置的滑轮组绕绳为已知未闭合项,模型内已有明确登记:
- 定滑轮与动滑轮之间的两股绳,系按「轮半径 + 绳半径」的几何切线推求而得,
未与
G1:3 补偿滑轮组(TB/T 2075.12A(G1:3)—10)产品图或厂家穿绳图的 绳槽走向核对; - 所据立面图仅标注轮位与间距「≥600」,未画绳;产品级穿绳图本期未取得;
- 因此「哪一股绳压哪一股、死端锚于哪一块夹板、绳在轮槽内绕几圈」属未证实; 死端锚点亦为推定。
⇒ 不得据本档施工或下料,须待设计方或厂家穿绳图确认后回改。
8.3 模型自报的未闭合审计项
模型合规审计表内以 pending 状态登记的项:
| 审计项 | 期望 | 登记原因 |
|---|---|---|
dropper-rope-path-eye-clearance |
吊弦绳路径与耳环管无干涉 | 附着坐标闭合不足以确立绳路径间隙 |
locator-clamp-profile |
74×35 mm、52 mm 孔距、M10 | 仅有零件库外形尺寸,断面与啮合未核 |
anchor-output-drawing-basis |
图纸依据的终端点与引出几何 | 自定义终端几何连通,但未与终端图纸核对 |
此外,dropper-eye-closure、base-vertical-spacing 等项在部分柱型下亦为
pending 而非 pass。
九、运行方式
# 直接打开(推荐)
双击「模型/」下任一 .html
# 或启动本地静态服务器
python -m http.server 8000
# → http://localhost:8000/模型/
算子库自校验(需模型文件位于同级 模型/ 目录):
python 算子/零件算子/verify_parts_lib.py # 正控:应返回 0
python 算子/零件算子/verify_parts_lib.py --negctl # 负控:应返回非 0
若模型不在默认位置,可用环境变量指定仓库根目录:
CATENARY_ROOT=/path/to/catenary-3d-model python 算子/零件算子/verify_parts_lib.py
十、关于本仓库
本仓库仅包含算子与模型本体。 项目所依据的参考资料(内部图纸、技术标准扫描件、现场照片、装配数据台账等) 均未包含,亦不在版本历史中。
发布副本已作去内部出处处理:
- 移除模型内嵌图纸索引中的内部文件路径与文件哈希;
- 内部图号统一替换为中性代号(
R-M#/R-J#/R-A#系列); - 移除内部线路名、内部图册名与内部文档目录引用;
- 移除开发机绝对路径。
验证结论:替换前后逐件几何签名完全一致 (84 件、1,550,238 顶点、516,746 三角面,逐件顶点哈希逐位相同), 四个模型的渲染与交互行为一致。
予以保留:TB/T 等国家/行业公开标准的引用,属正常工程实践,非内部资料。
使用与授权
本仓库内容用于技术交流与参考。代码与模型可供学习、研究及内部评估使用; 如需用于商业用途或再分发,请先联系作者。 模型中涉及的铁路零部件标准归各自标准发布机构所有。
附录:目录树
catenary-3d-model/
├── README.md
├── 模型/
│ ├── 接触网四跨锚段关节3D模型.html
│ ├── 接触网四跨锚段关节3D模型_受电弓视角版.html
│ ├── 接触网四跨锚段关节3D模型_受电弓视角版_低配.html
│ └── 接触网中间柱3D模型.html (含 M / X / C / A 四种柱型)
└── 算子/
├── 接口规范_零件资产.md
├── 零件算子/
│ ├── parts.js
│ └── verify_parts_lib.py
├── 算子核心/
│ ├── geom.js
│ ├── test_geom.js
│ ├── verify_migration.py
│ ├── audit_nesting.py
│ ├── _ccheck.py
│ └── _det_check.py
└── 样板/
└── 空白中间柱.html