GameExporterを利用すると以下のような感じでTimeEditorと連携するなどして複数クリップを定義し、FBXのクリップを分割することができます。
が、GameExporterのUIを使わずにクリップ分割したい、というシーンもあるかと思います。
というわけでやっていきましょう💪
クリップを分割してエクスポートする
もう早速コードを出してしまいますが、こんな感じで実現できます。
from maya import mel def export_split_animation(path): # クリップ情報をクリア mel.eval("FBXExportSplitAnimationIntoTakes -clear;") # クリップ情報を定義 for clip in get_clips(): mel.eval("FBXExportSplitAnimationIntoTakes -v {0} {1} {2};".format(clip.name, clip.start, clip.end)) # デフォルトで含まれるTake001を削除 mel.eval("FBXExportDeleteOriginalTakeOnSplitAnimation - v true;") # ここに通常のFBX書き出しコードを記述する # 念のため他の処理にも影響が出ないようにクリップ情報をクリア mel.eval("FBXExportSplitAnimationIntoTakes -clear;")
それぞれ何をしているかはコメント部分を参照してください。
このメソッドに書き出しパスを指定して実行してやると…
この通りクリップが分割されています😊
ちなみに「クリップ情報の定義」のところで使用しているget_clipsメソッドは以下のようなクラスのリストが返ってくるていです。
class AnimationClip(object): def __init__(self): self.name = "" self.start = 0 self.end = 0
オレオレノードで管理している情報をとってくるもよし、TimeEditorの情報をとってくるもよし、という感じです。
クリップ名変更を行う
クリップ分割はしないけど、クリップ名を「Take001」でもシーン名でもない名前にしたい、というケースでも「FBXExportSplitAnimationIntoTakes」コマンドは有効です。
具体的にはこのようにします。
def export_specified_clip_name(path, clip_name): mel.eval("FBXExportSplitAnimationIntoTakes -clear;") # 引数に追加されたclip_name、再生範囲の最初と最後を使用してクリップ情報を定義 min_key = cmds.playbackOptions(q=True, min=True) max_key = cmds.playbackOptions(q=True, max=True) mel.eval("FBXExportSplitAnimationIntoTakes -v {0} {1} {2};".format(clip_name, min_key, max_key)) mel.eval("FBXExportDeleteOriginalTakeOnSplitAnimation - v true;") # ここに通常のFBX書き出しコードを記述する mel.eval("FBXExportSplitAnimationIntoTakes -clear;")
get_clipsメソッドを使用するのをやめて、引数に追加されたclip_name、再生範囲の最初と最後を使用する感じです。
かんたん!
おわり
GameExporterとかTimeEditorまわりの動作は近いうちに書くつもりです…!