【Maya】FBXエクスポートでクリップ分割、クリップ名変更を行う

GameExporterを利用すると以下のような感じでTimeEditorと連携するなどして複数クリップを定義し、FBXのクリップを分割することができます。

f:id:tm8r:20190507213253p:plain

が、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;")

それぞれ何をしているかはコメント部分を参照してください。

このメソッドに書き出しパスを指定して実行してやると…
f:id:tm8r:20190507220348p:plain
この通りクリップが分割されています😊

ちなみに「クリップ情報の定義」のところで使用している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まわりの動作は近いうちに書くつもりです…!

スポンサーリンク