2014年8月26日火曜日

ウエイト付け補助Tool (3)

ウエイト付け補助Toolの続き。
今回は、ポリゴンノード1で囲んだ範囲の、ポリゴンノード2の頂点を選択するところまで。
現在は、
①選択範囲を指定するポリゴンを選択
②トグルで頂点を選択したいポリゴンを選択
③mel起動
 …で使用します。

前回までに作成した部分はプロシージャにして使用しています。



これはこれだけで、「頂点を立体選択するTool」として使えそうです。
しかし、現状の仕様では、真正面向きに作成した立方体でしか範囲を指定できません。
範囲指定する立体が、少しナナメってたり、いびつな形状では、座標の正確な指定ができません。

最終目標が「ウエイト付け補助Tool」なので、モデルのいびつな形を指定するために、ユーザーは頂点を細かく移動して、範囲を指定したいはず。
てゆか、僕がそうしたい(=m=)。
今後は、範囲指定する立体がいびつな形でも頂点選択できるように改良したいです。

以下ソース

//-----------------------------
//プロシージャ;選択したポリゴンの座標を取得する
global proc vector [] getSelectedPosition()
{
//ソース元:http://www.not-enough.org/abe/manual/maya/mel-tips.html#getPosition

vector $POS_POSITION[];
float $val[];

string $sp[] = `ls -sl`;
string $pos[] = `filterExpand -sm 31 $sp`;
int $i = 0;
for($p in $pos)
{
$pv = `pointPosition $p`;
$val[0] = $pv[0];
$val[1] = $pv[1];
$val[2] = $pv[2];
$POS_POSITION[$i] = <<$val[0],$val[1],$val[2]>>;
//print $pv;
$i++;
}
return $POS_POSITION;
//ここまで、引用して修正
}
//-----------------------------
//プロシージャ;指定されたポリゴンの頂点座標をXYZごとにソートする
proc GET_POS_LIST (string $NODE_NAME,float $VAL_LIST_X[],float $VAL_LIST_Y[],float $VAL_LIST_Z[]){
//内部変数の定義
vector $TARGET_POS_VAL;
float $VAL_X;
float $VAL_Y;
float $VAL_Z;
vector $TARGET_POS[];

select -cl;
select ($NODE_NAME + ".vtx[*]");
$TARGET_POS = `getSelectedPosition`;

//座標をソートする
int $i = 0;
for($TARGET_POS_VAL in $TARGET_POS){
$VAL_X = $TARGET_POS_VAL.x;
$VAL_Y = $TARGET_POS_VAL.y;
$VAL_Z = $TARGET_POS_VAL.z;

$VAL_LIST_X[$i] = $VAL_X;
$VAL_LIST_Y[$i] = $VAL_Y;
$VAL_LIST_Z[$i] = $VAL_Z;
$i++; 
}
$VAL_LIST_X = `sort $VAL_LIST_X`;
$VAL_LIST_Y = `sort $VAL_LIST_Y`;
$VAL_LIST_Z = `sort $VAL_LIST_Z`;
}

//-----------------------------
//選択したポリゴンの頂点リストを取得する。
//--------------------------
//変数群の宣言
string $TAGET_NODE; 
string $NODE_LIST[];
string $NODE_NAME ;
string $TARGET_VTX_LIST[];
string $TARGET_VTX;
vector $TARGET_POS_VAL;

string $SELECT_VTX_LIST[];
vector $SELECT_POS[];

float $VAL_LIST_X[];
float $VAL_LIST_Y[];
float $VAL_LIST_Z[];

float $MIN_VAL_X;
float $MIN_VAL_Y;
float $MIN_VAL_Z;
float $MAX_VAL_X;
float $MAX_VAL_Y;
float $MAX_VAL_Z;
//--------------------------
clear $NODE_LIST;
clear $TARGET_VTX_LIST;
clear $SELECT_VTX_LIST;
clear $SELECT_POS;
clear $VAL_LIST_X;
clear $VAL_LIST_Y;
clear $VAL_LIST_Z;
//--------------------------
//選択したオブジェクトごとに処理実行
$NODE_LIST = `ls -sl`;
$NODE_NAME = $NODE_LIST[0];
$TARGET_NODE = $NODE_LIST[1];

  GET_POS_LIST($NODE_NAME,$VAL_LIST_X,$VAL_LIST_Y,$VAL_LIST_Z); //囲むポリゴンメッシュの座標リストの取得

//座標の最大値」・最小値を整理
$MIN_VAL_X =  $VAL_LIST_X[0];
$MAX_VAL_X =  $VAL_LIST_X[`size $VAL_LIST_X`-1];
$MIN_VAL_Y =  $VAL_LIST_Y[0];
$MAX_VAL_Y =  $VAL_LIST_Y[`size $VAL_LIST_Y`-1];
$MIN_VAL_Z =  $VAL_LIST_Z[0];
$MAX_VAL_Z =  $VAL_LIST_Z[`size $VAL_LIST_Z`-1];

print ($MIN_VAL_X + "," + $MAX_VAL_X + "\n");
print ($MIN_VAL_Y + "," + $MAX_VAL_Y + "\n");
print ($MIN_VAL_Z + "," + $MAX_VAL_Z + "\n");

//ターゲットメッシュの頂点から範囲内の頂点を抜き出す、
select ($TARGET_NODE + ".vtx[*]");
$TARGET_VTX_LIST = `ls -sl`;
$TARGET_VTX_LIST = `filterExpand -sm 31 $TARGET_VTX_LIST`;

int $i = 0;
for ($TARGET_VTX in $TARGET_VTX_LIST){
//print $TARGET_VTX;
$TARGET_POS_VAL = `pointPosition $TARGET_VTX`;

if($TARGET_POS_VAL.x >= $MIN_VAL_X && $TARGET_POS_VAL.x<= $MAX_VAL_X){
if($TARGET_POS_VAL.y >= $MIN_VAL_Y && $TARGET_POS_VAL.y <= $MAX_VAL_Y){
if($TARGET_POS_VAL.z >= $MIN_VAL_Z && $TARGET_POS_VAL.z <= $MAX_VAL_Z){
$SELECT_VTX_LIST[$i] = $TARGET_VTX;
$i++;
}

}
}

}

select -cl;

select $SELECT_VTX_LIST;
//おわり

0 件のコメント:

コメントを投稿