【Blender】ベイクしたモーションで、カクつきの少ないアニメーションをつくる。【Unity】

投稿者:

▲Unityにエクスポートした結果モーションがカクついてしまっている。

この記事の要約

 1.BlenderからモーションをFBXでエクスポートする前に、モーションをベイクすることで、モーションのカクつきを抑えられる。

 2.スクリプトを使用することで、ベイクを自動化することができる。

ベイクによるモーションエクスポートの改善

 Blenderでいい感じのモーションができたーということで、Unityにエクスポートしてみたところ、トップ画像のようにカクついてしまいました。考えられる原因は二通りです。

①Unity側がインポートするとき問題が発生している

②Blenderがエクスポートするとき問題が発生している

原因究明のため、BlenderでFBX出力後、FBXをそのままBlenderにインポートしてみたところ、カクつきが発生。ということで、②の方だったようです。

いろいろと調べてみると、ポーズをベイクすることできれいにモーションをエクスポートできたという報告を発見。というわけで試してみました。以下はBlender上の操作です。

1.アーマチュアを選択し、ポーズモードへ。 

2.ポーズ→アニメーション→アクションをベイクを選択。

3.開始フレーム、最終フレームを選択。チェックを全部外してデータをベイクをポーズに設定。OKを実行

 以上の操作を行いしばらく待つと、現在選択しているポーズをもとに、新たなアニメーションが生成されます。このアニメーションはすべてのフレームでキーフレームが打たれています。例えばFBXに出力する際のキーフレーム間の補完がおかしいなどが原因ならこれで解決するかもしれません。

以上の手順で用意したアニメーションをFBXにしてUnityに持ち込んだのが以下になります。

▲ベイクしたモーション。きれいになったことがわかる。

 成功しました。モーションが大幅に改善されたことがわかります。とくにキャラクターのモーションは少しでもぎこちないとかなり不自然に見えるので、解決できたのはとてもありがたいです。

 ということできれいなモーションをUnityに持ち込むことができました。めでたしめでたし・・・

・・・

・・

・・・とはまだなりません。実際やってみると上記のやり方にはちょっとした問題点があります。

とにかく面倒な手順・・・

上記の手順を実際にやってみると、このやり方はかなり面倒ということがわかります。問題は以下の点です。

 ”以上の操作を実行することで、現在選択しているポーズをもとに、新たなアニメーションが生成されます。”

 つまり、上記のやり方では現在選択しているポーズ一個ずつしかモーションをベイクすることができないのです。ベイクするモーションが1つや2つなら上記やり方で問題ありません。しかし、モーションが数十にもなってくると、いちいち現在のポーズを変更して操作を実行していくというのはさすがにかなり骨が折れます。正直こんなことにエネルギーを割きたくありません。

 ということで、楽をしましょう。

スクリプトで上記の手順を自動化

 blenderはpythonを使用することで、操作をスクリプトで実行できます。こういったマクロやスクリプトは同じ操作を何度も繰り返すようなときには特に威力を発揮します。今回はうってつけです。というわけで、スクリプトで楽しましょう。

まずはBlenderでテキストエディタを開き、テキストを新規作成します。そして以下のコードを入力します。

import bpy

#crawl all animation and bake animation

armature = bpy.context.view_layer.objects.active

animation_data = armature.animation_data

for action in bpy.data.actions:

    animation_data.action = action
    
    if 'bake' in action.name:
        continue
    if 'Action' in action.name:
        continue
    
    range = action.frame_range
    
    bpy.ops.nla.bake(frame_start=range[0], frame_end=range[1], bake_types={'POSE'})

 上記のコードは、すべてのポーズに対して、ポーズをアクティブなアーマチュアにセットし、ベイクを実行するスクリプトです。ベイク済みのモーションをベイクしないように、Actionまたはbakeという名前が入っていたらそのモーションはベイクしません。これで、スクリプトを実行すれば、あとは放置しておくだけで必要なモーションがベイクされます。

おわりに

 BlenderからUnityへのモーション出力を改善しました。クオリティのためには手間を惜しんではいけませんが、だからこそ必要のない手間はどんどん省いていきたいですね。ここまでお読みくださりありがとうございました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です