冬乃Tech Blog

主にUnityでのC#コーディングで得た知見をまとめていく

FBXでUnityにアニメーションインポートしたらうまく動かない時の対処

先日少しハマっていたので書いてみる

僕は普段人型モデルのアニメーションを作る時は3ds maxで作成してから、FBXに書き出してUnityにインポートしている。
しかし、先日それをしたところ、なぜかうまく動かないという事態に陥った。
具体的には、インポートしたアニメーションをループさせた時に、切り替わりの瞬間にガタつきが目立った。
「うまくキー打ちできてなかったのかな」と思い3ds max側で確認したところ、問題なく動作した。
明らかにUnity側でアニメーションに不具合が出ているようだった。

色々と検証してみた結果、どうやらボーンの制御方法の違いによる誤差だったようだ。
Unityではボーンの回転制御にQuarternion(四元数オイラー角制御の二種類がある。

Quarternion

QuarternionはUnityでのオブジェクトのTransformコンポーネントに入っている回転制御で使われている方式で、四元数とも呼ばれてる。
正直数学的知見はあまり持ち合わせていないのでここで詳しく言及はしないが、内部処理的に計算しやすいらしい。

オイラー

もう片方のオイラー角制御は、角度を測る時に使う度数法で計算する方法。
人間としては30度、60度、180度と、こちらのほうが計算しやすい。

Unityの場合、オイラー角制御のアニメーションはインポート時にQuarternionで制御できるように自動で変換される設定がデフォルトでオンになっているらしい。
まあUnity君がQuarternionの計算のほうがいいのならそっちのほうが計算リソース的にもよろしいのだが、この変換作業が罠だった...。
どうやらオイラー角→Quarternionの変換には若干の誤差が生じるらしく、このせいでアニメーションが微妙にずれてしまったようだ。
なんで誤差が生じてしまう変換の設定がデフォルトでオンになっているのか...。

解決方法としては、FBXを選択したときのInspectorで、Animationタブにある"Resample Curves"のチェックを外す。

f:id:fuyunomikan1223:20190720214812p:plain
UnityでFBXを選択したときのInspectorウィンドウ
これでアニメーション制御をQuarternionに自動変換せず、オイラー角のまま計算する。
デメリットとしては、少しだけアニメーション再生の計算が重くなるらしい。
PC向け開発ならそこまで気にする必要もないが、モバイルなら気にしたほうがいいかもしれない。
おとなしくアニメーションをQuarternionで作成するのが吉。