【免费下载链接】openOMSI
OMSI 2 recreated from scratch in Rust, compatible with every map and mod (requires the original OMSI 2)
openOMSI 是 OMSI 2 的 Rust 重写版本,完整兼容原版地图与 MOD,同时把原版中"铁路只是一个标志位"的设定升级为真正的轨道模拟:你的地图上可以同时跑起有轨电车(tram)、地铁(metro)和火车(train)。本指南将带你从零开始理解 openOMSI 如何自动识别轨道载具与轨道类型、如何升起受电弓取电、如何获得真实感的牵引与制动,以及如何用几个纯文本配置文件,让 AI 车辆按时刻表自动运营,全程无需改动任何老地图。
快速启动 openOMSI:打开启动器选择轨道载具
openOMSI 需要原版 OMSI 2 的素材库。若使用源码构建,执行:
cargo build --release -p omsi-app构建出的openomsi不带参数启动时会打开桌面启动器,在这里选择地图与载具。若想一步到位开启完整场景(AI 车流 + 时刻表车辆 + 乘客),可以这样运行:
openomsi --traffic N --schedule --line 76 --tour 1 --passengers参数含义见 USER_GUIDE.md。启动器会同时显示每张地图与每辆载具"属于哪种运输模式",帮助你在选车阶段就避免搭配错误。
三种轨道载具:游戏如何自动判断电车、地铁与火车
openOMSI 内部把轨道载具分为tram、metro、train三个类别(见 RAIL.md 与源码 rail/class.rs)。判断规则按优先级依次是:
- 文件显式声明:在
.bus/.ovh中加入[rail_class],值为tram、metro或train - 第三轨导电鞋:文件中有
[contact_shoe]→ 判定为地铁 - 重量与驱动轴:单节车超过 45 吨、或整车超过 60 吨且带四个驱动轴 → 判定为火车(长度不作数:42 米的低地板轻轨电车比 20 米的客车更轻)
- 兜底:其余一律按有轨电车处理
公路车辆不会被误判成轨道车——轨道载具永远有类别,公路车辆永远没有类别。
🔧提示:如果拿不准老 MOD 被识别成了什么,启动器里直接查看即可。
轨道识别:让游戏分清街道轨道与铁路
每条轨道车道都会获得一份TrackInfo:是街道轨道还是干线铁路、是否带第三轨、是否在隧道内、限速多少。识别依据按优先级依次是:
1️⃣ 地图配置规则(最优先)
在<地图目录>/openomsi-rail.cfg中写规则,支持通配符:
[track] file = Splines/MyMap/tram_*.sli class = tram street = yes third_rail = no speed = 40项目自带最小示例:docs/examples/openomsi-rail/openomsi-rail.cfg。network.cfg(位于地图transport文件夹)中的[track]规则功能相同且更新,两条配置可以同时存在。
2️⃣ 轨道轮廓名称(零配置也能跑)
原版编辑器够用:名称带tram、strassenbahn、tramway→ 街道有轨电车;带metro、ubahn、subway→ 带第三轨的地铁;带train、sbahn、railway→ 铁路。而rail_typ001、gleis这类泛用名称不含信息,交给第 3 条判断。
3️⃣ 轨道所处位置(兜底)
紧贴街道车道、或转弯半径小于 60 m 的轨道判定为有轨电车轨道(铁路不会弯得这么急),其余视为铁路。
⚡限速是自动的:每条轨道的车速会被压到其最急弯道允许的值(街道横向加速度 0.8 m/s²、铁路 1.4 m/s²),道岔的岔出分支同样自动限速。把火车开上街道轨道不会被禁止,但会在日志里提示——兼容优先。
道岔与受电弓:司机最重要的两个交互
道岔:道岔是地图中的.sco对象。玩家驾驶的车辆在分岔口按"指示器指向 → 道岔当前状态 → 最直路径"的顺序选择分支,并且会随着车轮自动转换所经过的道岔;从分支方向驶入(trailing)则跟随当前设定。AI 车辆按各自路线命名选择分支,并在约 600 m 外"申请"前方道岔。
受电弓:带受电弓的轨道载具弓不升起就无法动车(双向都没有牵引力,但制动正常)。
- 按Shift+P即可升起/降下你所驾驶车辆的受电弓
- 开启设置项Realistic road physics后,升弓动画会持续到弓头压上接触网为止,弓头只有在带电线上才取电;线下区段断流会产生拉弧
- 设置
[rail_power] catenary | third_rail | diesel可声明取电方式:在有catenary.cfg/thirdrail.cfg的地图上,车辆只在带电区段内才能动车,电压低于额定 80% 时动力衰减,低于 50% 动力归零 - 调试时可设置
OMSI_DEBUG_RAIL=1,每 0.5 秒记录一次受电弓取值、弓头-接触网状态与电流
轨道动力学:为什么 openOMSI 的电车开起来"像真的"
轨道动力学实现(rail/dynamics.rs)完整模拟了铁路工程中的各项力:
| 项目 | 模型 |
|---|---|
| 运行阻力 | 按类别取值(电车 3.5 N/kN、地铁 2.5、火车 1.5),随速度上升 |
| 空气阻力 | ½ ρ (Cd·A + 0.4 m²/节) v²,隧道内翻倍 |
| 弯道力 | Röckl 公式:650/(R-55)N/kN(R > 300 m) |
| 坡度 | 整车重力沿坡道的分量 |
| 粘着 | Curtius–Kniffler 公式;湿轨 0.7、落叶或积雪 0.4、冰面 0.2 |
| 驱动 | 脚本M_Wheel输出扭矩,上限为粘着力;超了就打滑 |
| 制动 | 全车Axle_Brakeforce_*,上限 0.9 倍粘着力;电车紧急制动追加磁轨制动(不受粘着限制) |
若车辆脚本不提供牵引力(原版火车多为 AI 专用脚本),游戏会用该类别的典型性能"兜底":电车 14 kW/t、起步 1.2 m/s²;地铁 14 kW/t;火车 9 kW/t、0.9 m/s²。
车辆文件还可以用 openOMSI 扩展块精确描述性能(OMSI 2 会安全忽略这些块,MOD 依然通用):
[rail_traction] point 0 80 point 90 36 power_kw 800 regen_point 10 60 [rail_brake] type air service 1.1 emergency 1.6 pipe_wave 250 [rail_coupler] type scharfenberg slack 0.03 stiffness 3000- 牵引曲线:油门按比例取曲线牵引力,且永不超过
P/v功率上限;粘着上限始终生效——电机再强,落叶覆盖的钢轨上照样打滑 - 空气制动:减压波以约 250 m/s 沿制动管传播,每节车厢的制动缸按
apply_time充风,车尾总比车头晚刹车,长编组刹停距离明显更长;电制优先、闸瓦补差 - 车钩:车辆间有自由间隙与钩缓装置,启动逐车"拉紧"有冲击感,牵引超过
max_force列车会断裂(制动自动施加并写入日志)
用 transport 文件夹:不画 tour 也能自动生成时刻表
想让 AI 车辆按真实时刻表自动跑线?在地图global.cfg旁边建一个transport文件夹即可(格式详见 TRANSPORT_FORMATS.md),OMSI 2 会直接忽略该文件夹,完全向后兼容:
| 文件 | 作用 |
|---|---|
routes.cfg | 线路、路段与班次(无需画 tour,游戏自动沿轨道路网寻路) |
stations.cfg | 车站与站台(侧式/岛式、屏蔽门) |
catenary.cfg/thirdrail.cfg | 架空线/第三轨供电区段、电压、断口 |
network.cfg | 轨道类别、供电方式与限速(openomsi-rail.cfg的升级版) |
switches.cfg | 道岔操作方式:自动/人工/联锁、岔出限速 |
depots.cfg | 车辆段:提供ai_group车辆,首班车从gate自动出库 |
signals.cfg | 信号机与闭塞分区:AI 列车占用区间自动停车 |
routes.cfg的核心思路:路线 = 路段集合,班次 = 按顺序走若干路段。分支线是"共用干线段 + 两条班次",短交路是"只走部分路段的班次",快车是"带skip跳站的路段"。示例:
[route] id M2 name Green line mode metro colour 40 160 60 [segment] id trunk from Sokol to Aeroport via Voykovskaya dwell 25 s speed 80 km/h [service] id all_day segments trunk north headway 3 min from 05:30 to 25:00 consist 6 depot Depot_Sokol turn_back reverse一个完整可参考的地铁示例在 docs/examples/transport-metro/transport/routes.cfg(含stations.cfg、thirdrail.cfg、depots.cfg)。配置写完后用检查工具自查,它会逐行报告问题:
cargo run -p omsi-transit --example transit_check -- maps/MyMap metro tram🚉亮点:车站会被自动匹配到地图上的公交站牌对象;时刻表里的发车间隔、运行时分由路段长度、speed与dwell自动计算;车辆来自班次的depot(其ai_group指向ailists.cfg中的 AI 车辆组),首班车从车辆段门口"开出",而不是凭空出现。
上手检查清单与调试技巧
- ✅老地图零改动:没有
openomsi-rail.cfg、没有transport文件夹的地图照旧加载,轨道按名称与位置自动归类,TTData时刻表不变 - ✅模式匹配:地图
global.cfg里声明了模式(如[tram_transport])后,与模式不符的载具不会出现在该地图上,游戏会说明原因;想测试时用OMSI_IGNORE_TRANSPORT=1临时绕过 - ✅调试日志:
OMSI_DEBUG_RAIL=1记录牵引/制动/受电弓细节;OMSI_REALISTIC_ROAD=1单次运行启用真实道路物理 - ✅手柄对比:
cargo run -p omsi-sim --example handling -- <文件.bus> --kmh 50 [--realistic]可对比新旧两套物理
更多文档
- 轨道载具全解:docs/RAIL.md
- 运输模式五个关键词:docs/TRANSPORT_MODES.md
- 车站/路线/供电/信号格式:docs/TRANSPORT_FORMATS.md
- 无轨电车(双线架空):docs/TROLLEYBUS.md
- 悬挂系统(车体在弹簧上的沉浮与侧滚):docs/SUSPENSION.md
- MOD 开发总览:docs/MODDING.md
现在,打开你的地图选一辆电车,按 Shift+P 升起受电弓——城市的轨道网络就要在你脚下流动起来了。
【免费下载链接】openOMSI
OMSI 2 recreated from scratch in Rust, compatible with every map and mod (requires the original OMSI 2)
相关推荐
如何快速让地图物件动起来:openOMSI 地图对象脚本(Lua/.oop)实战开发指南
如何快速让地图物件动起来:openOMSI 地图对象脚本(Lua/.oop)实战开发指南 ! openOMSI 安装界面,使用地图对象脚本功能前先准备好游戏环境
零成本且完全私有:如何用 Ollama/llama.cpp 让 Headlong Agent 在本地跑起来(完整指南)
零成本且完全私有:如何用 Ollama/llama.cpp 让 Headlong Agent 在本地跑起来(完整指南) Headlong 是一个开源的 Agen
three.js RollerCoasterGeometry 完全指南:程序化过山车轨道几何体的 API、源码原理与实战
three.js RollerCoasterGeometry 完全指南:程序化过山车轨道几何体的 API、源码原理与实战 本文围绕 three.js 官方 AP
3D渲染图形学前端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考