Long-Slow-Distance

Programming Notes with Unity

メニュー

最小角で角度のTweenアニメーションをする方法

角度Aから角度BへのTweenアニメーションをする時に必ず最小角で行う方法。

例えばRotationのYが0度のオブジェクトを徐々に30度にしたい場合は
普通にlocalEulerAnglesのyを一定値加算すればいいが、これはTweenアニメーションでも行える。

だが、逆に0度から−30度にしたい場合にTweenアニメーションだと、localEulerAnglesでは不都合が生じる。
オイラー角だと内部的に-30度は330度とみなされるので、下図のように逆回転してしまう。
(※軸方向プラスの向きから見て時計回りが正の角度)

euler_tween

これを防ぐ方法としては、localEulerAnglesをツイーンの対象にせずに角度の値そのものを対象にして
毎フレームlocalEulerAnglesに直接Update等で突っ込むというめんどくさいやり方を思いつく人もいるだろう。
(自分も一瞬そうだった)

ここで忘れてはならないのが、localRotationの存在だ。
こちらはクォータニオン型で保持されている角度情報で、当然ながらxyzを取り出してもオイラーとしては扱えないが、
localRotationをツイーン対象にすると必ず最小角でアニメーションしてくれる。
(もしかしたら例外あるかも・・・)

HOTweenを使用した場合のサンプルはこんな感じ。

    // Start
    void Start()
    {
        var parms = new TweenParms();

        // Yに-30度を指定
        parms.Prop( "localRotation", Quaternion.Euler(0,-30,0) );
        parms.Ease( EaseType.EaseOutExpo );

        HOTween.To( transform, 2.0f, parms );
    }

これだけですむので覚えておくと便利。

正直何でクォータニオンだと常に最小角で行けるのかは謎だけど、多分xyzをダンプすればすぐに分かると思う。
(めんどくさいので検証してない)

まぁジンバルロックの問題が起こらない虚数空間を取り入れた概念がクォータニオンなので
何となく想像は付く。やっぱりクォータニオンは便利だなぁ、ありがとうありがとう(鼻ほじ

関連記事