反転座標で取得は簡単。
補助ジョイントが同じ位置に2個ある場合はどちらか分からない。
これを区別するには
ラベルに法則性を含める。
準備が要るのであればGUIで指定する方法もいいかもしれない。
とりあえずラベルはアトリビュートで入力することにした。
以下は対称のジョイントを探すプロシージャです
//yjp_jontMirrorArray(ジョイントの配列)
proc vector yjp_jointposVector(string $node,int $Invers[])
{
float $pos[];
$pos = `xform -q -a -ws -t $node`;
vector $vec = <<($pos[0] * $Invers[0]),($pos[1] * $Invers[1]),($pos[2] * $Invers[2])>>;
return $vec;
}
global proc string[] yjp_jontMirrorArray(string $JointGroupA[])
{
//$JointGroupターゲット
int $n,$m, $index_n;
string $mJoint[],$useJoint[];
vector $xyzA,$xyzB;
float $dis;
float $Length[],$Lengthsort[];
float $Average;
float $VecAngle;
string $label;
int $Default[] = {1,1,1};
int $Invers[] = {-1,1,1};
int $amount = 0;
float $startTime = `timerX`;
progressWindow
-t "Compare vertex ..."
-pr $amount
-st "Search: ..."
-ii 0;
//頂点と頂点が一番近い頂点の組み合わせ
////頂点が近い場合でも違う場合がある
////法線の角度が45度以内であれば似ている頂点とする
////
clear $mJoint;
clear $useJoint;
string $root = `rootOf $JointGroupA[0]`;
string $JointGroupB[] = `listRelatives -ad -type "joint" $root`;
for ($n=0;$n<size($JointGroupA);$n++)
{
clear $Length;
clear $Lengthsort;
$xyzA = `yjp_jointposVector $JointGroupA[$n] $Invers`;
//print ("JointGroup " + $JointGroupB[$n] +"\n");
for ($m=0;$m<size($JointGroupB);$m++)
{
$xyzB = `yjp_jointposVector $JointGroupB[$m] $Default`;
$dis = abs(mag($xyzA-$xyzB));
$Length[$m] = $dis;
$Average += $Length[$m];
//print ($JointGroupB[$m] + " dis "+$dis +"\n");
}
//$Average = $Average/size($JointGroupB);
$Average = 0.5;
//print ("LengthAverage " + $Average +"\n");
//$JointGroupの最小距離でソート
$Lengthsort = `sort $Length`;
//string $up;
//for($up in $Lengthsort){print ($up +"\n");}
int $num = size($Lengthsort);
if($num > 32)
{
$num = 16;
}
int $next_index = 0;
for ($m=0;$m<$num;$m++)
{
$index_n = `floatArrayFind $Lengthsort[$m] $next_index $Length`;
if ($index_n == -1)
{
$mJoint[$amount] = $JointGroupA[$n];
continue;
}
$next_index = $index_n +1;
$xyzB = `yjp_jointposVector $JointGroupB[$index_n] $Default`;
print ("Length " + $Lengthsort[$m] + " " + $JointGroupB[$index_n] +"\n");
if(stringArrayCount($JointGroupB[$index_n],$useJoint) > 0)
{
$mJoint[$amount] = $JointGroupA[$n];
//print ("use " +$JointGroupB[$index_n] +"\n");
continue;
}
$dis = abs(mag($xyzA-$xyzB));
//print ($JointGroupB[$index_n] + " kyori " + $dis +"\n");
if($Average < $dis)
{
$mJoint[$amount] = $JointGroupA[$n];
//print ("Long " +$JointGroupB[$index_n] +"\n");
continue;
}
$labelA = `getAttr ($JointGroupA[$n] + ".otherType")`;
$labelB = `getAttr ($JointGroupB[$index_n] + ".otherType")`;
if(`getAttr ($JointGroupA[$n] + ".type")` == `getAttr ($JointGroupB[$index_n] + ".type")`)
{
if($labelA == $labelB)
{
$mJoint[$amount] = $JointGroupB[$index_n];
$useJoint[size($useJoint)] = $JointGroupB[$index_n];
//print ("useJointB " + $JointGroupB[$index_n] + "\n") ;
break;
}
}
}
print ("JointGroup " + $JointGroupA[$n] + " " + $mJoint[$amount] +"\n");
$amount += 1;
progressWindow -edit -max (size($JointGroupA)) -pr $amount -st ("Compare vertex: " + $JointGroupA[$n]);
}
progressWindow -ep;
float $totalTime = `timerX -startTime $startTime`;
print("Execution time: " + $totalTime + " seconds.\n");
clear $useJoint;
clear $Length;
clear $Lengthsort;
return ($mJoint);
}
0 件のコメント:
コメントを投稿