MAYAにはXYZの値を指定して法線を設定する事ができる
Set Vertex Normal
があります。
XYZの欄に数値を入力して[Apply]すれば選択した頂点の法線方向を変更できるのですが、数値が角度ではないので、何の数値を入力したら良いのか解りにくいですよね。
X value
Y value
Z value
は何の数値なのでしょうか?
Set Vertex Normal
Mesh Display > Set Vertex Normal


法線の向きを指定する XYZvalueの数値の意味
法線の向きを指定するXYZを端的に説明すると
XYZの数値:向きをもった量
説明しやすいようにXYZの三方向ではなくX方向とY方向だけで説明します。
X方向に0 Y方向に1 を入力して選択した頂点の法線の向きを設定します。

[Apply]で実行すると当然Y方向に法線が向きました。
Xは0なので方向も量もありません。
Yは1なのでY方向に最大の量で向いてます。

Y :1.0
今度は X方向は0 Y方向に0.5を入れます。

法線はY方向を向きました。先程と変わりません。
Xは0で先ほどと変わりません。
Yは0.5で先程の半分の量しかY方向を向いてませんが、Xが0なので結果的にY方向を向きます。

Y :0.5
今度は XとYに同じ数値を入れてみます。
Xに0.5 Yに0.5

結果は 斜め45度 の方向を向きました。
X方向とY方向が同じ量なので、XとYがつり合う中間の方向に法線が向きました。

Y :0.5
同じ量の数値ならば同じ結果になるはずなので、XとYの数値を変えてみます。
Xに0.7 Yに0.7

結果は先程同じく斜め45度に法線が向きました。

Y :0.7
それぞれの向きの量の力関係で方向が決まる事が確認できました。
今度はXとYの数値を別の値にしてみます。
Xに0.26 Yに0.96

結果は斜め15度ぐらいの方向を向きました。
Xの量よりもYの量の方が大きいのでY方向に多く向いてます。

Y:0.96
法線の数値をMELスクリプトで取得
MAYAで頂点の法線ベクトルを取得するには
polyNormalPerVertex
を使います。
バーテックス(頂点)を選択して以下のMELスクリプトを実行すると

MEL:
polyNormalPerVertex -q -xyz;
結果:
選択したバーテックス(頂点)に含まれるバーテックスフェースの法線の値がすべて返されます。
バーテックスフェースがまとまっている場合は(ソフトエッジや同一平面上のハードエッジ)法線の値は全て同じなので、返された値の 0番目 1番目 2番目の値がバーテックス(頂点)の法線値とみなされます。
MEL:
vector $normal_vect;
float $normal_vector_xyz[] = `polyNormalPerVertex -q -xyz`;
$normal_vect = <<$normal_vector_xyz[0],$normal_vector_xyz[1],$normal_vector_xyz[2] >>;
print $normal_vect;
結果:
MELにはベクトル型 vector があるので返された値から0番目 1番目 2番目の値をvector型の変数に代入しました。
この値をSet Vertex Normal のXYZvalueに入力して[Apply]すれば、他の頂点も同じ方向を向くはずです。
XYZvalueに取得した値を入力。

周りの頂点を選択。 [Apply]をクリック

値を取得した頂点の法線と、同じ向きを他の法線も向きました。

![]() |
|
回転の角度を指定して法線の向きを取得するMELスクリプト
MELはベクトル型の vector があります。
vector を使って 回転の角度を指定して方向を出力 できます。
ベクトルの方向を出力する記述は
rot vector元の向き vector軸 ラジアン角度
で出力できます。

MEL:
vector $vertex_normal = <<0,1,0>>;
vector $axis = <<0,0,1>>;
float $rotate = 45.0;
float $rad = deg_to_rad($rotate);
vector $vector_normal = `rot $vertex_normal $axis $rad`;
print $vector_normal;
Y<<0,1,0>>を向いた法線をZ<<0,0,1>>を軸に45度回転させた方向の値を出力します。
結果:
出力された値をSet Vertex Normal に入力して実行します。

45度傾いた方向を向きました。

Z正面から確認

最後にXYZ3方向の数値を入れて法線の角度を設定します。

選択した頂点法線のベクトルを取得します
MEL:
vector $normal_vect;
float $normal_vector_xyz[] = `polyNormalPerVertex -q -xyz`;
$normal_vect = <<$normal_vector_xyz[0],$normal_vector_xyz[1],$normal_vector_xyz[2] >>;
print $normal_vect;
結果:
取得した値をvector元の向き$vertex_normalに設定します。
MEL:
vector $vertex_normal = <<-0.146447, 0.853553, 0.5>>;
vector $axis = <<1,0,0>>;
float $rotate = -72.0;
float $rad = deg_to_rad($rotate);
vector $vector_normal = `rot $vertex_normal $axis $rad`;
print $vector_normal;
<<-0.146447, 0.853553, 0.5>>を向いた法線をX<<1,0,0>>を軸に-72度回転させた方向の値を出力します。
結果:
出力された値をSet Vertex Normal に入力して実行します。

実行:

![]() |
|
二本の法線間の角度を取得する
違う方向を向いている二本の法線間の角度は
angle vector法線1の向き vector法線2の向き;
で取得できます。

MEL:
vector $vertex_normal_1= <<0, 1, 0>>;
vector $vertex_normal_2= <<0.472317, 0.878684, 0.0695039 >>;
float $rad_normal = `angle $vertex_normal_1 $vertex_normal_2`;
float $deg_normal = rad_to_deg($rad_normal );
print $deg_normal;
解説:
float $rad_normal = `angle $vertex_normal_1 $vertex_normal_2`;
$vertex_normal_1と$vertex_normal_2の法線の間の角度をラジアン単位で取得します。
float $deg_normal = rad_to_deg($rad_normal );
ラジアン単位から角度に変換します。
結果:
二本の法線間の角度が取得できました。
XYZそれぞれの角度ではなく、あくまでも二本の法線の間の角度です。
以上です。
![]() |
|
豊富なカスタマイズメニューで、あなた好みの1台が購入できます。
人気の秘密は何と言ってもコスパの高さ。
最新のCPU・GPUパーツを搭載したモデルを驚きの価格で提供。
山口県の自社工場で組み立てられ徹底した試験・検査後に出荷。
無償修理サービスもありサポート体制も安心。
コスパに徹底的にこだわる方は公式サイトへ >> 【FRONTIER】

![]() |
|
![]() |
|
BTOパソコンの草分け的ブランドFRONTIER(フロンティア) 3DCG/動画編集/ゲーム用途に合わせてCPUやGPUなどパーツを自由に選べてコスパにもこだわる方にオススメ。 |
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
|