最小二乗法を用いて頂点群を最も近い直線に近似して整列させるMELスクリプトです。スナップなどではある軸に平行にするような整列はできますが、任意の1次関数直線には整列できないので、斜めなどの頂点群をもっともらしい直線に沿って整列したいときに有効です。
I made a MEL script to align verteces along with the slanting straight line by least squares method. This script makes sence when you ailgn slanting vertices.
global proc alignLinear(int $axis1, int $axis2){
string $sels[] = `ls -sl`;
string $targets[] = `filterExpand -sm 31 $sels`;
float $n = size($targets);
float $a, $b;
float $y, $pos[];
float $sum_x, $sum_y, $sum_xy, $sum_xx;
$sum_x = $sum_y = $sum_xy = $sum_xx = 0.0;
for($target in $targets){
$pos = `xform -q -ws -t $target`;
$sum_x += $pos[$axis1];
$sum_y += $pos[$axis2];
$sum_xy += $pos[$axis1]*$pos[$axis2];
$sum_xx += $pos[$axis1]*$pos[$axis1];
}
$a=($n*$sum_xy-$sum_x*$sum_y)
/($n*$sum_xx - $sum_x*$sum_x);
$b=($sum_xx*$sum_y-$sum_xy*$sum_x)
/($n*$sum_xx - $sum_x*$sum_x);
for($target in $targets){
$pos = `xform -q -ws -t $target`;
$pos[$axis2] = $a*$pos[$axis1] + $b;
xform -ws -t $pos[0] $pos[1] $pos[2] $target;
}
}
Example
alignLinear(0, 1);
alignLinear(0, 2);
最小二乗法についてはこちらのサイトがわかりやすかったです。
http://szksrv.isc.chubu.ac.jp/lms/lms1.html