MENU閉じる

HEXA BLOG

プログラム

HEXA BLOGプログラム2020.11.26

慣性補間によるアニメーション遷移を実装してみた

こんにちは、東京PGのゴボウです。

最近すっかり運動しなくなって体力が落ち、そろそろ運動しないとまずいなあと感じています。

それでは本題に入らさせていただきます。皆様はアニメーション遷移についてご存じでしょうか。例えば3Dモデルを立っているアニメーションから歩いているアニメーションに変える時、ゲームではキャラクターの動きが滑らかに切り替わります。そういったアニメーションとアニメーションの間の変化のことをアニメーション遷移といいます。今回はアニメーション遷移について、Gears of WarやFF7Rで用いられている慣性補間によるアニメーション遷移というものの話をさせていただきます。

アニメーションの遷移といいますと、例えば立ちモーションから歩きモーションへアニメーションを変更するとき、従来は立ちモーションと歩きモーションを特定の割合で混ぜるようにして、その混ぜる割合を[立ちモーション100%:歩きモーション0%]から[立ちモーション0%:歩きモーション100%]へ変えていく、などの方法(クロスフェード)がとられていました。

それに対して、慣性補間によるアニメーション遷移はざっくり言ってしまうと、遷移が始まるときに立ちモーションと遷移先の歩きモーションの差分や速度を覚えて、その差分を少しずつ小さくしていく、という方法です。この差分を縮めるのに人間工学に基づいた計算式を用いているため、アニメーションの繋ぎがクロスフェードよりも自然でなめらかになります。

また、この方法はクロスフェードと異なり、遷移開始時点の差分などを覚えておけば元のアニメーションの情報はいらなくなるので、差分などを記憶したら前のアニメーション情報は捨てることができます。なので遷移が終わる前に新しい遷移が開始してもアニメーションが破綻しにくいというメリットもあります。

そこで今回は、この慣性補間アニメーションをUnityでざっくり実装してみました。
ソースコードは以下の通りです。

参考ページと少し違うのは、トランスフォームの情報を覚えるタイミングを変えています。
2フレーム前の情報をキャッシュしなくて済むように、直前のフレームでの情報と現在のフレームで遷移が起こらなかった場合の情報を使って速度を割り出すようにしました。

では、実行結果を見てみましょう。

ユニティちゃんライセンス

この作品はユニティちゃんライセンス条項の元に提供されています
© Unity Technologies Japan/UCL

髪の毛の動きを制御していないのでそこだけ不自然ですが、それ以外は自然にアニメーションを遷移させることができました。

本当にざっくり実装しただけなので、遷移にかかる時間が固定であるなど、そのままではゲームに使えないです。また、UnityのHumanoidに属するモデルにしか使えません。しかし、自分で実装するとどのような原理でアニメーションがきれいに遷移するのか理解しやすかったです。

もちろんトランスフォームの取り方を工夫すれば人以外のモデルにも使えます。アニメーションにこだわりたい、という方はぜひ慣性補間アニメーション遷移の使用を検討してみてください。

では、また次回で。

参考ページは以下の通りです。
https://hogetatu.hatenablog.com/entry/2018/06/02/185613
https://hogetatu.hatenablog.com/entry/2018/06/10/232856

RECRUIT

大阪・東京共にスタッフを募集しています。
特にキャリア採用のプログラマー・アーティストに興味がある方は下のボタンをクリックしてください

RECRUIT SITE