[レイアウトスクリプト]上掲スクリプトをレイアウトスクリプトとして組み込み、太字部分を変数tから、カメラ/視線位置のx,y,z座標を算出するロジックに書き換えれば、自動的にレイアウトの中を飛んでいくフライスルーカメラを実現することが出来る。
//カメラ位置変数
Var CameraX
Var CameraY
Var CameraZ
//視線位置変数
Var ViewX
Var ViewY
Var ViewZ
//イベント管理変数
Var TimerEvent
//遷移変数
Var T
Var IncrementT
setf T {初期値}
setf IncrementT {増分}
//イベント設定
SetEventTimer this MtdFlyCamera TimerEvent 33
//フライスルーカメラ制御メソッド
BeginFunc MtdFlyCamera
//ベクトル変数
Var CameraPosition
Var ViewPosition
GetFlyCameraPos CameraPosition ViewPosition
//カメラ・視線位置算出
call this MtdCalcCameraXYZ
call this MtdCalcViewXYZ
//ベクトル変数設定
SetVectorX CameraPosition CameraX
SetVectorY CameraPosition CameraY
SetVectorZ CameraPosition CameraZ
SetVectorX ViewPosition ViewX
SetVectorY ViewPosition ViewY
SetVectorZ ViewPosition ViewZ
//カメラ位置更新
SetFlyCameraPos CameraPosition ViewPosition
//遷移変数更新
add T IncrementT
EndFunc
//カメラ位置算出メソッド
BeginFunc MtdCalcCameraXYZ
//一時変数
Var TmpX
Var TmpY
Var TmpZ
Var TmpT
//変数Tを壊さないようにローカル変数に退避
mov TmpT T
//
//ここでTmpTからTmpX,TmpY,TmpZを算出する
//
//算出結果のグローバル変数への書き出し
mov CameraX TmpX
mov CameraY TmpY
mov CameraZ TmpZ
EndFunc
//視線位置算出メソッド
BeginFunc MtdCalcViewXYZ
//一時変数
Var TmpX
Var TmpY
Var TmpZ
Var TmpT
//変数Tを壊さないようにローカル変数に退避
mov TmpT T
//
//ここでTmpTからTmpX,TmpY,TmpZを算出する
//
//算出結果のグローバル変数への書き出し
mov ViewX TmpX
mov ViewY TmpY
mov ViewZ TmpZ
EndFunc
カメラ位置
x = cos(t) × 500
y = 100
z = sin(t) × 500
視線位置
ビュワー起動時のフライスルーカメラ視線位置
= ビュワー起動時のアクティブ編成の先頭車位置
カメラ位置
x = t
y = t
z = t
mov TmpX TmpTになる。まぁ、一次式の範疇でやる限り、軌道は直線にしかならないので、せめて遷移変数tの二次式くらいにはしたいところだが、そこはお好みだ。ちなみに、二次式にするのであれば、tを十分に小さな値で遷移させるか、あるいは大きな定数で割るかしないと、あっという間に座標系がレイアウトサイズからはみ出すので要注意。
mov TmpY TmpT
mov TmpZ TmpT
(1)拙作スクロールのように固定してしまう方法。ある一点を見つめたまま、カメラ位置だけが変化していく動きになる。
(2)カメラ位置とは別の関数で導く。複雑な動きが実現できるが、実用的なものを作るのは多分難しい。
(3)カメラ位置に三角関数で導かれる一定の長さのベクトルを加算する方法。視線の向きを意図的にコントロールしたい場合はコレ。
(4)カメラ位置を導く関数に t + α の値を代入する方法。要するに、カメラの未来または過去の位置になるので、視線は進行方向かその逆を向き続ける。