2009年から仕事でMAYAを勉強。MAYAはデフォルトでは使い勝手が悪い。逆にスクリプトを覚えてカスタマイズするとかなり強力なツールになることがわかってきた。

物覚えが悪いので勉強したことはリマインダとしてココに書き留めるようにする。

2009年5月21日木曜日

【MEL】頂点ウェイトの値から端数を取る 2

とりあえずウェイト値をひっぱって丸め、頂点に書き戻すところまでのサンプルが完成

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
//ウェイト値を引っ張ってきて小数点以下1位までに丸める処理

{
$testval = `skinPercent -query -value skinCluster1 pCube1.vtx[6]`;

//ウェイトを”値”として操作するのに一時代入する変数を作る
float $wgtvalue;
//最後の1回の例外処理を回すための条件判断用変数
int $numloop = `size $testval`;
//最後の1回はこの値から今までの値を引き算して求める
float $wgtamount = 10; //小数点以下2位まで残すならここが100
//最後に書き戻す用配列
float $pointwgt[];
$count = 0;

for ( $val2 in $testval)
{
$numloop--;

//print $count;
if ( $numloop >0)
{
$wgtvalue = $val2;
//print ($wgtvalue + "\n");
$wgtvalue += 0.05; //小数点以下2位まで残すならここが0.005
$wgtvalue = $wgtvalue *10; //小数点以下2位まで残すならここが100
$wgtvalue = `floor $wgtvalue`;
//
$wgtamount = ($wgtamount - $wgtvalue);
//
$wgtvalue = $wgtvalue /10; //小数点以下2位まで残すならここが100 。ここの値が現在の頂点のウェイト値になる
$pointwgt[ $count ] = $wgtvalue;
print ("\n配列の中身"+ $count + "\n" + $pointwgt[ $count ] + "\n");
$count++;
}
else
{
// print ($wgtamount + "\n");
$wgtamount = $wgtamount /10;//小数点以下2位まで残すならここが100。ここの値が現在の頂点の最後のウェイト値になる
// print $wgtamount;
$pointwgt[ $count ] = $wgtamount;
print ("\n配列の中身"+ $count + "\n" + $pointwgt[ $count ] + "\n");
}
}

//チェックのため配列の中身を表示する
print "\n\n仮配列$pointwgtの中身\n";
print ($pointwgt[0] + "\n");
print ($pointwgt[1]+ "\n");
print ($pointwgt[2]+ "\n");
print "$pointwgtのサイズ\n";
print (`size $pointwgt`+ "\n\n");

//配列をウェイトに書き戻す処理

//とりあえず頂点6番の修正ウェイトを頂点0番に入れる
int $val;
$count2 = 0;
$count = 1;


for ( $val in $pointwgt )
{
$jname = "joint" + $count;
skinPercent -nrm false -tv $jname $pointwgt[$count2] skinCluster1 pCube1.vtx[0];
}

}

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
次は決め打ちにしているジョイントの名前や頂点の番号を、選択したものから変数でもってこないといけない。

頂点を1個選択すると
select -r pCube1.vtx[4] ;

と出るので頂点番号は問題なかろう。ウェイトがつけられているジョイントの名前は

skinPercent -query -t skinCluster1 pCube1.vtx[0];

-tオプションで取得可能なことを発見

頂点を選択して以下を実行するとその頂点と関連のあるジョイント名を$skintrans配列に格納してくれる。
{
$selectvtx = `ls -sl`;
string $skintrans[] = `skinPercent -query -t skinCluster1 $selectvtx`;
print $skintrans;
}


skinPercent -nrm false -tv joint1 0.5 skinCluster1 pCube1.vtx[0];

↑の joint1 は $skintrans で置き換え、pCube1.vtx[0] は $selectvtxで置き換える。



{
$selectvtx = `ls -sl`;
string $skintrans[] = `skinPercent -query -t skinCluster1 $selectvtx`;
skinPercent -nrm false -tv $skintrans 0.5 skinCluster1 $selectvtxl;
}

これで“選択中の頂点の、1番目のジョイントに紐付けられているウェイトが0.5に書き換わる”。

{
$selectvtx = `ls -sl`;
string $skintrans[] = `skinPercent -query -t skinCluster1 $selectvtx`;
$cnt = 0;
for ($val in $skintrans)
{
skinPercent -nrm false -tv $skintrans[ $cnt ] 0.5 skinCluster1 $selectvtx;
$cnt++;
}
}

こうすると選択頂点にウェイトつけられている全てのジョイントに対するウェイト値に0.5が格納される。
あとはこれを元のスクリプトに合体、0.5のところが配列からとってこれれば最初の段階クリア

★★★★★★★★★★★★★★ 完成 ★★★★★★★★★★★★★★★★★★★


//ウェイト値を引っ張ってきて小数点以下1位までに丸める処理

{

////////////////////////////////////////
//変数の宣言
////////////////////////////////////////

//現在選択されている頂点の名前を取得
$selectvtx = `ls -sl`;

//選択中頂点と関連付けられているジョイント名を配列で取得
string $skintrans[] = `skinPercent -query -t skinCluster1 $selectvtx`;

//ウェイトを”値”として操作するのに一時代入する変数を作る
float $wgtvalue;

//最後の1回の例外処理を回すための条件判断用変数
int $numloop = `size $testval`;

//最後の1回はこの値から今までの値を引き算して求める
float $wgtamount = 10; //小数点以下2位まで残すならここが100

//最後に書き戻す用配列
float $pointwgt[];

////////////////////////////////////////
//スクリプト本体
////////////////////////////////////////

//丸め処理

$count = 0;

for ( $val2 in $testval)
{
$numloop--;

if ( $numloop >0)
{
$wgtvalue = $val2;
$wgtvalue += 0.05; //小数点以下2位まで残すならここが0.005
$wgtvalue = $wgtvalue *10; //小数点以下2位まで残すならここが100
$wgtvalue = `floor $wgtvalue`;
//
$wgtamount = ($wgtamount - $wgtvalue);
//
$wgtvalue = $wgtvalue /10; //小数点以下2位まで残すならここが100 。ここの値が現在の頂点のウェイト値になる
$pointwgt[ $count ] = $wgtvalue;
//print ("\n配列の中身"+ $count + "\n" + $pointwgt[ $count ] + "\n");
$count++;
}
else
{
$wgtamount = $wgtamount /10;//小数点以下2位まで残すならここが100。ここの値が現在の頂点の最後のウェイト値になる
$pointwgt[ $count ] = $wgtamount;
print ("\n配列の中身"+ $count + "\n" + $pointwgt[ $count ] + "\n");
}
}

//丸めた値の配列をウェイトに書き戻す処理

$cnt = 0;
for ($val in $skintrans)
{
skinPercent -nrm false -tv $skintrans[ $cnt ] $pointwgt [ $cnt ] skinCluster1 $selectvtx;
$cnt++;
}

}






0 件のコメント: