保存済みのFBXをmayapyで開いて色々いじったのち、再度FBXで書き出すようなバッチを作る機会がありまして。
FBXをオープンしたときはシーンをオープンしたときと違って、再生範囲が復元されません。
つまり、デフォルトの1-120の範囲になり、この状態で書き出すとFBXにおけるアニメーションの再生範囲も1-120になってしまいます。
結果、1-120の範囲外にもキーがあるのにUnityなどに持っていった際、この範囲でしか再生されない、みたいな現象が発生します。
(Unityだとmetaを書き換えれば対応できるはできるんですけど)
というわけでこの現象は以下のような感じで再生範囲をセットしてやれば解消されます。
cmds.playbackOptions(e=True, min=min_key) cmds.playbackOptions(e=True, max=max_key)
で、その後再生範囲がちゃんと意図した値になってるかなー。1-120の範囲になってないかなー。というのをチェックするのが本題です。
FBXの中身を読んでみると、以下のLocalTimeあたりがその値を保持してそうです。
Takes: { Current: "Take 001" Take: "Take 001" { FileName: "Take_001.tak" LocalTime: 1539538600,184744632000 ReferenceTime: 1539538600,184744632000 } }
というわけでスクリプトからFBXを読みたいと思います。
結論から言うと以下のように取得できます。
from maya import mel path="/Users/tm8r/Documents/maya/projects/default/scenes/motion_fbx.fbx" mel.eval('FBXRead -f "' + path + '";') result=mel.eval("FBXGetTakeLocalTimeSpan 1;") mel.eval("FBXClose;") print(result)
リファレンスはこのあたり。
FBX の一般的な MEL コマンド | Maya | Autodesk Knowledge Network
FBXReadでファイルをロードして、FBXGetTakeLocalTimeSpanで再生範囲を取得、そして最後にFBXCloseで読み込んだファイルを閉じている感じです。
結果は以下の通り。
[1.0, 120.0]
ちゃんと取れているようです。
FBXCloseを忘れるとその後に発行したコマンドがFBXReadでロードしたファイルに対して行われたりするので、FBXReadして処理が終わったら必ずFBXCloseするようにしましょう。
僕はFBXCloseしてなくて小一時間ハマりました。つらみ。