2017年7月21日金曜日

Mayaのキャラクタセットを自動で切り替える

お久しぶりです、ポン太です。
自分にとってはかなり間を置いての投稿になりますが、今回はちょっとしたMayaの小技 ?を紹介したいと思います。
他所様とネタがかぶってたらゴメンナサイ…

皆さん、キャラクタセットは活用していますか?
複数のノードのアトリビュートにまとめてキーが打てる便利な機能で、自分は腕や足など各部位ごとにキャラクタセットを作成して、Human IKのように部位ごとにキー管理ができるようにして活用しています。
便利ではあるんですが、そのまま使うとちょっと不便なところがあります。


ウィンドウの右下でキャラクタセットを切り替えられるのですが、いちいち切り替えないといけないんですよね。
右腕のリグを選択してキーを打ったつもりが、左足のキャラクタセットのままで間違ってキーを打ってしまったり。
そこでスクリプトジョブを使って、選択したオブジェクトに応じて切り替わるようにしてみます。
ちなみに使用するMayaのバージョンは2017ですが、前のバージョンでも問題ないかと思います。


検証用として適当にオブジェクトを作成しました。螺旋オブジェクト以外は末尾にキャラクタセットの名前を付け加えています。


次にオブジェクト名に沿ってキャラクタセットを作成します。
これで下準備は完了。スクリプトを書いていきます。
あまりスマートではないですが、ご了承ください。

proc changeCharacterSets()
{
    string $selObjList[]=`ls -sl`;
    string $selObjAll=stringArrayToString($selObjList,"");
    int $chr01=`gmatch $selObjAll "*chr01*"`;
    int $chr02=`gmatch $selObjAll "*chr02*"`;
    int $chr03=`gmatch $selObjAll "*chr03*"`;
    int $chrFlag=$chr01+$chr02+$chr03;
    string $chrList[];
  
    if($chrFlag>0)
    {
        if($chr01>0)
            $chrList[size($chrList)]="chr01";
      
        if($chr02>0)
            $chrList[size($chrList)]="chr02";

        if($chr03>0)
            $chrList[size($chrList)]="chr03";
      
        setCurrentCharacters($chrList);
        clear $chrList;
    }
  
    else
        setCurrentCharacters({});

選択したオブジェクト名の配列をstringArrayToStringで一つの文字列にして、その中に固有の名前(今回の場合はchr01chr02chr03)が含まれているかどうかをgmatchで検索しています。
あとはどのキャラクタセットにするか分岐させて、setCurrentCharactersでキャラクタセットを切り替えます。
キャラクタセットは複数でも切り替えられるので、chr01chr02の2つに同時に切り替える事もできます。
何も選択していないときや、キャラクタセットに含めていないオブジェクトを選択したときは、キャラクタセットがなしの状態になるようにしています。

ひとまずこれで動作させるためのスクリプトはできました。
このスクリプトをファイルとして保存してソーススクリプトとして読み込んでおくか、あらかじめ実行しておくことで、スクリプトジョブでいつでも呼び出せるようにしておきます。

では次にスクリプトジョブを作成するためのスクリプトです。

int $jobNum=`scriptJob -event "SelectionChanged" changeCharacterSets`;

これを実行すると、SelectionChangedにより、選択しているものが変わるたびにchangeCharacterSetsが実行されます。
スクリプトジョブを作成すると、そのジョブに数字が割り振られます。その数字が実行時に返されるので、"jobNum"という変数に入れておきます。
こうすることで下のスクリプトを実行すれば、いつでも作成したジョブを削除できます。

scriptJob -kill $jobNum;

では実際の動作がこちら。


選択しているオブジェクトが変わるたびにキャラクタセットが切り替わっています。複数選択した時は"複数"と表示されます。

自分の他に誰が使うんだろうかと不安になる内容でしたが、お役に立てれば幸いです。
では!