見出し画像

Mecanim/Generic向けにリグを組んだり、アニメーションベイクをする場合のTips

Unity 2019.4.0f1での検証
2020/07/24 Nobuyuki Kobayashi

まとめ

・ Mecanim/GenericのRoot nodeとなるジョイントの親の位置に出力用のNULL(本文の例だと、UnityExportObjects)を作り、FBXはそのNULLをルートとしてExportする。
※Unityにインポートした時、このNULLはRoot nodeの候補とはならない。 

・ Mecanim/Genericでアバターを作成して、アニメーションを流し込むためには、アバター作成の対象となるジョイントの階層と名前を、モデル側とアニメーションをベイクする側で必ず合わせる。
※合わせないと動かない可能性がある。 

・ ピボットが複雑な構成になっているリグをMecanim/Genericで扱う場合は、いくつか注意が必要となる。下を参照すること。
※Maya上や、Legacyアニメーションとしてインポートした場合と違った動きをすることがある。

はじめに:Mecanim/Genericとは

Mecanim/Genericとは、UnityのAnimatorコンポーネントで動くアニメーションの形式のひとつだ。Mecanimは人型専用のHumanoidが有名だが、GenericのほうはHumanoid以外のリグも対象とすることができる。

通常は、モデルとそれに付けたアニメーションクリップを一塊のFBXファイルとしてUnityにインポートして利用するが、Timeline上でカットシーンなどを作っている際には、アニメーションだけが収録されているFBXと、モデルが収録されているFBXを分けたいこともよくある。

その場合、Mecanim/Genericの持つアバター経由でアニメーションクリップを共有すれば解決する。具体的には、Animatorコンポーネントに登録したAnimator Contorollerを使えばよいのだが、各アニメーションクリップをモデルに流し込むアバターの設定次第では、予想通りに動かない場合もある。そんな状況を解決するためのTipsが本稿である。

Mecanim/Genericを使うことで、Timeline上で自由にアニメーションクリップをブレンドすることができるようになる。
これはカットシーンを作成するのに大いに役に立つと思う。

1. Maya上でリグを組む時のTips

画像1

上のリグについて少々補足をしておくと、このリグはTimeline上で複数のオブジェクトに対して合わせモーション(組モーション)を作りやすいように設計したリグである。UnityのTimeline上に配置した後で、オフセットを調整することで、様々な演技をタイミングを調整しながらクミの設計ができるように工夫してある。

移動とスケールが接地面基準になっているのも、そのほうがボールの演技と表情を出すのに都合がよいし、回転がボールの中心にあるのも、接地しながら回転するボールを作るのに都合がよいからである。
代わりにピボット位置が「移動/スケール」と「回転」とで異なるリグとなった。

このようなリグの場合、再生する環境が異なると違った結果が出やすい。
似たような問題は、人型のスケルトンにスケールアニメーションを入れて動かす場合にもしばしば発生する。回転とスケールのアニメーションを組み合わせる場合、注意しないと見た目が変わってしまうのだ。


2. Legacy Animationと同じ動きをするMecanim/Genericアバターの作り方

上の例のように、Translate/ScaleとRotateの各ピボットが違うような構成のリグをMecanim/Generic のアバターとして作成する。

その場合、Legacy Animationと同等の動きをするアバターを作るには以下のようにする。


Tips 1.アニメーションを転送される側のモデルのFBXExport用のシーンで、あらかじめ必要なチャネルボックスアトリビュートにキーを打っておく

アバターがアニメーションのキーフレームが打たれている位置も考慮して作られるようなので、モデル用のFBXを出力するシーンで、事前に「影響を与えうるすべてのTranslateのアトリビュートの1フレーム目にキーを打っておく」とよい。そしてこのFBXをUnityでインポートする際には、Animationも一緒にインポートするようにする。

MecanimGeneric用モデルの出力の際の注意

※このキーは、アニメーションをベイクする側のシーンでは必要ない。むしろアニメーションExportするFBX側ではキーは必要最小限に抑えるほうがよい。

このアバターを使って、Mecanim/Generic上での動きをみてみよう。
本アニメーションはボールを動かしているものだが、ボールが回転しながら動いているのがポイントである。(普通は面倒くさいので、ボールが回転していることが判る必要がある時以外には、ボール自体の回転はさせないで移動だけで済ませてしまう。)

上の手順で正しいアバターの作り方をした場合:

Rotate側のリグのTranslateは計算されるが、反映はされない。(アニメーションデータ的には、Rotate側のリグのTranslateにはキーが打たれておらず、0になっている)

Legacyアニメーションは常にこの形になる。


上の手順を抜いて、アバターを作った場合:


Rotate側のリグのTranslateの値が、上の階層に実際に打たれているキーに影響してしまう。

結果、回転に合わせて、ボールが変に飛び跳ねてしまっている(回転とスケール変化の結果、自動的に計算された値が反映されてしまっている)

もちろん2つの例で使っているアニメーションクリップは同じである。違いはアバターの生成の仕方だけである。


Tips 2.Unity上で、FBX内のアニメーションクリップをデュプリケートし、不要なキーをアニメーションクリップから削除してしまう

上のような手順を踏まない場合、Unity上でアニメーションクリップから不要なキーを削除してしまう。

アニメーションクリップから不要なキーを削除する

その場合、Unity上でアニメーションクリップを加工できるように、Mecanim/Genericの設定が終わった後で、まずFBX内のアニメーションクリップをDuplicateして、取り出しておく必要がある。

筆者の考察

回転とスケールとでピボット位置が違うアニメーションの場合、FBXがUnityにInportされる時、元々キーが入っていないアトリビュートに対しても余計なTranslateが計算されて、結果として全体の座標がズレてしまうようである。
※Legacy Animationでは、これが起こらないか、影響を与えない。

Mecanim/Genericで、モデルとアニメーションがワンセットになっているFBXを扱っている時は、自然とTips 1の手順を踏むことになるので意識的に作業をしなくてもよいが、モデルとアニメーションを作成しているシーンが違って、結果として同じFBXを使っていないような場合、Mecanim/Genericアバターを使ってアニメーションをモデルに流し込む場合には注意が必要となる。

余談

正確なアバターを作るために、アニメーションを転送するモデルの1もしくは0フレーム目にTスタンスなどのリファレンスポーズを打っておくとよいというのは、Mecanim/HumanoidにもあったTipsだった。Mecanim/Genericでも同じように使えるということのようだ。

この記事が気に入ったらサポートをしてみませんか?