こんにちは、アキヤマです。
この記事では、複数の動きを組み合わせたアニメーション付きのモデルをGLB形式で書き出す際に、起こりうる問題とその対処法について説明しています。
はじめに
BlenderにはNLA、ノンリニアアニメーションという機能があり、キーフレームアニメーションをストリップ(=コンポーネント化)て、ループやブレンドが簡単にできるようになります。
WebAR上で3DCGモデルとアニメーションを表示させたい場合、NLAを使ってアニメーションを用意し、GLB形式でモデルを書き出すことが一般的ではないでしょうか。
しかし、NLAで複数のアニメーションを組み合わせた場合、GLB形式で書き出したモデルにそのアニメーションが反映されないケースがあります。この問題を解決するには、組み合わせた複数のアニメーションを1つにまとめることで上手くいきます。
これによって、例えばWebAR環境で正確に読み込み・再生が可能になります。
問題のケース
まず先に、どのようなケースだとうまく書き出しができないのかを試していきましょう。
この忍者のモデルには、予めキーフレー厶を打って作った4つのアニメーション(Idle, Run_Normal, RunToJump, JumpToLanding)があります。
この4つのアニメーションを組み合わせて、「立っている状態から走り始めて、ジャンプして着地」という、複雑な動きをする1つのアニメーションを作りました。

さて、この組み合わせたアニメーションをエクスポートしましょう。
正しく出力されたかどうか、確認にはgltf-Viewerを使って見てみます。

どうやら4つのアニメーションが別々のものとしてインポートされてしまったようです。

これでは「立っている状態から走り始めて、ジャンプして着地」という一連のアニメーションが再生できません。
「NLAトラックの名前を全部同じにしなきゃ駄目なのでは?」と考える方もいるかと思います。そこで例えば以下の画像のように“Run”で統一してみました。

しかしこれも結論から言えば、効果はありません。


ぱっと見はRunというアニメーション1つだけになったので、きちんと統合されているかのように見えます。しかし実際は、このアニメーションの最初であるIdle部分(立っている状態)のアニメーションしか再生されません。
このように複数のアニメーション付きでGLBがうまく書き出せない場合があります。
このような状況で、正しく一連のアニメーションを再生できるようにするには、アクションをベイクすることで解決することができます。
なお、私が作業に使用している環境はBlender3.3を使用しています。3.4以降のバージョンを使っている人はそもそも上記の様にアニメーションすら反映されていないかもしれません。
それについては記事の最後で説明しているので、一通り読んだあとにご確認ください。
アクションのベイク
まず操作を始める前に、アニメーション再生(スペースキーを一回押すと再生されます)で統合したいアニメーションの動きになっているかを確認してください。もし無関係な動きが混じっているようであれば、一時的にそのストリップを削除するなどしてください。
上記を確認したら、ポーズモードの状態でアニメーションに用いているボーンを全選択してください。
それからポーズ>アニメーション>アクションをベイクを選択してください。

ウィンドウが開くので、まずアニメーションの最初と最後のフレームを設定します。
それから選択ボーンのみ、ビジュアルキーイングにチェック。そしてデータをベイクの項目でポーズを選択してください。

この状態でOKを押せば完了です。
NLAウィンドウに戻ると、ArmatureにActionが追加されているのが確認できます。

そしたらこのActionのアニメーションをストリップ化し、既存の複数のアニメーションは削除してしまえば、複数のアニメーションが1つにまとまった状態となります。

なお、GLBにエクスポートする際は、以下の“全アクションをエクスポート”のチェックを外すことをおすすめします。このチェックがついていると、NLA関係なく全てのアニメーションを書き出してしまうので、例えば今回の場合でいうとNLAで組み合わせたActionというアニメーション1つに加えて、4つのアニメーション(Idle, Run_Normal, RunToJump, JumpToLanding)がそれぞれ書き出されます。

逆にチェックを外すと、NLAトラックにあるアニメーションしかエクスポートされません。ですので、今回の場合はNLAトラックに設定されているActionだけがエクスポートされます。
さらにこの仕組みを応用して例えば、Actionのアニメーションと、Actionのアニメーションを作るのに利用したIdleのアニメーションの2つをエクスポートしたい場合は、Idleもストリップ化してNLAトラックに加えておけば、GLBになっても2つのアニメーションを使うことができます。


おわりに
これを使えばいくつでもアニメーションを組み合わせて、1つにすることができます。また必要なアニメーションだけを取捨選択し、GLBに組み込んでエクスポートが可能になります。
アニメーション付きのGLB形式のモデルを取り扱う際には役に立つ知識かと思いますので、もしこのようなケースが生じた場合には上記を試してみてはいかがでしょうか。
余談 : バージョンによるGLBエクスポートの不具合について
私の環境下限定かもしれませんが知識の共有です。
Blender3.4以降のバージョンだとGLBでアニメーションを書き出しても、その.glbのデータにアニメーションが反映されません。(執筆現在はBlender3.5が最新ですが、同様に反映されません)
解決法は素直にBlender3.3を使って、.glbをエクスポートすることです。仮に3.4や3.5で作ったデータであっても基本的には3.3でも同様に開くので、バックアップを欠かさずした上で3.3で開き、試してみてはいかがでしょうか。
原因は特定できませんでしたが解決しました。
コメント