バインドするシェルフが作られているので、
クリックするとフリーズとヒストリを消してバインドされ
バックアップオブジェからウエイトがコピーされます。
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 件のコメント:
コメントを投稿