takeyohのおぼえがき

気になったこと、試したことの記録です。

SRPで飛行機を飛ばすmodを作る(飛行機作成編)

事故現場のmodを作成している中で、パトランプを使ってオブジェクトをアニメーションさせる方法がわかったので、もっと大きなものをアニメーションさせてみたら面白いかなと思いました。

普段遊んでいて、湾岸線に入るとひたすらまっすぐでつまらないなぁと思っていたので、ここに飛行機飛ばしたら面白いんじゃね?ということで着手しました。

飛行機自体はサクッと作れたのですが(もちろんフリーモデルをお借りしてですが)、ことのほかハマったのが、飛行機が飛ぶルートの作成とジェット音の実装でした。

ボリュームが多いので2回に分けて書きます。最初に飛行機を作る方から。では覚書!

 

まず飛行機自体は車と同じように作成しました。

表示されている矢印はローカル座標で、+Zが前、+Yが上になっています。

オブジェクトは飛行機本体と複数のランプ(衝突防止灯など)を付けています。

原点にエンプティ(今回はairplaneという名前にします)を作成し、回転をX=90,Y=0,Z=180に設定します。

このエンプティは後程飛行ルートを設定するのに使いますので、一緒に動かすオブジェクトはすべてこのエンプティの下に入れます。

車と同様に飛行機をfbxでエクスポートし、ksEditorでkn5を作成します。マテリアルの設定方法、kn5をcarで作るところも車と同じです。trackでアニメーションさせるモデル(当たり判定は不要)はcarのkn5で作るとラクです。

 

続いて、飛行ルートを設定する方法です。

今回、アニメーションする範囲が羽田空港から大井PAあたりまでと広い範囲で動きますので、blender上でどう設定されているか、確認するのが難しいと思います。

まず、最初におおよそこの辺を通過させたいという座標をゲームの中で取得します。
私はluaアプリを自作して、自車の座標情報をとれるようにして確認しましたが、object inspectionを使って、trackのパーツを選択してその座標を取得するという方法でもよいです。

で、それをマッピングします。私の落書きはこんな感じ。(お恥ずかしい)

座標情報とどこからどこへ飛ばすかの空間把握(各点間の距離とか)がわかります。

次に、エンプティairplaneに座標情報を入れていきます。

今回は、羽田空港から出発して、大井PAあたりまで飛んで、そこから一気に戻ってくるというルートを作っています。これをアニメーションのフレームで1~120の間に点々と入れていき、ざっくりとしたルートを作成します。

上記の座標情報はローカル座標の情報です。これをグローバル座標に変換してblenderの位置XYZに登録していきます。

ローカル座標X →グローバル座標 -X (マイナスX)符号反転

ローカル座標Y →グローバル座標 Z (符号同じ)

ローカル座標Z →グローバル座標 Y(符号同じ)
です。

そして飛行機が大きく移動しますので、すぐ画面から消えてしまうと思います。

飛行機が移動したとき、視点がそこへ追従するように設定することができます。

エンプティ(airplane)を選択し、ビュー→視点を揃える→アクティブに注視を選択します。

こうするとアニメーションさせたとき、視点が常に飛行機を追いかけるようになります。
逆に追従を止めたいときは、その下の「ビューの中止のクリア」を選択すると追従しなくなります。

これで、いったん飛行機が巡回するルートはできますが、各ポイントで飛行機がどっちに向いていたらよいのか、旋回中のポイントはどれくらい機体を傾ければよいのかなどを確認する必要があります。(飛行機が後ろ向き、横向きに飛んでるかもしれません。)

エンプティ(airplane)を選択し、オブジェクトプロパティのモーションパスを開きます。

パスタイプは「指定範囲」、フレーム範囲の終了にアニメーションの最終フレーム番号(今回は120)を入力して、「計算」を押します。

すると、どのようにアニメーションしていくのかのパスが画面に表示されます。

ただしblenderでは、パスが確認できるだけで、これを使ってコースを修正したりとかはできないようです。設定はあくまで位置や回転、スケールをアニメーションのフレームに設定していき、モーションパスで結果を確認していく、を繰り返す感じです。

アニメーション上で何か変更したら、またモーションパスで「パスを更新」「すべてんパスを更新」をクリックすると、新しいコースに表示が切り替わります。

視点切り替えで、+Zをクリックすると、上から俯瞰してみた視点に切り替わります。

そして視点をずーっと引きにすると、経路がどこを通るかがわかります。下記の例だと、右(グローバル座標で+X方向)が北になります。

そして、アニメーションを進めるとルートを進む様子が確認できると思います。

例えばこんな感じ。

飛行ルートに沿って飛行機を動かしていくと向きがおかしいとか、旋回しているから飛行機を傾けたいとかいうポイントがあると思いますので、それぞれでオブジェクトの回転XYZを調整して、飛行方向を向くようにかつ必要に応じて機体を傾けるアニメーションを追加していきます。

今回は、大井PA付近から羽田空港に戻るルートは一気に飛ばしているので、大井PA付近で機体をスケールで見えない大きさくらいまで縮小し、羽田に戻ったら元のサイズに戻すというスケールの変更も追加しています。

 

アニメーションを一通り動かして、違和感が無ければ、飛行ルートは完成です。

飛行ルートは車のアニメーションエクスポートと同じです。

エンプティ(airplane)を選択し、fbxでエクスポートします。

各項目のチェックはこうです。(これも車と同じ)ファイル名は例としてairplaneAnim.ksanimとします。

ksEditorではOpen FBX Animationを選択して、エクスポートしたアニメーションのfbxを選択すると、同じフォルダにairplaneAnim.ksanimが作成されます。

 

飛行機のkn5と飛行ルートのksanimが作成出来たら、track modに組み込みます。

今回は、SRP 0.9.2 PTB2を例にします。

assettocorsa\content\tracks\shuto_revival_project_beta_ptb\extension 
に移動します。

ここに作成した飛行機kn5と飛行ルートksanimファイルの2つをコピーします。

続いて、飛行機を飛ばす設定を追加します。

それなりの行を追加することになるので、airplane.iniという別ファイルに設定を書いて、ext_config.iniにインポートする方法にしました。

airplane.iniの中身はこれです。

[MODEL_REPLACEMENT_...]
ACTIVE = 1
FILE = shuto_revival_project_beta_ptb.kn5
INSERT = airplane.kn5
;INSERT_AFTER = geo_kbi03_002
INSERT_AFTER = geo_PA_tatsumi_parts
OFFSET = 0,0,0 

[ANIMATED_...]
ACTIVE = 1
NODE = airplane
ANIMATION = airplaneAnim.ksanim
DURATION = 60

 

; lamp

[CONDITION_...] ;BLINK SIGN
NAME=BLINK_SIGN
INPUT=ONE
DELAY=0
FLASHING_FREQUENCY=5
FLASHING_SMOOTHNESS=0
FLASHING_SKIP_OFF_STATE=0
FLASHING_NOISE_AMPLITUDE=0
FLASHING_MIN_VALUE=0.0
FLASHING_SYNCED=1

[CONDITION_...] ;ALWAYS
NAME=ALWAYS
INPUT=ONE
DELAY=0

[MATERIAL_ADJUSTMENT_...]
DESCRIPTION=blink signal red
ACTIVE=1
MESHES=lampBlinkRed
KEY_0=ksEmissive
VALUE_0=255,10,0, 10
CONDITION=BLINK_SIGN

[MATERIAL_ADJUSTMENT_...]
DESCRIPTION=blink signal white
ACTIVE=1
MESHES=lampBlinkWhite
KEY_0=ksEmissive
VALUE_0=255,255,255, 10
CONDITION=BLINK_SIGN

[MATERIAL_ADJUSTMENT_...]
DESCRIPTION=always signal Left
ACTIVE=1
MESHES=lampL
KEY_0=ksEmissive
VALUE_0=255,10,0, 10
CONDITION=ALWAYS

[MATERIAL_ADJUSTMENT_...]
DESCRIPTION=always signal Right
ACTIVE=1
MESHES=lampR
KEY_0=ksEmissive
VALUE_0=0,255,0, 10
CONDITION=ALWAYS

[MATERIAL_ADJUSTMENT_...]
DESCRIPTION=always signal Rear
ACTIVE=1
MESHES=lampLR,lampRR
KEY_0=ksEmissive
VALUE_0=255,255,255, 10
CONDITION=ALWAYS

MODEL_REPLACEMENTは飛行機のkn5ファイルを差し込む処理です。
車の場合と基本同じです。
今回はとりあえず起動して最初に目に留まった辰巳PAの電灯をINSERT_AFTERに設定しています。(特に深い意図はありません。)

General – Model replacements · ac-custom-shaders-patch/acc-extension-config Wiki · GitHub

 

ANIMATEDは飛行ルートを設定したksanimを読み込む設定です。車でいうところのANIMATIONSですね。
DURATIONは一連のアニメーションを実行する時間(秒)です。60だと、飛び立って戻ってくるまでに60秒間ということですね。

設定項目はこちらを参照してください。(公式WIKI

Tracks – Animated objects · ac-custom-shaders-patch/acc-extension-config Wiki · GitHub

 

lamp以下は飛行機についている灯火類の処理です。

CONDITIONは点滅する光と常時ついている光の2パターンを設定。

MEATERIAL_ADJUSTMENTは指定したオブジェクトを光らせる設定です。
MESHESに光らせたいオブジェクトを指定します。

同じマテリアルは同じMATERIALを設定して、ここをMESHESではなくMATERIALで指定すると、同じマテリアルが設定されたオブジェクト(メッシュ)は同じ設定が反映されます。

それぞれの灯火で、色や点滅の有無に合わせて設定していきます。

ちなみに、各セクションにおいて最後はすべて「_...」に設定しておきます。

これは、SRP自体のext_config.iniの中にも同じ名前のセクションがあり、重複を避けるためです。数字を入れてしまうとほか設定とバッティングするので避けた方がよいです。

 

最後に同フォルダにあるext_config.iniに一行追記します。

[INCLUDE: airplane.ini]

 

以上で、飛行機は飛ぶようになります。といってもここまで来るのに、どんだけテストしたことか・・・。(遠い目)

いきなりSRPで動作検証すると、ロードに時間がかかったり、動きを確認する場所まで移動が大変だったりします。

まずは思い通りの動きができるかどうかを、簡単なtrack(私はSkidpadを愛用)で実装してみて、うまくいったらSRPの座標に合わせるようにするとよいです。

 

実際飛行機を飛ばしている様子はこちら。(暗くてわかりずらいですね・・・)

youtu.be

/* -----codeの行番号----- */