User:Caron/CTTutorial Japanese/SRT0

From Custom Mario Kart
Jump to navigation Jump to search

数学的な事を扱いますが、内容は(分かれば)簡単です。本題は「オブジェクトは回転しつつ、何かしらの軸へ平行移動したアニメーションを作りたい」です。


sample

アニメーションを追加するときに、マテリアルのみの移動ではSRT0を使います(基本的にみなさん標準のものを利用していると思うのですが、自分含めてたまにSRT0を自作している人もみかけます)。 SRT0を基本的にはx,y方向への移動や、回転、拡大など、どれかだけを変化させることがほとんどです。もちろん同時に変化もできますが、基本的には2つ動かすときは片方は固定値です。 では、同時に別々の変化させた場合はどうでしょうか。移動+拡大は特に問題ないですが、移動+回転は厄介です。

物体を回転させながらx軸方向やy軸方向に移動させたい場合、普通に考えたらxを変化させて、回転を変化させるだけで済むのですが、実際は問題が発生します。 SRT0でy軸を動かす際、y軸と言うのはマテリアルの縦方向を移動します。一方で回転はマテリアルを中心を基点として動くため、y軸移動+回転による変化は面上の平行移動せず、極方程式に従って移動をします。
(極方程式というのは、極座標(r,Θ)(r : 長さ, Θ : 角度)を利用することでr=f(Θ)で表現できる方程式でのことです。有名なものと言えば、x²+y²=a²(半径aの円)がr=aで表されるものでしょう)
srt0で移動 + 回転を行うと、その極方程式は

Tutorial srt0 polar coord 1.jpg

に従います。ここでαは任意の実数です。この方程式は代数螺旋の一種で、アルキメデスの螺旋とも呼ばれます。式(1)を代数x, yについて表してみる(媒介変数表示)と、

Tutorial srt0 polar coord 2.jpg

となります。つまり移動 + 回転になると、平面での変化は式(2)のxとyで表現できます。

このままだと分かりづらいので、もう少し厳密に表現します。本題の通りにする場合、動かす軸の長さは-1から1であることが必要です。アニメーションをの総フレーム数をf、フレームをt(0≤t≤f)、移動量の倍率をnとし、fの間にtを変化させたときのx,y軸上での変化は

Tutorial srt0 polar coord 3.jpg

となります。一応ですが、この極方程式は

Tutorial srt0 polar coord 4.jpg

です。
では方法ですが、(3)のx, yを移動パラメータとして設定し、回転を0から720ではなく、0から-720に設定するとうまくいきます。
今回は、上の動画でやった手法について説明していきます。この動画では400フレームで-1から1までとしたので、f=200, n=1です。この場合、xとyは下図のような曲線になります。

Tutorial srt0 spiral formula.jpg

1. 400Fにおいて、毎回座標情報を入力するのは大変なので、(4)式の極値とSRT0のinterpolation(補完)を利用する。極値については、pythonで適当にプログラム組んで求めると
x = {44:-0.77, 135:0.29, 265:0.29, 356:-0.77}, y = {0:-1, 91:0.52, 173:-0.09, 227:0.09, 309:-0.52, 400:1} ({フレーム : 値} の順)
となる。これをSRT0のパラメータへ入力する
2. アニメーションを右クリックし、View Interporationを開く。極値での方程式の接線は0なので、設定したフレームのtangentを全て0にする。
3. 0Fでの回転値を0, 400Fでの回転値を-720にする

見た目に反してかなり大変です。nとfを変えることでいろんなことができますし、今までのCTにはないアニメーションを作れるので、是非参考にしてください。