2023年5月29日月曜日

アニメーションを出力する際に補正しておきたい設定

 ゲーム用の素材としてアニメーションを出力する場合、修正や仕様変更などで何度も同じシーンを出力して素材の更新をします。そんな時、前回の出力状態と異なっていたらバグになってしまいます。作業者だけで完結していてもバグを引き起こしてしまうような設定がいくつかありますが、そんなことは無いかもしれません。


 まずは原因不明の現象なのですが、コンストレイントで拘束しているジョイントが動かなくなる事があります。パッと見た感じでは気付きにくいため、出力してファイルを更新したら動かなくなっている、というようなバグが発生します。

 そうとう稀な現象で、しかも何がきっかけで起きるのかが分かりませんが、ナゼか回避策は判明しています。
 回避方法としては、プリファレンスにあるアニメーション設定の評価モードを「DG」へ変更することで修正されるのですが、ここを変更するとキャッシュ機能が使えなくなったりするので、常に DGモードにしておくのは現実的ではありません。

 そこで出力直前にスクリプトで変更します。

proc _editEvaluation.off()
{
    if(!`evaluationManager -q -enabled`) return;
    
    // 現在のモードを保管
    string $mode[]=`evaluationManager -q -mode`;
    
    // 評価モードをDGへ
    evaluationManager -mode "off";
    
    // 復帰
    evalDeferred("evaluationManager -mode \""+$mode[0]+"\";");
    
}

 出力が終了し Mayaが待機状態になったところで evalDeferredが実行され元に戻ります。

 つぎにミュート 。
 移動を伴うモーションを作成している場合、エンジン上での移動量をモーションで制御するためにスケルトンの原点を移動させることがあります。けれども、全身が移動している状態で細部のアニメーションを編集するのは大変になるため、原点の移動をミュートした状態で作業したりしますが、出力時、このミュートの解除を忘れてしまい、移動させようとしても移動しない、こちらも動かなくなる系のバグが起きてしまいます。

 まず、アトリビュートをミュートすると、transformノードと animCurveノードの間に muteノードというのが挟まるようです。

 出力時に毎回々々削除と作成を繰り返していたのでは事故が起こりそうです。この muteノードを確認してみると muteというアトリビュートがみつかりました。

 ここをオフにすることでもミュートを解除することができるようなので、ノードを削除するのではなくアトリビュートを編集することにします。

proc _editMute.disable()
{
    // muteノードの確認
    string $mutes[]=`ls -typ "mute"`;
    if(!`size $mutes`) return;
    
    string $cmds ="";// 復帰コマンド
    
    for($mute in $mutes)
    {
        // 参照ファイル内であればスキップ
        if(`referenceQuery -inr$mute`) continue;
        
        // ミュートが有効の場合の処理
        if(`getAttr ($mute+".mute")`)
        {
            // ミュートの解除
            setAttr ($mute+".mute") 0;
            
            // 復帰コマンドに追記
            $cmds +=("setAttr \""+$mute+".mute\" 1; ");
            
        }
        
    }
    
    // 復帰
    if("" != $cmds) evalDeferred( $cmds );
    
}

 これも出力直前に実行します。

 どちらも使用している素材に当たらないと判明しづらいため、全再コンバートなどした場合のデバッグコストが跳ね上がるため、忘れずに組み込んでおきたい感じです。



0 件のコメント:

コメントを投稿