2014年8月31日日曜日

yjp_DetachBindShelf

これでデタッチするとバックアップオブジェが作られてウエイトがコピーされます。
バインドするシェルフが作られているので、
クリックするとフリーズとヒストリを消してバインドされ
バックアップオブジェからウエイトがコピーされます。
global proc yjp_DetachBindShelf()
{
    string $objs[] = `ls -sl`;
    if( size($objs) == 0 )return;

    string $sc = `findRelatedSkinCluster $objs[0]`;
    if( size($sc) == 0 )return;
 
//バックアップオブジェクト
    string $backupobj[] = `duplicate $objs[0]`;
    setAttr ($backupobj[0] + ".visibility") 0;
    setAttr -lock 0 ($backupobj[0] + ".tx");
    setAttr -lock 0 ($backupobj[0] + ".ty");
    setAttr -lock 0 ($backupobj[0] + ".tz");
    setAttr -lock 0 ($backupobj[0] + ".rx");
    setAttr -lock 0 ($backupobj[0] + ".ry");
    setAttr -lock 0 ($backupobj[0] + ".rz");
    setAttr -lock 0 ($backupobj[0] + ".sx");
    setAttr -lock 0 ($backupobj[0] + ".sy");
    setAttr -lock 0 ($backupobj[0] + ".sz");

string $jointlistname[] = `listConnections -type "joint" ($sc +".matrix")`;
    string $resStr = stringArrayToString($jointlistname, " ");
    int $maxInf = `getAttr ($sc + ".maxInfluences")`;
    currentTime 0 ;
 
//バックアップオブジェクトにウエイトコピー
string $yjpscname[] = `skinCluster -mi 1 -omi true -dr 4 -rui true -tsb $jointlistname $backupobj[0]`;

copySkinWeights -ss $sc -ds $yjpscname[0];
    //シェルフの処理
string $script = ("select " + $objs[0] + ";\nFreezeTransformations;\nDeleteHistory;\nstring $sc[] = `skinCluster -omi true -dr 4 -rui true -mi " + $maxInf + " -tsb " + $resStr + " " + $objs[0] + "`;\ncopySkinWeights -ss " + $yjpscname[0] + " -ds $sc[0];\ndelete " + $backupobj[0] + ";\n");
 
select -r $objs[0];
//ここに他のウエイトを保存する処理を追加しておくと便利

//デタッチ
DetachSkin;
 
    textToShelf ($objs[0], $script);
    return ;
}


一応、思いついたのができました。
setAttr -lockのところもうちょっと簡単にできないかな。

あとはシェルフ実行したら消したほうがいいが、消し方が分からない。

0 件のコメント:

コメントを投稿