完成したyjp_pMatchSwapArrayを使って、VertexSnapを改造
ターゲット頂点群と移動させる頂点群を指定するので距離指定は消しました。
法線方向が似ている近い頂点同士がくっつきます。
法線チェックはオンオフできるようにした。
一定以上離れている頂点は無視しています。
ついでにスナップした頂点同士の法線をアベレージできるようにしました。
今後はスキンクラスタがあれば中間オブジェクトを編集するとか
ウエイトもコピーするとか考え中
global proc do_VertexSnap()
{
string $sel[] = `ls -sl -fl`;
if(size($sel)<2)
{
warning("オブジェクトや頂点を二つ選択してください ");
return ;
}
string $SingleData,$TotalVertex[],$VertexGroup[];
float $x,$y,$z;
//float $AverageValue = `floatField -q -v vsThresholdField`;
int $nmc = `checkBox -q -v vsNormalMatcheCheck`;
int $ntc = `checkBox -q -v vsNormalTuningCheck`;
if(!`gmatch $sel[0] "*.vtx*"`)
{
for($SingleData in $sel)
{
if(`checkBox -q -v vsBoEdgeCheck`)
{
select $SingleData;
polySelectConstraint -t 0x0001 -w 1 -bo 1 -m 3;
$VertexGroup = `ls -sl -fl`;
$TotalVertex = stringArrayCatenate ($TotalVertex,$VertexGroup);
}
else
{
$VertexGroup = `ls -fl ($SingleData + ".vtx[*]")`;
$TotalVertex = stringArrayCatenate ($TotalVertex,$VertexGroup);
}
}
resetPolySelectConstraint;
}
else
{
$TotalVertex = $sel;
}
string $buffer[],$Vertex[],$VertexGroupA[],$VertexGroupB[],$VertexGroupC[],$VertexGroupD[];
tokenize $TotalVertex[size($TotalVertex)-1] "." $buffer;
int $n;
float $v[],$t[];
for ($n=0;$n<size($TotalVertex);$n++)
{
//print ("TotalVertex " + $TotalVertex[$n] +"\n");
tokenize $TotalVertex[$n] "." $Vertex;
if($buffer[0] == $Vertex[0])
{
//print ("GroupA " + $TotalVertex[$n] +"\n");
$VertexGroupA[size($VertexGroupA)] = $TotalVertex[$n];
}
else
{
//print ("GroupB " + $TotalVertex[$n] +"\n");
$VertexGroupB[size($VertexGroupB)] = $TotalVertex[$n];
}
}
$VertexGroupC = `yjp_pMatchSwapArray $VertexGroupA $VertexGroupB 1 0 $nmc`;
for($n=0;$n<size($VertexGroupB);$n++)
{
if(!`objExists $VertexGroupC[$n]`)
{
continue;
}
//print ("GroupB " +$VertexGroupB[$n]);
$t = `pointPosition $VertexGroupB[$n]`;
//print (" " + $t[0] + $t[1] + $t[2] +"\n");
//print ("GroupC " +$VertexGroupC[$n]);
$v = `pointPosition $VertexGroupC[$n]`;
//print ("GroupC " + $v[0] + $v[1] + $v[2] +"\n");
$VertexGroupD[size($VertexGroupD)] = $VertexGroupB[$n];
$VertexGroupD[size($VertexGroupD)] = $VertexGroupC[$n];
if(`checkBox -q -v vsAverageCheck`)
{
$x = ($v[0] + $t[0]) / 2 ;
$y = ($v[1] + $t[1]) / 2 ;
$z = ($v[2] + $t[2]) / 2 ;
move -a -wd $x $y $z $VertexGroupB[$n];
move -a -wd $x $y $z $VertexGroupC[$n];
}
else
{
move -a -wd $v[0] $v[1] $v[2] $VertexGroupB[$n];
}
}
if($ntc)
{
select -r $VertexGroupD;
if(size(`ls -sl`)>0)
{
print ("NormalTuning" +"\n");
polyAverageNormal;
}
}
}
global proc yjp_VertexSnap()
{
if(`window -q -ex yjp_VertexSnapwin`)
{
deleteUI yjp_VertexSnapwin ;
}
window -wh 140 120 -tb 1 -tlb 0 -t "VertexSnap1.1" yjp_VertexSnapwin ;
columnLayout -w 130;
checkBox -l "NormalMatche" -ann "法線が似ている頂点をスナップ" -v 1 vsNormalMatcheCheck;
checkBox -l "SnapAverage" -ann "二点の中間でスナップ"-v 1 vsAverageCheck;
checkBox -l "BorderEdge" -ann "ボーダーエッジのみスナップ" -v 1 vsBoEdgeCheck;
checkBox -l "NormalTuning" -ann "スナップした法線の同調" -v 1 vsNormalTuningCheck;
//floatField -w 95 -h 22 -v 0.1 vsThresholdField;
button -w 130 -h 25 -l "Apply" -ann "最後に選択したオブジェクトや頂点にスナップ" -c do_VertexSnap ;
button -w 130 -h 25 -l "Close" -c ("deleteUI -window yjp_VertexSnapwin") ;
setParent..;
showWindow yjp_VertexSnapwin ;
window -e -wh 140 120 yjp_VertexSnapwin ;
}
0 件のコメント:
コメントを投稿