2021年6月14日月曜日

splineIk用のコントローラ名を作成する。

 スプラインIKでスパン数を指定して作成し、MELで扱い易いようクラスターのリストを作成するようなスクリプトを作成しました。
  参考:spineIkを設定する

 そしたら、今度はクラスタを拘束するコントローラの作成です。


 なにも考えず、クラスタの順番通り1,2,3,4と名前を付けていく方法も悪くはないのですが、mayaではノード名になるべく数字を使わない方が良いという暗黙のルールというか言い伝えが存在しています。

 出典ははっきりとしないのですが、経験上、名前の末尾に「1」とかが付けば重複していると判別し易かったり、特にほかのDCCツールを挟んで作業する場合では、トランスフォームノードとシェープノードの名称が不一致に成り易くなるみたいな感じなのかなぁと思ったりします。

 なので、コントローラ名も1,2,3,4ではなくA,B,C,Dを使って命名したい感じです。

普通に考えると、switch や if else を使って

{
    for($i=0; $i<6; $i++)
    {
        string $suf;
        switch($i)
        {
        case 0: $suf="A"; break;
        case 1: $suf="B"; break;
        case 2: $suf="C"; break;
        case 3: $suf="D"; break;
        case 4: $suf="E"; break;
        case 5: $suf="F"; break;
        }
        
    }
    print($i+": "+$suf+"\n");
    
}

 のように書くのを思いつくのですが、ちょっと長いですよね。
 splineIkの使用頻度は余り多くないとしても、この文字数を打ち込むのは大変です。使うか使わないか分からない E とか F を打つのも、なんだか不毛に感じたりして。

 もう少し無駄なく記述したいので知恵を絞ります。

 MELでは専用のコマンドは無いのですが、pythonには10進数を16進数に変換する hex() という関数があります。これを使えば A~F までは行けそうです。

 末尾を End にすれば7個分のクラスタまで対応できそう。

{
    int $size = 6;
    
    for($i = $size; -1 < $i; $i--)
    {
        string $suf;
        if($size != $i)
        {
            $suf = python("hex("+(10+$i)+")");
            $suf = toupper($suf);
            $suf = python("'"+$suf+"'.replace('0X','')");
            
        }
        else $suf ="End";
        
        print($i+":"+$suf+"\n");
        
    }

}

 これで splineIk の Number of span 1~4を汎用的に命名できます。

 2行目の $size には、本来 rigSetSplineIk.mel から戻ってくるリストを指定して、

    int $size = size($cluster);

のようにします。

 けれども ikHandleコマンドは、直接指定すれば Number of span に5以上も指定できて、クラスタも8個以上作成できてしまいます。

 そんな数値を指定することは早々ないとは思いますが、その時は素直にベタ書きするしかないでしょうかね・・・。



0 件のコメント:

コメントを投稿