乗客・乗務員を乗せる

TpF モデルは、ゲーム中の乗車人数に合わせて乗客を表示したり、進行方向を判定して適切な位置に乗務員を表示することができます。このような設定は、モデルのメタデータの中で行います。

メタデータはモデルエディタ上から設定することもできますが、設定の記述量が多いため、コピーややり直しが簡単にできるテキストエディタを使うことをお勧めします。

1. メタデータ設定の構成

乗客・乗務員を表示するためのメタデータの設定は、mdl ファイル metadata 直下に seatProvider という項目を作成し、この中に設定していきます。seatProvider は次のような構成で、seats の下に乗客または乗務員の設定を一人分ずつ記入していくことになります。

	metadata = {
		...
		seatProvider = {
			crewModels = { },
			drivingLicense = "RAIL",
			seats = {
				{
					-- 1人目の設定
					animation = "driving_upright",
					crew = true,
					forward = true,
					group = 1,
					transf = { 0.90, 0, -0, 0, 0, 0.90, 0, 0, 0, 0, 0.90, 0, 6.82, 0.40, 1.25, 1, },
				},
				{
					-- 2人目の設定
				},
				...
			},
		},
		...
	}

設定方法は乗客と乗務員で多少の差があります。順に説明します。

乗客

乗客の設定は、次のように記述します。

				{
					animation = "sitting",
					group = 1,
					transf = { 0, 0.90, -0, 0, 0.90, 0, 0, 0, 0, 0, 0.90, 0, 7.00, -0.95, 1.25, 1, },
				},

それぞれの項目の意味と設定方法は次の通りです。

項目

意味

設定方法

animation

乗客モデルのポーズ

sitting: 座っている、idle: 立っている

group

乗客モデルの親オブジェクト

乗客モデルの親(基準)となる オブジェクトのID。詳細は後述

transf

乗客モデルの位置・回転・拡大縮小を表す 座標変換行列

後述

乗務員

乗務員の設定は、乗客に加えて crewforward の項目が追加されます。

				{
					animation = "driving_upright",
					crew = true,
					forward = true,
					group = 1,
					transf = { 0.90, 0, -0, 0, 0, 0.90, 0, 0, 0, 0, 0.90, 0, 6.82, 0.40, 1.25, 1, },
				},

項目

意味

設定方法

crew

乗務員であることを表す

乗務員なら true(乗客は false、デフォルト)

forward

表示するときの進行方向

true なら順方向(X 正方向)、false なら逆方向

forward を指定すると、指定した方向に列車が進むときのみ乗務員モデルが表示され、逆方向では表示されなくなります。注意として、車両の設定で reversible = false が設定されている場合、車両は常に順方向に進む(終着駅でモデルの前後が反転する)ため、forward の指定は無意味です。

2. group の値

group には、乗客・乗務員の親となるオブジェクトの ID を記述します。ライトを点ける でも説明している通り、オブジェクト ID は mdl ファイル内のオブジェクトに対して 0 から振った通し番号で、モデルエディタ内で確認できます。親になるオブジェクトは、車体オブジェクトなど、オブジェクトの原点がグローバル原点 (0, 0, 0) にあるようなオブジェクトに割り当てるのが分かりやすいかと思います。

注意として、編成を組んだ際に、親オブジェクトの設定の仕方によって2両目以降の乗客が表示されなくなる場合があります。これはおそらく TpF2 のバグで、発生する条件はよくわかっていませんが、次のように mdl ファイルの先頭に空のダミーオブジェクトを作成しておき、これを親オブジェクトに指定することで回避できます。

	lods = {
		{
			node = {
				children = {
					{
						-- ダミーオブジェクト
						name = "dummy",
						transf = { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, },
					},
					{
						-- その他のオブジェクト
					},
					...
				},
			},
		},
	},

3. transf の値

transf には、乗客・乗務員のモデルの位置・回転・拡大縮小を表す座標変換行列を記述します。座標変換行列を直接書き下すには専門の知識が必要ですが、それがなくても TpF2 組み込みのスクリプトライブラリを使えば直感的に設定することができます。ここではその方法を紹介します。

まず、mdl ファイルの先頭(function data() の行より前)に、次の2行を記入します。

local transf = require "transf"
local vec3 = require "vec3"

この2行があると、transf は次のように書くことができます。

transf = transf.scaleRotZTransl(0.9, math.rad(90.0), vec3.new(7.00, -0.95, 1.25))

transf.scaleRotZTransl はスケール・位置座標・水平方向の角度から座標変換行列を生成するユーティリティ関数です。上の例では、0.9(90%)に縮小されたモデルを、90度の回転(つまり横向き)の状態で、位置 (7.00, -0.95, 1.25) に表示させています。

注意として、一度乗客の設定を行った後にモデルエディタでモデルを読み込んで上書き保存した場合、transf.scaleRotZTransl の設定が座標変換行列に変換された状態で保存されるため、後からの編集はやや難しくなります(一度設定を経験した後なら、座標変換行列を見て直接編集することはできるかもしれません)。

4. 設定した乗客の確認

設定した乗客は、モデルエディタの OPTIONS > CONFIG で Passengers スライダを前後させることで表示して確認することができます。また、RENDER SEAT LOCATORS をオンにすることで、すべての乗客の位置をマーカーとして表示することもできます。

5. その他

  • ゲーム内で乗客が乗車した時の表示順は、mdl ファイル内での順番とは無関係にランダムに決まります。

  • seatProvider で指定する乗客の数は、transportVehiclecapacity で設定する値(この値の 1/4 が乗車人数の最大値になる)とは無関係に決めることができます。実際にゲーム上で表示される乗客の数は、乗車人数の絶対数になります。したがって、たとえば seatProvider の設定数が乗車定員より多い場合、乗車率が 100% になっても表示上は空席が発生します。逆に seatProvider の設定数が乗車定員より少ない場合は、乗車率が 100% に達する前に表示上は満席になり、それ以上乗車しても見た目の変化はなくなります。

  • 乗客に対して forward を設定することはできませんが、ライトを点ける で説明した順方向・逆方向でだけ表示されるオブジェクトを作成し、これを乗客の親オブジェクトとして設定することで、順方向・逆方向でだけ表示される乗客を設定することができます。これにより、転換クロスシートのような、進行方向によって乗客の向きが変わる車両を再現することができます。ただし、乗客の半分は非表示となるため、乗車率 100% でも表示上満席にならない欠点があります。

最終更新