BLOGブログ

2020.10.14UE4/Animation

[UE4]アニメーション リターゲット

執筆バージョン: Unreal Engine 4.25

こんにちはこんにちは。アートディレクターのくろさわです。
今回はUnreal Engine4(以下UE4)のアニメーションリターゲットについて解説します。

2種類のアニメーションリターゲット

事前知識としてアニメーションシーケンスとスケルトンの関連性について知っておく必要があるので簡単に解説しておきます。
UE4のスケルトンは、MayaなどのDCCツールでいうところのスケルトンとは異なり、単体のキャラクターの骨の情報を示したものではなく複数のキャラクターで使い回すことを想定したものです。

  • スケルトンは複数のキャラクター(スケルタルメッシュ)で参照可能。
  • アニメーションシーケンスやアニメーションブループリントなどの、UE4のキャラクターアニメーション関連の情報はすべてスケルトンに紐づく。

つまり、以下のようにスケルトンを中心とした関連性になっています。

さて、UE4のアニメーションリターゲットですが、全く異なる2つの機能がアニメーションリターゲットと呼ばれています。順番に紹介します。

異なるスケルトンでのアニメーションリターゲット

文字通りスケルトンが違っていても、ベイクして複製し、そのスケルトン用にそっくりな新しいアニメーションを作り出す機能です。ランタイムで動作するのではなく、エディタで実行し、複製を行います。

Mayaでアニメーションを作っている人には、HumanIKで、別のキャラクタのソースを使用してベイクしたもの、といえばわかりやすいかもしれません。ソースは同じでもベイク後は全く別のデータです。

使いどころですが、マーケットプレイスで購入したアニメーションは(おなじUE4マネキンに見えても)それぞれ違うスケルトンに割り当てられているので、同じスケルトンにまとめて流用するためにこの機能を使います。
手っ取り早くデータを使えるようにできるので、プロトタイピングなどで活躍する機能です。

アニメーション リターゲット(異なるスケルトン)

同じスケルトンでのアニメーションリターゲット

こちらは同じスケルトンの中で、体形の違うスケルタルメッシュで違和感なくアニメーションを再生する手法のことです。こちらはエディタで実行する機能ではなく、ランタイムで動作します。

アニメーション リターゲット

今回はこちらの同じスケルトンでのアニメーション リターゲットについて掘り下げます。

同じスケルトンでのアニメーション リターゲットの使い方

同じスケルトンで異なる体形のスケルタルメッシュに違和感なくアニメーションを再生する手法の解説の前に、なぜUE4ではスケルトンを複数のスケルタルメッシュで共有したいかということについて話しておきたいと思います。

スケルトンを共有する利点のひとつですが、同じアニメーションシーケンスを流用できるのでゲーム全体のデータサイズが小さくなります。もちろん制作コストも下がります。アニメーションシーケンス一つ一つはそれほどの大きさでもないのですが、昨今のキャラクターアニメーションは複数のアニメーションを複雑に混ぜて使用するため、かなりの数のデータが必要になります。ただし、こちらはキャラクターごとに作成して調整したほうがキャラクターらしさの表現につながるので品質と手間のトレードオフです。

もう一つがUE4はアニメーションブループリントがスケルトンに紐づくためです。アニメーションブループリントはキャラクターの状態によってどのアニメーションを再生するか、などを記載してアニメーションの再生を管理する処理です。例えば制作しているRPGに「仲間キャラクターはすべてダメージを受けた瞬間にノックバックモーションを再生してほしい」といった共通した処理があるとします。もしキャラクターごとにスケルトンが別れていると、この共通の処理をキャラクターごとに書く必要があります。そのためRPGのパーティメンバーのような似たような管理下に置かれるものは同じスケルトンを使うのが望ましいです。

さて同じスケルトンで異なるスケルタルメッシュでアニメーションを再生する方法ですが、そもそもスケルトンが同じであればなにもしなくてもアニメーションは再生できます。
ところが違和感なく動かすには骨によって求めてる処理が違うため、設定を行う必要があります。

設定はスケルトンツリーのTranslation Retargetingにあります。

いくつか設定の例をあげます。

一般的に肘や膝などの関節はスケルタルメッシュの関節の位置から動いてほしくないので、Skeletonを使用します。これがもしAnimationやAnimationScaledであれば、アニメーションの位置まで動いて体型が変わってしまいます。

またHipなどの移動を伴うボーンは、キャラクターの大きさを考慮して、大きいキャラは大きく動き、小さいキャラは小さく動く必要があるので、AnimationScaledを使用します。

このあたりは以前にもブログに書いたので興味があれば読んでみてください。

https://historia.co.jp/archives/7589/

Animation Scaledは何を行っているのか

キャラクターの大きさを考慮して移動量を変更してくれるAnimationScaledですが、具体的にどんな処理を行っているのでしょうか?
実は内部的にリファレンスポーズというものをもっていて、ここに最初にスケルトンが制作されたときのスケルトンの長さが記録されています。
このリファレンスポーズでのボーンの長さと動かしているスケルタルメッシュでのボーンの長さで比較を行い、その比較を移動の値に係数としてかけているのです。

リファレンスポーズで長さが12、リターゲットしたスケルタルメッシュの長さが19の場合、比率は19/12で約1.58倍の移動量で再生される

一つ注意が必要なのですが、リファレンスポーズとスケルタルメッシュでボーンの長さの比率を出していることはボーンの長さが0であると比率が出せません(0を割ることはできないので)。
映像業界では同位置にヌルを多重に挟んだデータを作ることが多々ありますが、Animatio Scaledを使う場合、こういうデータはスケールがかけられないので注意が必要です。

Animation Scaledだけでは解決できない問題

これでどんなアニメーションでも共有できるのかといえばそうではありません。

よく誤解されがちなのですが、アニメーション リターゲットはアニメーションの再生時に、このスケールの補正を行うことで異なる体形でも同じ動きを再現できるという仕組みです。逆に言えばそもそもアニメーションをリファレンスポーズとは違うサイズで制作した場合、いくらAnimation Scaledにしてもアニメーションは合わなくなってしまいます。

しかし制作ではしばしばキャラクター同士が絡むモーションが必要になるので、キャラクターに合ったサイズでアニメーションを作成する必要があります。
例としては身長の違うキャラクター同士が手を取り合う場面などでしょう。この場合、キャラクターの身長を考慮したモデルでアニメーションを作らないと正確にターゲットできません。

では異なるサイズでアニメーションを作成した場合はどうやってアニメーションを使い回せばよいでしょうか?これを解決するにはスケルトンではなく、アニメーションシーケンスごとに設定を変更する必要があります。

DCCツールによる解決方法

一つはMayaなどのDCCツールでリグ内での補正やエクスポート時に、アニメーションをリファレンスポーズに合わせてしまうことです。

一つ注意点としては、リファレンスポーズに登録されていないボーンはスケールの補正をかけることができないので、予め登録しておく必要があります。

UE4での解決方法

UE4にはアニメーションシーケンスごとに、なにをリファレンスにするか変更する方法があります。
まず、リターゲットマネージャを開き、Manage Retarget Souceにスケルタルメッシュを登録します。そのうえでアニメーションシーケンスのRetarget Souceで登録したスケルタルメッシュを指定することで、そのキャラクターをリファレンスポーズとして使用できます。

Manage Retarget Souceの設定ですが、ちょっとわかりにくい位置にあります。
冒頭で全く別の機能にリターゲットという名前をつけているという話をしましたが、メニューでも入り混じっています。

そもそも全く別の機能をリターゲットという一つの言葉にまとめてしまっているので、どの項目がなにに影響しているのかとてもわかりにくいんですよね…
UE5ではぜひわかりやすい名前をつけてほしいなと思います 🙂