「こういう光景をリアルで見た人もいるんだと思うと鬱になるよね」
VRMスクリプト禅問答
VRMovies最新作は急降下爆撃だったワケですけれども。

<そのまま突っ込まなかったのがせめてもの良心(ぉぃ)>
どう見てもjunichi提督への挑発です。
ありがとうございました。
冗談はさておき。
今回の動画は計3カットからなっておりまして、言うまでもなく最後のカットはjunichi提督へのオマージュで水柱を立てて見たワケですが、頭の2カットは、いずれもスクリプトによるフライスルーカメラ誘導の応用例になっています。
1カット目は
こちらのスクロールを組み込んでから、少し改造して使ったもの。

<最初のカットの種明かし>
“水平楕円軌道フライスルーカメラ”は、そのまま使うと上図上段のように、軌道の中心(黄色十字)と視点(赤菱形)が、どちらもビュワー起動時のアクティブ編成位置になります。これをちょっといじりまして、上図下段のように、軌道中心と視点の場所を別にし、かつ、視点が円軌道の外になるようにしました。言うまでもなく、赤菱の位置には戦艦(モドキ)がいるので、ああいうカットになるワケです。
2カット目(本エントリ冒頭のスクリーンショット)は、
こちらで紹介したスクリプトの応用例。数学的に記述すると、
x = R sin(t) + X
z = R cos(t) + Z
y = A t2 + Y
x,y,z :時刻tのカメラ座標
R,A :定数
X,Y,Z :基準座標
みたいな感じ。視点は同じ式を t + α を代入したもので、
(4)カメラ位置を導く関数に t + α の値を代入する方法。要するに、カメラの未来または過去の位置になるので、視線は進行方向かその逆を向き続ける。
に該当します。直感的には視線方向がかのカットのように真下を向かないような印象を受けるかも知れませんが、このケースでは垂直方向(y軸)の動きが水平(x-z)方向のそれに比べて格段に大きいので、結果的に降下中は常に真下を向いているように見えます。
逆に、t = 0 付近、つまりy座標がもっとも水面に近付くあたりでは、二次関数の性質に基づいてy方向の動きが小さくなり、x-z方向のそれと同等になります。この結果、視線は急速に水平を向き、その後は一気に天頂方向へ向かいます。言うまでもなく、操縦桿を引いて離脱する演出です。まぁ、マジでこんな飛び方したら、機体が分解するとは思いますが。
さて、以下、今回これをやってみての考察ですが。代数的な手法を使う限り、フライスルーカメラの誘導関数は以下のように一般化できます。
P = f(a,t) + O
P :カメラ・視点位置
a :任意の定数
t :時間遷移変数
O :基準位置
これを言葉で読み下すと“カメラ・視点位置Pは、動きの幅の大きさを示す定数aと、時間の流れを示す変数tと、基準位置Oによって決まる”ということです。で、実際にVRMレイアウトにコレを組み込む際、aは適当に数値を変えて実際の動きの大きさを見れば把握できるし、tはスクリプトで一定間隔で増やしたり減らしたりすればいいのですが、Oの扱いがちょっと面倒です。
要するにOはレイアウト上のある地点を示すx,y,zなワケで、これを数値で与えねばならんのが、いかにもお粗末。だって、他のあらゆるレイアウト上の要素は部品をレイアウトにドロップすれば決まるのであって、その際、ほとんどのユーザーは部品の座標がどうであるかを意識していないはずです。なのに、このOだけは数値で把握しないといけない。あー、ウザい。
と言うワケで、結論としては、
GetObjectPos <vector変数> <オブジェクト参照>
を
とっとと寄こしやがれコノヤロー!!です。
っつーか、これでTRAIN変数やCAR変数をオブジェクト参照できたりすると、トンデモなく面白いことが出来るワケで。内部的には地上カメラが走行中の編成を追尾する際に同じようなことをしているはずなので、技術的には可能なはずだけどなー、ボク以外の人が使うかどうかは別にして。