D日記

基本的には3Dソフトをに関するTipsで、Maya・3dsMax・Unityなどを扱ってる、モーションアーティストの技術ブログだよ!

MENU

【MEL】マテリアルタイプをスクリプトで変更する【Maya】

f:id:ponta565:20190816144435p:plain

Mayaのマテリアルをスクリプトで変更する方法です。
今回Twitterで「歯磨き粉」さんに助けられました。



下記サイトのやり方で変更できるみたいです。
試してみたところ出来ました!
引用元:MEL How-To #69

// This would be your existing Lambert Material
string $shaderNode = "myLambert";

// This would be the desired Material type
string $replaceType = "blinn";

string $replaceWith = `createNode $replaceType`;

replaceNode $shaderNode $replaceWith;

// Not strictly necessary...
showEditor $replaceWith;

delete $shaderNode;

// Rename the new node to match the original.
rename $replaceWith $shaderNode;

改造

せっかくなので汎用性を増すためにちょっと改造しました。

// 第1引数:シーン内のマテリアル名を入力 、 第2引数:マテリアルのタイプ(lambert , phong ..etc)
proc ChangeMaterialType( string $_tgtMatNodeName , string $_matType ){
    string $shaderNode = $_tgtMatNodeName;

    string $replaceWith = `createNode $_matType`;
    replaceNode $shaderNode $replaceWith;

    delete $shaderNode;
    rename $replaceWith $shaderNode;
}

// シーン内の全マテリアルを指定したマテリアルに変更する
proc ConvertAllMaterial2Lambert( string $_matType ){

    // 下記マテリアルは除外する
    $excludeMats = {"particleCloud1", "shaderGlow1", "lambert1"};

    $mats = `ls -materials`;
    for( $mat in $mats ){

        // 処理対象外のマテリアルがあったら処理せずスルー。particleCloud1 とか。
        $isExcludeMat = stringArrayContains( $mat , $excludeMats );
        if( $isExcludeMat )continue;

        // マテリアルをlambertにコンバート(lambertでもLambertにコンバートするw)
        ChangeMaterialType( $mat , $_matType );
        
    }

}

ConvertAllMaterial2Lambert( "phong" );

上記の関数を実行すると、シーン内のマテリアルがすべてPhongマテリアルに変わります。
ConvertAllMaterial2Lambert() の引数を変えることで、好きなマテリアルタイプに変更することが出来ますね!

終わり!