やっといい感じになった。
頂点の距離が近い、法線が似ている頂点が取得できたと思う
配列順が同じなのでいろんなMELで使いやすい。
左右反転も考慮しています。
スナップやシンメトリに使えると思う。
しきい値入力の必要が無いのもいいかと。
//yjp_pMatchPointArray(Aメッシュの頂点配列,Bメッシュ頂点配列)
//Aメッシュの頂点リストとBメッシュの頂点リストを比べて
//Aメッシュの頂点リストと同じ座標の頂点をBメッシュから探して
//Aメッシュの頂点配列と同じ順にする
proc vector yjp_positionVector(string $node,int $Invers)
{
float $pos[];
int $i[];
if ($Invers == 0){$i[0] = -1;$i[1] = 1;$i[2] = 1;}
if ($Invers == 1){$i[0] = 1;$i[1] = 1;$i[2] = 1;}
if ($Invers == 2){$i[0] = 1;$i[1] = -1;$i[2] = 1;}
if ($Invers == 3){$i[0] = 1;$i[1] = 1;$i[2] = -1;}
$pos = `pointPosition $node`;
vector $vec = <<($pos[0] * $i[0]),($pos[1] * $i[1]),($pos[2] * $i[2])>>;
return $vec;
}
proc int yjp_pMatchSwapArrayAC(float $VecAngle , int $on)
{
int $c = 0;
if($on == 1)
{
if($VecAngle < 45)
{
$c = 1;
}
}
else if($on == 0)
{
$c = 1;
}
return $c;
}
global proc string[] yjp_pMatchSwapArray(string $PointGroupA[], string $PointGroupB[],int $x,int $Overlap,int $normal)
{
//$PointGroupAターゲット
//$PointGroupB処理させたい頂点
//$x 左右反転
//$Overlap 配列順を変える$PointGroupAがPointGroupBより多い場合頂点が重複してもOK
//
int $n,$m,$linknum, $index_n,$Inversindex;
string $Point[],$usePoint[];
vector $xyzA,$xyzB,$xyzC;
vector $PointGroupBVec;
vector $PointGroupAVec;
float $posA[3],$posB[3];
float $dis;
float $Length[],$Lengthsort[];
float $Average;
float $InversLength[],$InversLengthsort[];
float $VecAngle;
int $amount = 0;
float $startTime = `timerX`;
progressWindow
-t "Compare vertex ..."
-pr $amount
-st "Search: ..."
-ii 0;
//頂点と頂点が一番近い頂点の組み合わせ
////頂点が近い場合でも違う場合がある
////法線の角度が45度以内であれば似ている頂点とする
////
clear $Point;
clear $usePoint;
for ($n=0;$n<size($PointGroupB);$n++)
{
clear $Length;
clear $Lengthsort;
clear $InversLength;
clear $InversLengthsort;
//隣接する頂点の座標(未使用)
//$posAlink = `yjp_PointConnectedPosVector $PointGroupB[$n] $x`;
$xyzA = `yjp_positionVector $PointGroupB[$n] $x`;
//法線
$PointGroupBVec = `yjp_VertexAverageVector $PointGroupB[$n]`;
$PointGroupBVec = <<($PointGroupBVec.x*$x),($PointGroupBVec.y),($PointGroupBVec.z)>>;
//print ("PointGroupB " + $PointGroupB[$n] +"\n");
for ($m=0;$m<size($PointGroupA);$m++)
{
$xyzB = `yjp_positionVector $PointGroupA[$m] 1`;
$dis = abs(mag($xyzA-$xyzB));
$Length[$m] = $dis;
$Average += $Length[$m];
//print ($PointGroupA[$m] + " dis "+$dis +"\n");
}
$Average = $Average/size($PointGroupA)*1.5;
//print ("LengthAverage " + $Average +"\n");
//$PointGroupAの最小距離でソート
$Lengthsort = `sort $Length`;
//string $up;
//for($up in $Lengthsort){print ($up +"\n");}
int $num = size($Lengthsort);
if($num > 32)
{
$num = 8;
}
for ($m=0;$m<$num;$m++)
{
$index_n = `floatArrayFind $Lengthsort[$m] 0 $Length`;
$xyzB = `yjp_positionVector $PointGroupA[$index_n] 1`;
//print ("Length " + $Lengthsort[$m] + " " + $PointGroupA[$index_n] +"\n");
$PointGroupAVec = `yjp_VertexAverageVector $PointGroupA[$index_n]`;
$PointGroupAVec = <<($PointGroupAVec.x*$x),($PointGroupAVec.y),($PointGroupAVec.z)>>;
$VecAngle = rad_to_deg(`angle $PointGroupAVec $PointGroupBVec`);
//print ($PointGroupA[$index_n] + " Angle " + $VecAngle + "\n");
if(stringArrayCount($PointGroupA[$index_n],$usePoint) > 0 && $Overlap == 0)
{
$Point[$amount] = "none";
//print ("use " +$PointGroupA[$index_n] +"\n");
continue;
}
$dis = abs(mag($xyzA-$xyzB));
//print ("kyori " + $dis +"\n");
if($Average < $dis)
{
$Point[$amount] = "none";
//print ("Long " +$PointGroupA[$index_n] +"\n");
continue;
}
else if(`yjp_pMatchSwapArrayAC $VecAngle $normal`)
{
if($Overlap == 1)
{
$Point[$amount] = $PointGroupA[$index_n];
break;
}
//法線を比較して45度以内かチェック
for ($linknum=0;$linknum<size($PointGroupB);$linknum++)
{
$xyzC = `yjp_positionVector $PointGroupB[$linknum] $x`;
$dis = abs(mag($xyzB-$xyzC));
$InversLength[$linknum] = $dis;
}
$InversLengthsort = `sort $InversLength`;
$Inversindex = `floatArrayFind $InversLengthsort[0] 0 $InversLength`;
//print ("InversCheck " + $PointGroupB[$n] + " "+ $PointGroupB[$Inversindex] +"\n");
if($PointGroupB[$n] == $PointGroupB[$Inversindex])
{
//print ("OK " +"\n");
$Point[$amount] = $PointGroupA[$index_n];
$usePoint[size($usePoint)] = $PointGroupA[$index_n];
break;
}
else
{
$Point[$amount] ="none";
}
}
}
print ("PointGroupB " + $PointGroupB[$n] + " PointGroupA " + $Point[$amount] +"\n\n");
$amount += 1;
progressWindow -edit -max (size($PointGroupB)) -pr $amount -st ("Compare vertex: " + $PointGroupB[$n]);
}
progressWindow -ep;
float $totalTime = `timerX -startTime $startTime`;
print("Execution time: " + $totalTime + " seconds.\n");
clear $usePoint;
clear $Length;
clear $Lengthsort;
clear $InversLength;
clear $InversLengthsort;
return ($Point);
}
0 件のコメント:
コメントを投稿