MayaとUnity スケール補正についてのお話

こんにちは。CG開発室の鈴木です。

Mayaからアニメーションを出力し、Unityに入れてみた際に、スケールアニメーションがうまく再生されない。といった経験は無いでしょうか。MayaとUnityでは同じような内容でもちょっとした設定が違う項目が多々あります。

今回のwhomor Picturesでは、Mayaで出力したアニメーションをUnityに入れてみた際にスケールアニメーションに違いが出てしまった。という際についてのお話をしてみたいと思います。

では、実際にどういった現象が起きるか見てみましょう。

MayaとUnityでのスケールアニメーションの違い

MayaからUnityにジョイントをつけたモデルを読み込んでみる

はじめに、簡単にモデルを用意し、スキニングを行います。

デフォルト設定のままスキニングを行い、それぞれのジョイントのスケールにキーを打っていきます。

1F-30Fでスケール1になり、30F-60Fでスケール2になるアニメーションをつけてみました。

データをFBXで書き出し、Unityに入れてみましょう。

Unityでアニメーションを再生してみると・・・

Maya上でつけたものと、様子が違いますね。
具体的にどう違うのかMayaとUnityの結果を並べて確認してみましょう。

明らかに、Maya上とUnity上で違うアニメーションになってしまいました。

この見た目の違いをあわせるには?

Maya側で調整を行います

ジョイントのアトリビュート内、セグメントスケール補正のチェックをオンオフすることでスケールのかかり方を変更することが出来ます。

Mayaはデフォルトでチェックが入っていますが、チェックを外すことで、Unity上と動作をあわせることが出来ます。

各ジョイントのセグメントスケール補正のチェックをはずします。

セグメントスケール補正を調整したシーンファイルをFBX出力し、Unityにインポートして、先程のデータと並べてみると、下図のような状態になります。

これで、Mayaと同じ状態のアニメーションをインポートすることが出来ました。

Maya側でスケールアニメーションをつける際に、セグメントスケール補正のチェックを外した上でアニメーション作業を行えば、MayaとUnityで同様の結果を得られることが分かりました。

Unity側で調整することは可能か

Unityではセグメントスケール補正機能はありませんので、基本的にMaya側の状態に合わせることは出来ません。

スクリプトを組み、セグメントスケールを補正をかけれるようにすれば出来るかもしれませんが、結果として余計な負荷がかかってしまうことになります。

セグメントスケール補正とは?

上記でセグメントスケール補正を調整すれば解決する!と記載しましたが、セグメントスケール補正とはどういった項目なのでしょうか。

セグメントスケール補正(Autodeskhelpを引用)
このアトリビュートをオンに設定すると、親ジョイントのスケーリングに対して補正が行われるため、子ジョイントには影響しません。オフにすると、ジョイントのスケーリングが親ジョイントのスケーリングの影響を受けます。既定はオンです。

ここで着目するのは、親ノードの影響を子供が受けるかどうかという点になります。通常、モデル等のノードであれば、子供は親の影響を受けるようになっています。

Mayaではジョイントに関してのみ、セグメントスケール補正をかけることができ、親の影響を受けずに子供のスケールを変更することが出来るようになっています。

今回の事例では以下の現象が起きていました。まず、Mayaセグメントスケール補正がonの場合です。

次に、Mayaセグメントスケール補正をoffにした場合です。

今回、Unityにインポートを行った事例ではこの状態が発生していました。

最後に、入力スケールを変えてみた場合です。

結局どうしたらいいの?

Mayaでジョイントを組む際、セグメントスケール補正のチェックを外しておきます。その状態であれば、UnityとMayaで齟齬の無いデータをつくることができます。

他ツールの場合は?

Maya、Unity以外のツールでのスケールアニメーションについて少し紹介します。

3ds Maxだと?

・普通に持ち込むとどうなるの?
3ds Max には正しく読み込まれません。この読み込みの問題は、3ds Max が Maya のスケール補正設定をサポートしていないために発生します。

・セグメントスケールはできるの?
できません

・Maya→3ds Maxのデータ移動はどうなるの?
送る前になおしましょう

Unreal Engine(アンリアルエンジン)に入れた場合は?

セグメントスケール補正あり、セグメントスケール補正無しの両データを簡単にインポートしてみたところ、以下の結果となりました。

まったく同じ結果を得ることができました。Unreal Engineでは、セグメントスケールの補正を受けることができるようです。Unityと3ds Maxが同一の結果となり、MayaとUnreal Engineが同一の結果となりました。

Unreal Engineに関しては、Unityに正しく書き出せたデータでも同じ結果となりましたので、どちらでも大丈夫なようです。

Mayaのみ、スケール補正がかけられるようになっているので、アニメーションをつける際には注意が必要になるようです。

まとめ

いかがでしたでしょうか?

今回は、Maya・Unityでのジョイントのスケールという少し変わった箇所のお話を紹介しました。

初歩的な箇所で、あまり気にしない箇所かもしれませんが、ちょっとした違いでかなり変わってきます。
Unreal Engineではまた違った結果となりましたので、ツールをまたぐ制作であれば、それぞれ見極めていく必要がありますね。