2015年12月19日土曜日

Blenderで作ったアニメーションがUnity3Dで違う動きをする原因と直し方

How to fix animations that behave unusual

3次元CG編集ソフト・Blenderで作成したモデル(立体物のデータ)とアクション(モーション)はゲームエンジン・Unity3D(以下Unity)で利用することができます。
ところが、Blenderで作ったアクションをUnityで動かしたら設定と違う動きをすることがありました。
その症状と修正方法をまとめました。


環境

・Windows 8.1
・Blender 2.76
・Unity 5.2.1


Blenderでモデルとアクションを自作する

Blenderで水泳選手のようなモデルを作りました。

モデルができたらUnity公式マニュアルを参考にアーマチュアとリグを設定します。
Unity - マニュアル: Blender と Rigify の使用
http://docs.unity3d.com/ja/current/Manual/BlenderAndRigify.html

そしてクロール泳法のようなアクションを「Swimming」という名前で作りました。

この「Swimming」をUnityのアニメーションとして再生することを目指します。
BlenderのアクションをGIFアニメーションで再現


BlenderモデルをUnityのHumanoidに設定する

モデルをfbxファイルとして書き出すため、Blenderのメニューから
File - Export - FBX(.fbx)
を実行します。
ファイル名は「human_swimmer.fbx」としました。

このfbxファイルをUnityのProjectウィンドウにドラッグ&ドロップします。

Blenderの「Swimming」というアクションはUnityに
Metarig|Swimming
という名前のアニメーションに変換されました。

BlenderのSceneにCameraやLampがあるとUnityにそのままの名前で空(から)のオブジェクトとしてインポートされます。
これらはUnityでは使わないでしょうからfbxファイルに書き出す前にBlenderのSceneから削除した方がいいかもしれません。

以下すべてUnityの操作です。

Projectウィンドウのモデルを選択してInspectorウィンドウの設定を変更します。
RigのAnimation TypeをHumanoidに設定し、configureボタンをクリックします。

Unityが1分以上フリーズしたあとアバターのMappingが表示されます。

Muscles & Settingsを動かしてみます。問題なくインポートできたようです。

Inspectorウィンドウ右下のDoneボタンをクリックしてMappingの設定を終わらせます。


Sceneにモデルを配置してAnimator Controllerを設定する

新しくSceneを作ってモデルを配置しました。
マテリアルやテクスチャも設定しました。

Projectウィンドウに新しいAnimator Controllerを「SwimmerAnimatorController」という名前で追加しました。
Sceneのモデルhuman_swimmerを選択してInspectorウィンドウのAnimator欄に SwimmerAnimatorController をアタッチしました。

ProjectウィンドウのSwimmerAnimatorControllerを選択してAnimatorウィンドウを開き、Blenderのアクションからアニメーションに変換された Metarig|Swimming をドラッグ&ドロップして Entry に設定します。

このアニメーションを繰返し動作させたいのでAnimatorウィンドウの Metarig|Swimming をダブルクリックしてInspectorウィンドウの Loop TimeLoop Pose にチェックを入れました。
※後でこれが間違いだったことが分かります。
これでゲーム実行すると泳ぐように動くはずです。


ゲームを実行するとBlenderのアクションと動きが違う

ゲームを開始するとSwimmingのモーションに余計な動きが加わっています。
UnityのキャプチャをGIFアニメーションで再現

両腕ともまっすぐ伸ばすべきところでぐるっと回転してしまいます。


Animationウィンドウで再生するとBlenderのアクションと同じ動きをする

Animationウィンドウで再生した場合は両腕が回転せず、Blenderのアクションと同じように動きます。
下の画像は左がゲーム実行中のもの、右がAnimationウィンドウでの再生中のものです。両腕の角度が違います。


Loop Pose が原因でした

Unityのマニュアルによると Loop Pose にチェックを入れると「モーションをシームレスにループ可能にします」とのことです。
BlenderのモーションもUnityのアニメーションも、移動量や角度を時間毎にキーフレームに設定します。
腕の角度のキーフレームの最初が0度とし、その少し後のキーフレームが180度に近い場合 Loop Pose がオンだと、次のループの先頭の角度の0度に向かって時間とともに170度・160度・150度・・・・20度・10度・0度と変化して回転してしまいます。

1回のループが100フレームとし、Loop Poseがオンの場合のフレームを横軸、角度を縦軸で表したグラフです。

Loop Poseがオフだとキーフレームの最後の角度がホールドされ、ループが終わるまで動きません。

アニメーションのLoop Poseを解除したら正常に泳ぐようになりました。

Loop Pose解除後をGIFアニメーションで再現


関連ブログ

3次元CGソフト・Blenderの脱初心者を目指す
[MMD] クエリちゃん・クリスマス版(初版) & クエリちゃんver1.02を公開しました
[Unity3D] Blender could not be found.を解決するには
[Blender] obj2opengl.plをJava用に改造する
[Unity3D] Unityでプロ生ちゃんMMDモデルを扱う
[Unity3D] Unity4からUnity5へのバージョンアップでの変化
[Unity3D] ゲーム画面をキャプチャしてMovie Studioで動画に編集する
CLIP STUDIO COORDINATE でプロ生ちゃんを使ってみる

以上、参考になれば幸いです。

0 件のコメント:

コメントを投稿