チュートリアル 6
道路ネットワークの基礎
前章まででワールド上に地面や背景などの基本的なオブジェクトを設置できるようになりました。次は道路などを敷設するための「ネットワーク」という仕組みについて、その基礎を学んでいきましょう。
道路は「網(ネットワーク)」である
道路を「網」として俯瞰すると、大きく分けて交差点、交差点以外の2種類と考えることができます。 なんと大雑把な分類だと思われるかもしれませんが、まずは次の図をご覧ください。

2枚目のイラストにて、赤色の点が「交差点」、青色の線が「交差点以外」に該当します。厳密には
- 「交差点」……丁字路や四叉路、合流など、分岐がある道路。正式にはノードまたは頂点と呼ぶ
- 「交差点以外」……直線・曲線道路など、分岐がない一本線の道路。正式にはエッジまたは辺と呼ぶ
となりますが、この分類方法は、シンプルながらも道路同士の関係を非常によく表せるのです。
ジャンクションとスプライン
ここまで説明したように道路はノード(交差点)とエッジ(交差点以外)の2つへと分類できますが、TransportXでは本来、それぞれをプログラムによって定義します。
厳密にはノードは TransportX.Network.NetworkNode クラス、エッジは TransportX.Network.NetworkEdge クラスの派生クラスとして定義する仕様となっています。
これらは非常に柔軟なカスタマイズが可能なのですが、一方で敷設する道路の大半はそこまでのカスタマイズを必要としない場合がほとんどであり、わざわざ道路毎にC#のコードを書くのはかなりの手間となってしまいます。 そこで、TransportXではノードやエッジを簡単に敷設するための「ジャンクション」と「スプライン」という機能を別途用意しています。
スプライン

ジャンクションよりも簡単なため先に説明します。スプラインはエッジ(交差点以外)のシンプルな実装で、画像のような直線・曲線道路を定義することができます。 長さや曲線半径、勾配、カントなどを指定可能な他、スプラインに沿って車道や歩道、ガードレール、街灯といった「ネットワークに紐づくプロップ」を設置することもできます。
スプラインは、他のノードやエッジとの接続点が2箇所あります。 この接続点のことを「ネットワーク端子」あるいは「端子」と呼びますが、次の画像のように、1つのスプラインが持つ端子は必ず入力・出力の2つとなります。

ジャンクション

ジャンクションはノード(交差点)のシンプルな実装で、画像のような丁字路の他、四叉路、合流などを定義することができます。 スプラインと同様、ジャンクション内には車道や歩道、信号機、横断歩道といった「ネットワークに紐づくプロップ」を設置可能です。
スプラインとは異なる点として、端子(他のノードやエッジとの接続点)を何箇所でも持たせられる仕様となっています。例えば丁字路の場合、端子は次のように3箇所とするのが一般的でしょう。

あるいは、行き止まりの道路であれば「入ってきた端子にUターンして戻る」形にしたいですから、端子は次のように1箇所のみとするのが一般的でしょう。

スプラインとジャンクションの使い分けについては、
- 簡単な道路なら、スプラインとして定義すると楽
- スプラインでは実現できない道路なら、ジャンクションとして定義する
と考えていただければ良いかと思います。
終わりに
お疲れ様でした。本章は以上で終了となります。
正直ネットワークについて説明しなければならないことはまだ山ほど残っています。例えば未解説のトピックとして次のようなものがあります。
- ジャンクション内の進路はどのように定義するのか?すなわち、丁字路の例において「端子1」から右折する車両はどのようなルートで「端子2」に向かうのか?
- スプラインの入力端子から出力端子までの間を、車両や歩行者がどのように動くのか?
- どのようにすれば、信号機の現示に合わせて交差点内の車両や歩行者を動かせるのか?
しかし、一気に説明してしまうと脳内の整理が大変ですから、ここまでに説明した範囲内で実践できるものとして、まず次章では簡単なスプラインを敷設してみることとしましょう。 ネットワークの基礎を十分に理解できていることが確認できてから、この先の話について解説していきます。