top of page

3Dモデルで作るsimutransnアドオン講座(設定に関する理論と応用例)

 昨年に引き続きアドカレに投稿させていただきます。simu_poppoです。

この記事は、Simutrans Advent Calender 2025 14日目の記事として投稿させていただきます。

 今回は、3Dモデルでsimutransのアドオンを作る際に、3Dモデルがどのようにsimutrans上で描画されるかを模式図を通して解説していきます。

§1 3Dモデルとアドオンの座標の関係

 Simutransでは、斜め上から眺める形になります。そのため、3Dモデルからアドオンを作る場合は、3Dモデルを撮影するカメラを適切な角度に設定する必要があります。


アドオンのソース画像の概形。pak128における高さ1マス分のアドオンの場合は、横方向の対角線が128ドット、縦方向の対角線が64ドット、高さ方向が1マス分32ドット(緩急坂のハーフハイトは16ドット、2倍坂の場合は64ドット)になります。
アドオンのソース画像の概形。pak128における高さ1マス分のアドオンの場合は、横方向の対角線が128ドット、縦方向の対角線が64ドット、高さ方向が1マス分32ドット(緩急坂のハーフハイトは16ドット、2倍坂の場合は64ドット)になります。

 アドオンは基本的に、ちょうど平面の対角線方向の上空から見下ろす形で描画し、対角線の比は横2:縦1、1マス分の高さ方向は縦方向の対角線のさらに半分になっています。

3Dモデルを、上記の高さの比(高さ:対角線=①:②)になるように投影するには、次のような配置にします。

3Dモデルと、アドオン用の画像として出力したときの長さの比の関係。長さ1の立方体を高さ方向に√(2/3)倍すると、カメラ方向(1,1,√2/3)方向からの見かけ上の長さ比が正しくなります。
3Dモデルと、アドオン用の画像として出力したときの長さの比の関係。長さ1の立方体を高さ方向に√(2/3)倍すると、カメラ方向(1,1,√2/3)方向からの見かけ上の長さ比が正しくなります。

 3Dモデルから画像を出力する際に、カメラを(1,1,√(2/3))方向とすると水平方向の対角線の長さ比を横2:縦1にできます。すると、図の赤い面に3D画像が投影される状況になります。そこで高さが縦方向対角線の半分になるようにするには、3Dモデルの高さを√(2/3)=0.8165倍する必要があります。

 Voxelやpov-ray等で3Dモデルを作りアドオン化する場合は、上記の高さ方向の圧縮とカメラ方向の設定を行うことで、単体の建物アドオンだけでなくインフラ用アドオンなど他のマスやほかのオブジェクト(乗り物vehicle等)との干渉を計算しながら設計することができるようになります。

§2 斜めタイル way編

 インフラ(way, wayobj)および斜めタイル停留所では、45度回転させる必要があります。しかし、3Dモデルの場合は回転による圧縮の影響を考慮する必要があります。

インフラの中心部の描画位置(高さ0の場合)。青線は直線の場合で、赤線は斜め方向の場合。黒線がタイルの境界線に相当し、斜め用画像は各辺の中点同士を結ぶように敷かれます。
インフラの中心部の描画位置(高さ0の場合)。青線は直線の場合で、赤線は斜め方向の場合。黒線がタイルの境界線に相当し、斜め用画像は各辺の中点同士を結ぶように敷かれます。

 斜めタイルにおけるインフラの軌道中心は、角タイルの正方形に対して、辺の中点同士を結んだ状況になります。アドオンのソース画像では上記のような位置関係ですが、これを3Dモデルに落とし込むと次のようになります。

1辺を長さ1としたときの、直線(青)と斜め(赤)の配置。斜め用アドオンはマス上における中心部の長さが1/√2倍となります。
1辺を長さ1としたときの、直線(青)と斜め(赤)の配置。斜め用アドオンはマス上における中心部の長さが1/√2倍となります。

 たとえば、斜めタイルのインフラを3Dモデルで作る場合、直線部と斜め部の幅は次のように斜め方向の幅を1/√2~0.71倍します。

幅wのインフラタイルの3Dにおける模式図。直線用は幅wで、斜めタイル用は(カメラを§1のように設定すれば)w/√2として45度回転すると設置できます。
幅wのインフラタイルの3Dにおける模式図。直線用は幅wで、斜めタイル用は(カメラを§1のように設定すれば)w/√2として45度回転すると設置できます。

 3Dモデルを上から見ると、このような形になります。高さは共通で、予定ドット数に対して√(2/3)倍してください。(pov-rayなどの場合では、後から全てのオブジェクトをまとめて高さ方向に√(2/3)倍スケーリングすることで対応できます。)

直線タイル(左)と斜めタイル(右)の3Dモデルを真上から見た図。斜めタイル用は3Dモデルで45度斜めに配置するだけではなく、幅の修正も必要になります。
直線タイル(左)と斜めタイル(右)の3Dモデルを真上から見た図。斜めタイル用は3Dモデルで45度斜めに配置するだけではなく、幅の修正も必要になります。

§3 斜めタイル 鉄道ホーム編

 しかし、上記の規格は斜めタイル停留所の鉄道用ホームにはそのまま活用できません。なぜなら、鉄道車両は斜めタイルでもサイズ幅が変わらないためです(diagonal_multiplier = 724の場合のみ)。特に、pak128.japan用のホームでは問題になります。


茶色は車両で、青色は直線ホーム、赤色は斜めタイル用ホームの模式図です。1マスの長さをp、車両の幅をdとすると、直線タイル用のホームの幅はw=(p-d)/2で求まられますが、斜めタイル用のホーム幅は特別な計算が必要です。
茶色は車両で、青色は直線ホーム、赤色は斜めタイル用ホームの模式図です。1マスの長さをp、車両の幅をdとすると、直線タイル用のホームの幅はw=(p-d)/2で求まられますが、斜めタイル用のホーム幅は特別な計算が必要です。

 diagonal_multiplier=724のpaksetでは、斜めタイルにおける車両の幅が724/1024~1/√2倍されます。そのため、斜めタイルでも直線タイルと「同じ」幅で描画されることになります。  しかし、3Dモデルで作ろうとすると問題になります。車両の幅が1/√2倍されていないため、ホーム幅は車両幅が変わらない分狭くしなければなりません。図のように、若干斜めタイル用ホームの幅を狭くするため、斜めタイル前後で不連続になります。そのため、斜めタイル停留所を3Dモデルから作る場合にも、このような斜めタイル上での車両サイズの違いにより直線部と曲線部をなめらかにつなぐ加工が必要になります。

直線ホーム(左)と斜めタイル用ホーム(右)の3Dモデルを真上から見た図。斜めタイル用ホームは車両の幅が圧縮されない分、1/√2倍よりもさらに狭くする必要があります。
直線ホーム(左)と斜めタイル用ホーム(右)の3Dモデルを真上から見た図。斜めタイル用ホームは車両の幅が圧縮されない分、1/√2倍よりもさらに狭くする必要があります。

※pak128旧描画位置が顕著ですが、実際には車両の基準面(レールの高さ)は0ドットではなくわずかに浮いていることが多いです。そのため、目的のpaksetに応じてホームの高さをオフセットしてください。

§4 実際にやってみた

 作品例をご紹介します。

§4-1 線路

ree
先日公開した石炭埠頭の高架橋。高架線路は、橋脚、橋梁部、柵、線路などすべての部品を3Dモデルをもとに作成しています。ソースはpov-rayのシーンファイルも同封しておりますので、参考にしてください。
先日公開した石炭埠頭の高架橋。高架線路は、橋脚、橋梁部、柵、線路などすべての部品を3Dモデルをもとに作成しています。ソースはpov-rayのシーンファイルも同封しておりますので、参考にしてください。

 線路幅は§2の要領で幅を1/√2倍することで再現することができます。3Dモデルでは、回転による複数方向の画像の同時生成、部品を流用することによるアドオン作成の省力化を行うことができます。分岐部についても、斜め用の線路パーツと直線用の線路パーツを重ねることで生成しています。


§4-2 斜めタイル停留所ホーム

ree
ree

 Pak128.japanの車両に合わせたホームです。高さは直線用と斜め用で共通で、車両の寸法にあわせた形状にしています。

 しかし、§3でお話しした通り、直線ホームと斜めタイルホームではホーム幅が異なっています。そのため、直線ホームと斜めタイルホームのつなぎ目が不連続になってしまいます。解消するには、直線ホームを接続する斜めタイルホームにあわせて複数用意するか、トリックアートを用いる必要があります。

§まとめ

 3Dモデルを使って、斜めタイルを含むインフラや建物、ホーム等のアドオン用画像を生成するための理論をご紹介しました。具体的に各3Dモデル用ソフトでどのように取り扱うかについては、各3Dモデルソフトの説明書や3Dモデルを使ったアドオン作者の記事等を参照してください(pov-rayの使い方につきましては昨年度の記事もご覧ください)。3Dモデル活用によって、特にインフラ系を初めとしたさまざまなアドオンの製作が楽になると思いますので、ぜひ使ってみてください。

コメント


bottom of page