特定の位置にカメラが動いたときだけ図が1つにまとまる配置の方法

こういう表現技法ってなんていうんですかね。
わかりやすいのだとサカナクションアルクアラウンドなんですけど…


みくみくパート冒頭で、カードの絵柄がバラバラなんだけど、
ある位置で1枚絵になる、ってところの簡単な説明です。



こんな感じで配置された図形が


カメラが回り込んでいくと


ある1点で揃う!

まず大前提の考え方として、奥にある画像は大きいし、手前の画像は小さくなる、遠近法を使用することになります。
ここで「この位置にあるなら拡大率がいくらで…じゃあ次は…」と手作業で微調整するのは時間がかかりすぎます。
ではどうするかというと、Z位置と拡大率は常に1次関数の関係にあるので、任意の2ヶ所の拡大率とZ座標がわかれば後はスクリプト制御の出番です。

正直自分の計算の諸々は覚えてないんですが、Z座標が0のときに拡大率が100%というのはわかってるので、Z座標が1000のときに拡大率がいくらか調べます。
(ちなみに自分のときはZ座標が1000のときで89%前後だった記憶)

あとは連立方程式でも使って傾きと切片求めたら完成ー
下はあくまでも自分のときの例です。
obj.zoom = (50 + 24.4 * obj.z /500)/100

この状態でZをグリグリ動かすと、正面から見たら何も変わってないように見えますが、カメラ制御で他の位置から見てみると、Z軸の位置に応じて拡大率も変わっています。

注意点として、スクリプト制御上での拡大率は1が100%です。
俺そこでコケてめっちゃでかい画像表示されて2日くらい困り果ててた。

あとここも結構な注意点なんだけど、並べたオブジェクトを動かしたいときは、グループ制御を使って、ぞれぞれの距離が変わらないように動かすこと。
(ここでグループ制御が必須なため、前の記事で書いたように全部をグループ制御で動かすことができないから他の方法でカメラを動かす必要があったという)

と、なんか難しそうなことやったけど、実はそういう計算簡単にできて「うわーこいつ面倒なことやってるプププ」とか笑われてたらどうしよう つらい

さぁこの方法を使ってアルクアラウンド再現してみようぜ!!
俺はやらない!!