2020年9月28日月曜日

gameFbxExporterを改造する

FBXファイルの出力に便利な Game  Exporter ですが、当然、FBXExport コマンドを使用しています。 Model Export なら問題ありませんが、Animation Clips を出力するとなると問題が出てきます。こちらを参照

タイムレンジを設定できたり、複数クリップを1ファイルに保存するとか、自前で用意するのは中々大変なので有効活用したいところです。


なにより、シーンファイルに FBXの出力設定を保存できるのでヒューマンエラーが格段に減らせられるのは魅力的です。


そこで、この[ Export ] ボタンで実行されるコールバックを fileコマンドで実行するように改造したいと思います。

まずは、この [ Export ] ボタンが実行しているブロックを myGameExpFBX.mel みたいな新規ファイルへコピーして、MAYA_SCRIPT_PATH に保存します。

該当するプロシージャは、mayaがインストールされているパスの scripts\others 内にある gameFbxExporter.mel から gameExp_FBXExport() の部分です。

こんな感じの処理をしています。

// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// Export to an Fbx file
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
global proc gameExp_FBXExport(string $exportSelectionFlag, string $exportFilePath)
{
    global string $gGameFbxExporterCurrentNode;

    int $exportType = `getAttr($gGameFbxExporterCurrentNode + ".exportTypeIndex")`;
    if($exportType == 2 || $exportType == 3)
    {
        FBXExportDeleteOriginalTakeOnSplitAnimation -v true;
    }

    if(catch(`FBXExport $exportSelectionFlag -file $exportFilePath`))
    {
        string $lastError = getLastError();
        string $errorGameExporterFailed;

        int $exportType = `getAttr($gGameFbxExporterCurrentNode + ".exportTypeIndex")`;
        int $modelFileMode = 1;
        // Query if we are exporting to multiple files.
        $modelFileMode = `getAttr ($gGameFbxExporterCurrentNode + ".modelFileMode")`;

        if ($exportType == 1 && $modelFileMode == 2)
        {
            // Add information about the exported file - when exporting to multiple files
            $errorGameExporterFailed = getPluginResource( "gameFbxExporter", "kGameExporterExportFailedForFile" );
            // Remove the path, show only the file name
            string $file_split[] = stringToStringArray($exportFilePath,"/");
            string $file = $file_split[size($file_split)-1];
            $errorGameExporterFailed = `format -s $file $errorGameExporterFailed`;
        }
        else
        {
            // Show generic "Export Failed" error message.
            $errorGameExporterFailed = getPluginResource( "gameFbxExporter", "kGameExporterExportFailed" );
        }
        gameExp_ShowMessage($errorGameExporterFailed, 3);

        // Also show the error in scripting so the script execution will stop.
        error -noContext $lastError; 
    }

    if($exportType == 2 || $exportType == 3)
    {
        FBXExportSplitAnimationIntoTakes -clear;
    }
}


この16行目をコメントアウトして、下のようなコードに修正します。

    //------------------------------------------------------------------------------
    /// @pre 足りない出力設定の追加
    FBXExportIncludeChildren -v 0; /// @pre -> 子階層を含まず ※ 親階層は残る
    
    /// @todo 除去するネームスペース ※ 直接指定しているので編集する必要がある
    string $NS ="RIG:M:";
    
    /// @note FBXExport用のフラグを fileコマンド用のフラグへ変換
    string $mode = ("-s"==$exportSelectionFlag) ? "-es": "";
    
    /// @note fileコマンド作成
    string $cmd ="file -f -op\"v=0;\"";
    $cmd +=("-rns \":"+$NS+"\" ");
    $cmd +=("-typ \"FBX export\" "+$mode);
    $cmd +=(" \""+$exportFilePath+"\"");
    
    /// @post fileコマンドを使って出力
    if( catch(`eval $cmd`) )
    //------------------------------------------------------------------------------
//  if(catch(`FBXExport $exportSelectionFlag -file $exportFilePath`))

編集したら、スクリプトエディタ、または、シェルフから、こんな風に呼び出します。

{
	if(!`pluginInfo -q -l "gameFbxExporter.mll"`) loadPlugin "gameFbxExporter.mll";
	gameFbxExporter;
	source "myGameExpFBX.mel";
	
}

これで、[ Export ] ボタンの処理が自前のプロシージャで上書きされ fileコマンドを使ってFBX Export が実行されます。

ただし、21行目のネームスペースを指定する部分は、"RIG:M:"と指定しているので、環境に合わせて変更しないといけません。
汎用性を上げるため、自動でネームスペースを取得するような処理を追加してみるのも良いかと思います。

18行目に FBXExportIncludeChildren を設定していますが、Game Exporter でも設定できます。


これは、Advanced Setting を忘れるミスを防ぐための保険として書き込んでいます。ほかにも、忘れそうな設定があるようなら追加していく感じですね。

ただし、FBXExportAnimationOnly だけは使わない方が良いです。
これを有効にしてアニメーションを出力すると、ポリゴンやロケータみたいなシェイプを除去してくれて、ジョイントもトランスフォームノードだけに置き換えてくれるなど、ファイルの軽量化にはなるのですが、なぜか、アニメカーブがステップになってしまいます。


ぱっと再生した感じでは問題ないのですが、スローモーションとかにするとパキパキしてしまいます。
これは FBX出力設定でいうところの Convert to Null objects のフラグですね。紛らわしいです。


まぁ、この他にも、いろいろと状況に合わせて作り替えていけば良いんじゃないでしょうか。

欲を言えば、バッチ処理にも対応させてやりたいところではあります・・・。


0 件のコメント:

コメントを投稿