D日記

モーションアーティストの技術ブログだよ。日常も書くよ。

MENU

【MEL】既存のリグのシェイプを置き換える【Maya】

f:id:ponta565:20190917163555p:plain

皆さんはリギングが終わったあとに
コントローラーの形状をやっぱり変えたいなぁ・・・
って思ったことはありませんか?
実はこれシェイプノードを差し替えることで可能なのです( ^)o(^ )

parent コマンドの引数に -s をつけることで、シェイプノードの移植が可能です。
parent( "-r" , "-s" , <シェイプノード> , <トランスフォームノード> )

listRelatives() を使えば、トランスフォームの指定だけでペアレントできますよ。
parent( "-r" , "-s" , listRelatives( "rig_newController" ) , "rig_oldController" )


作成したツール

今回はこれらのコマンドを使って簡単なツールを作りました。
f:id:ponta565:20180910212240p:plain
下記をスクリプトエディタでコピペして実行すると利用できます。

/*
1番目にに選択したオブジェクトのシェイプノードを、
2番目以降に選択したオブジェクトのシェイプノードに置き換える。

■ 用途
・リグの形状を途中で変更したいが、既存のトランスフォーム消したくない
・アニメーションを崩さずシェイプノードだけ差し替えたい
・現在のトランスフォームを保持したまま、モデルデータを差し替えたい

*/

proc RShapeNode_Exec( string $_mode ){

    string $sel[] = `ls -sl -l`;

    // はじめに選択したノードのシェイプを取得
    $shape = `listRelatives -s $sel[0]`;
    

    for( $i=1;$i<size($sel);$i++ ){
        // 既存のリグからシェイプを削除
        delete `listRelatives -s -f $sel[$i]`;

        if( $_mode == "copy" ){
            // _FP == フルパス
            // ターゲットオブジェクトを複製し、シェイプだけを取り出す
            $newObj_FP = ls( "-l" , duplicate($sel[0]) );
            $tempShape_FP = `listRelatives -s -f $newObj_FP`;

            // ターゲットTMの子にする
            $newShapeName = parent("-r" , "-s" , $tempShape_FP , $sel[$i] );

            // シェイプノードの名前を修正
            $nameBKUP = ls( $sel[$i] );
            $temp_FP = rename( $sel[$i] , ls($newShapeName) );
            rename( $temp_FP , $nameBKUP );


            // 空のトランスフォームを削除
            delete $newObj_FP;
        }else{
            // 最初に選択したカーブを、2番めに選択したトランスフォームのシェイプノードへとインスタンス
            parent -add -s $shape $sel[$i];
        }
    }
    
}


proc ReplaceShapeNode(){
    string $window = "ReplaceShapeNode";

    if(`window -exists $window`)deleteUI $window;

    window -title "ReplaceShapeNode" -width 300 -toolbox true $window;

    columnLayout -columnAttach "both" 5 -rowSpacing 10 -columnWidth 250;
    text -l "2つ以上のオブジェクトを選択して実行。\n2番目以降のオブジェクトのシェイプを置き換え。";
    button -label "コピー として置き換え" -c "RShapeNode_Exec(\"copy\")" -ann "オリジナルのシェイプになります。";
    button -label "インスタンス として置き換え" -c "RShapeNode_Exec(\"instance\")" -ann "1つのシェイプを修正すると他のオブジェクトのシェイプも変更されます。";


    showWindow $window;
}

ReplaceShapeNode();

使用動画

youtu.be

すでにアニメートしているリグのアニメーションをそのままに、リグだけ差し替えています。
「インスタンスとして置き換え」を押すことで、複数のリグを一つのシェイプで共有することもできます。

似てるけど微妙に違う標準機能

ちなみに・・・
Mayaの標準機能で、「Replace Objects」という機能がありますが、
この機能で差し替えを行うと、ノード間の接続が切れてしまうという問題がありました。

オブジェクトの置き換え(Replace Objects)オプション
knowledge.autodesk.com
リグであればいろいろなコネクションが外れて正常に動作しなくなります。
モーションが設定されているリグであれば、アニメーションノードとの接続も切れてしまいます。
ということで今回の用途には使えませんでした(´°̥̥̥̥̥̥̥̥ω°̥̥̥̥̥̥̥̥`)


今回はシェイプノードの差し替えのアプローチを紹介させていただきました。
リグの形状を途中で変更したい方は、どうぞご自由にご利用下さい!
終わり。