路線バス運転シミュレータ開発記

OMSIを使って路線バスの運転シミュレータを製作しています。備忘録的にゆるーく書いていきたいと思いますので、お付き合いいただければ幸いです。

開発にあたっての作業方針

アドオンの開発にあたり、OMSIのソフトウェアがどのようなフォルダとファイルで構成されているかまずは調査が必要です。ざっくりと調べたところでは以下の通りでした。

OMSI2
├─Addons (ここにアドイン本体が入るわけではなく、アドインごとの操作説明書が入っている)
├─DEMImport 
│ └─SRTM
│  └─Data (マップエディタで実際の地理情報をもとに地形を作成したいとき、hgtというスペースシャトルから計測した標高データをここに入れる)
├─docs (OMSI標準の操作説明書が入っている)
├─Drivers (運転手を定義するodrファイルが入っている)
├─Fonts (シーナリーオブジェクトのLabel機能などで使用するフォントが入っている)
├─GUI (起動時のスプラッシュスクリーンファイルなどが入っている)
├─helper
├─Humans (歩行者、乗客のデータが入っている)
├─Inputs (キーボード、コントローラーの設定ファイルが入っている)
├─Languages (メッセージIDに対してどのような文言を表示するか定義するファイルが言語ごとに用意され、OMSIの設定によって文言の表示が切り替わる表示になっている)
├─maps (この配下にマップデータごとのフォルダが入っている)
│ └─aerials (このフォルダだけ例外でマップエディタで地形を編集する際、参考にする地図/航空写真画像が入る)
├─Money (貨幣のオブジェクトデータが入っている/デフォルトではドイツ仕様)
├─option_presets (OMSIの設定を保存したファイルが複数入っている)
├─program (プラグインDLLなどを開発する際、参考にするコールバック関数一覧などが入っている)
├─Sceneryobjects (マップに配置する建物などのオブジェクトデータが入っている)
│ ├─model (3次元モデルデータがo3d形式で格納されている)
│ └─texture
├─Screenshots (スクリーンショット操作を行ったとき、クリップボードではなくここに画像データが作成される)
├─Scripts (スクリプト形式で記述された制御用のファイルが入っている)
├─SDK (バス車体の塗装等を変更するツールが入っている)
├─Situations
├─Sounds (自動車やシーナリーオブジェクト以外で使用する音声ファイルが入っている)
├─Splines (道路の横断形状などを定義したファイルが入っている)
├─template (新しいマップを作成するときのテンプレートファイルが入っているので、ここからmapフォルダにコピーしてマップエディタで編集する)
├─Texture (オブジェクト固有ではない全般的に使用するテクスチャが入っている)
├─TicketPacks (乗車券のオブジェクトファイルが入っている/デフォルトではドイツ仕様)
├─Trains
├─Tutorials (OMSIには初心者向けにチュートリアル機能があるが、そのコンテンツが入っている。また有志によって日本語のチュートリアルファイルも配布されているのでここにコピーして使用する)
├─Vehicles (自動車の定義ファイルが入っている)
└─Weather

フォルダについてはこのような構造になっていることから、変更したいデータに応じてフォルダ内のファイルを編集していくというような作業を進めていくことになります。

さて、これらのデータ類の中でアドオンを作成するにあたり重要なものを挙げるとすると、マップデータと車両データになるかと思います。マップデータは走行する地形、道路、建物の位置などを定義していて、車両はこの中を走っていく形になります。一方車両データは、バスとして自分が運転する自車用とAIが再現する他車用があります。さらにこの二つのデータを詳細にみていくと次のような構造になっています。

マップデータ
├─地形データ (起伏や沼地などを定義)
├─線形データ (道路の線形を定義)
├─交通規制データ (速度規制や一般車がバス回転所に入らないような規制を定義)
├─オブジェクトデータ (交差点や信号機、建物などのオブジェクトの位置を定義)
├─路線/系統データ (各バス停の位置を定義し、それを結んで路線や系統を定義)
└─ダイヤデータ (路線/系統別に運行本数、出発時刻などを定義)

車両データ
├─モデルデータ (車体の形状などを定義)
├─スクリプト (車両の挙動、可動部分の動作を定義)
├─音声データ (エンジン音、ドア開閉音などを定義)
└─ワンマン機器データ (IBISなどの動作を定義)

 このうち車両データについては、まずはデフォルトの車両をそのまま使用することにして、OMSIを使って果たして国内の街並みを再現して走ることができるかという部分に着目してマップデータの試作から開始し、ある程度めどがついたところで車両データの作成にも着手したいと考えています。

また、マップデータの作成手順については以下の通り行う予定です。バス停1区間ずつ作りこむような方法をとらないのは、そのような方法をとると作成している途中で遡って修正を行わなければならなくなった時に、修正箇所が全体に波及してしまい修正の労力が大きくなるためです。そのため、簡単に道路だけでも全体像を作ってしまい、そこから徐々に細かい部分を作りこんでいくというような方法をとります。

地形の編集→道路、交差点およびバス停の設置→テスト走行1→信号機の設置と交通規制の定義→テスト走行2→路線/系統データとダイヤデータの定義→テスト走行3→その他建物などのオブジェクトの設置

テスト走行1については、地形に沿って道路を配置して道路の起伏やカーブの半径などが正しいか、バス停間の距離が正しいかということを実際に走行して確認します。起伏やカーブの半径については運転感覚に直接影響しますし、特にバス停間の距離は非常に重要で、これが正しくないと時刻表やスターフ通りに走らせることができません。

テスト走行2については、信号機の設定が正しく交差点で正常に動作しているか、交差点で流出入している交通量が妥当なものであるかということを確認します。また、バスターミナルや回転所での規制が正しく一般車が流入してこないか、速度規制や右折禁止などの一般的な交通規制が設定できているかなどについて確認します。

テスト走行3については、実際の時刻表などから入力したデータをもとに、実車と同じような時間感覚で運転できるかを確認します。

そしてこれら3つのテストをパスしてはじめて、沿道の建物を配置したり樹木を配置したりするというようなことを行います。結局のところ、建物や樹木というのは実感味をもたせるための「飾り」でしかないので、核となる部分が完成していないのに先にそういったものを配置してしまうと、道路などの修正が発生したときにそれら沿道の建物なども移動させなければならなくなり、作業がスムーズに進まなくなります。

以上に述べたことは当たり前の話のように思えますが、単なる思い付きで路線単位などでマップを作ってしまうと、あとでそれらを結合して1つのマップにしたいといったときにとてつもない労力がかかってしまうことになりかねません。

そもそも路線単位でマップを作る方法の最大の欠点はデータの重複箇所が発生してその部分の修正が必要になった時に、それぞれのマップデータを開いて同じ修正を加えなければならなくなることです。

また、特定のファイルについて修正が適用されずそのままになっていれば、他のファイルと比較してデータの一貫性がなくなります。従って、マップを作成する際は営業所の担当単位とか場合によっては市内全域とかの範囲で総合的に考えてから計画的に作っていく必要があります。また、仮に市内全域の範囲で作成したとしても、バス路線に関係のない道路まですべて作りこむ必要はないのでその辺は省略しても構わないと思います。

最後にマップエディタについてですが、これも日本語で使用方法が記述されているページがありますので、これを参照していただければと思います。なお、このブログではこの内容についてはすでにご理解されているという前提で進めさせていただきます。

 

■マップエディタの使用方法 (OMSI2 Wiki)
https://wikiwiki.jp/omsi/SDK%20Manual