Segment Scale Compensateについて

Mayaで作成したアニメーションをUnityに持っていったときに「Segment Scale Compensate」が原因で正しくアニメーションが持っていけなかった。

MayaとUnityでキャラクターの腕の大きさが違う

Segment Scale Compensate

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

https://knowledge.autodesk.com/ja/support/maya/learn-explore/caas/CloudHelp/cloudhelp/2018/JPN/Maya-CharacterAnimation/files/GUID-8CE29E9D-F1C5-42A3-A657-33E32887380A-htm.html

Mayaはジョイントを新規に作るとSegment Scale Compensate(以降SSC)がデフォルトで有効になっており、ジョイントのスケールを拡縮しても子ジョイントは親ジョイントに影響されない(一緒に拡縮されない)設定になっている。

UnityはSSCに対応していないので上記の画像のように親ジョイント(二の腕)以下のジョイントが親ジョイントのスケールの影響を受けている。

対策

SSCはデフォルトで有効になっているので、アニメーション作業をする前にすべてのジョイントのSSCを無効にする。(ジョイントのスケールをいじらないなら有効のままでも問題ない)

ルートジョイントを選択し、以下のプログラムをスクリプトエディタに張り付けて実行するとルートジョイント以下のジョイントのSSCを無効にしてくれる。

import maya.cmds as cmds
cmds.select(hierarchy=True)
selectObj = cmds.ls(sl=True)
for node in selectObj:
    if(cmds.objectType(node)=='joint'):
        cmds.setAttr(node+".segmentScaleCompensate",0)