Friday, January 9, 2026

Mayaで法線を編集する (2)

引き続き法線についてです。

前回、スムースシェーディングでローポリ感を軽減する話をしました。
こんな感じですね。

カクカクした見た目が…

スムースシェードでハイポリ風に。
ポリゴン数は同じです。

ところで、このローポリ球の一部のポリゴン数を増やしたらどうなるでしょうか?
赤道付近にエッジを足し、球の輪郭に沿うように少し膨らませます。




ポリゴン数を増やした部分が段差の様な見た目になってしまいました…。
加工前と後の法線を比較してみましょう。


加工部分の法線を延長してみると、球の中心からずれているのがわかります。


ずれている法線の角度を修正し、延長線が球の中心を通る様にすれば段差の様な見た目は解消されます。
今回は、任意のオブジェクトの方角に法線を傾けるMELを作成し修正してみました。
球の中心に別のオブジェクト(ロケータ)を配置し、とりあえず全部の法線に対して実行。


段差状に見えていた箇所がきれいになりました。

普通ならガタつくこの様な形状も滑らかに出来ます。


MELはこちらです。次回も法線の話です。

//------------------
//------------------
global proc NKJ_AimSelectedVtxsNormalsToSelectedObj()
{
//選択しているバーテックスの法線の角度を、根本側が
//別のオブジェクトの方向を正しく向く様に修正します。
//(つまり、法線の根本方向の延長線上に、焦点となる
//オブジェクトが存在する様になります。)

//使用方法:
//1)このスクリプトを実行します。ダイアログが出ます。
//2)法線角度を修正したいオブジェクトの回転をリセットします。
//3)法線角度を修正したいバーテックスを全て選択します。
//4)焦点にしたい別のオブジェクトをOutlinerで追加選択します。
//5)ダイアログのボタンをクリックすると処理が行われます。

//------------------
//現在の選択からバーテックスリストを取得
string $vtxList[] = `ls -sl -fl -l -typ "float3"`;
//現在の選択からエイム対象オブジェクト(transform)を取得
string $locatorList[] = `ls -sl -l -typ "transform"`;
//ロケータの座標を取得
float $locatorPos[] = `xform -q -a -ws -t $locatorList[0]`;
//選択解除
select -cl;
//各バーテックスに対してループ処理
string $item;
for($item in $vtxList)
{
//バーテックスの座標を取得
float $vtxPos[] = `xform -q -a -ws -t $item`;
//法線として使う値を計算
float $x = $vtxPos[0] - $locatorPos[0];
float $y = $vtxPos[1] - $locatorPos[1];
float $z = $vtxPos[2] - $locatorPos[2];
//正規化
vector $normal = <<$x,$y,$z>>;
$normal = `unit $normal`;
//法線を設定
polyNormalPerVertex -xyz ($normal.x) ($normal.y) ($normal.z) $item;
}
}
//------------------
//メイン
{
string $title = "NKJ_AimNormalsToObj";
string $titleUI = $title + "_UI";
if(`window -ex $titleUI` == 1)
{
deleteUI $titleUI;
}
window -t $title $titleUI;
columnLayout "cLayout";

text -l $title;
text -l "--------------------";
text -l "This aims selected vertices normals";
text -l "roots to another object.";
text -l "1)Reset object rotations.";
text -l "1)Select vertices you want to edit.";
text -l "2)Add-select another object";
text -l "in Outliner.";
text -l "3)Click a button below.";
text -l "--------------------";
button -w 200 -c NKJ_AimSelectedVtxsNormalsToSelectedObj "Aim";
window -e -w 210 -h 140 $titleUI;
showWindow $titleUI;
}
//-------------------------------------------------------
//終了

No comments: