liquidjumper MAYA,MEL MAYA 法線の向きを指定するSet Vertex Normalの解説「XYZ」は何の値?

MAYA 法線の向きを指定するSet Vertex Normalの解説「XYZ」は何の値?

maya_setvertexnormal_xyz_topimage

MAYAにはXYZの値を指定して法線を設定する事ができる

Set Vertex Normal

があります。

XYZの欄に数値を入力して[Apply]すれば選択した頂点の法線方向を変更できるのですが、数値が角度ではないので、何の数値を入力したら良いのか解りにくいですよね。

X value 
Y value
Z value

は何の数値なのでしょうか?


Set Vertex Normal

Mesh Display > Set Vertex Normal

select_setvertexnormal
setvertexnormal

法線の向きを指定する XYZvalueの数値の意味

法線の向きを指定するXYZを端的に説明すると

XYZの数値:向きをもった量

説明しやすいようにXYZの三方向ではなくX方向とY方向だけで説明します。

X方向に0 Y方向に1 を入力して選択した頂点の法線の向きを設定します。

setvertexnormal_xy_010


[Apply]で実行すると当然Y方向に法線が向きました。

Xは0なので方向も量もありません。
Yは1なのでY方向に最大の量で向いてます。

vertexNormal010
X :0.0
Y :1.0


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

setvertexnormal_xyz_0050

法線はY方向を向きました。先程と変わりません。


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

vertexNormal0050
X :0.0
Y :0.5


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

Xに0.5 Yに0.5 

setvertexnormal_xyz0505


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

vertexNormal05050
X :0.5
Y :0.5


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

Xに0.7 Yに0.7

setvertexnormal_xyz0707


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

vertexNormal07070
X :0.7
Y :0.7


それぞれの向きの量の力関係で方向が決まる事が確認できました。

今度はXとYの数値を別の値にしてみます。

Xに0.26 Yに0.96

setvertexnormal_xyz2696


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

vertexNormal26960
X:0.26
Y:0.96

法線の数値をMELスクリプトで取得

MAYAで頂点の法線ベクトルを取得するには

polyNormalPerVertex

を使います。

バーテックス(頂点)を選択して以下のMELスクリプトを実行すると

select_polyNormalPerVertex


MEL:

polyNormalPerVertex -q -xyz;


結果:

// Result: 0.115063 0.494074 0.861772 0.115063 0.494074 0.861772 0.115063 0.494074 0.861772 0.115063 0.494074 0.861772 //

選択したバーテックス(頂点)に含まれるバーテックスフェースの法線の値がすべて返されます。

バーテックスフェースがまとまっている場合は(ソフトエッジや同一平面上のハードエッジ)法線の値は全て同じなので、返された値の 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;


結果:

0.732878 0.643734 0.220219

MELにはベクトル型 vector があるので返された値から0番目 1番目 2番目の値をvector型の変数に代入しました。

この値をSet Vertex Normal のXYZvalueに入力して[Apply]すれば、他の頂点も同じ方向を向くはずです。

XYZvalueに取得した値を入力。

setvertexnormal_xyz736422


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

selects_polyNormalPerVertex


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

setnormal_polyNormalPerVertex

回転の角度を指定して法線の向きを取得するMELスクリプト

MELはベクトル型の vector があります。

vector を使って 回転の角度を指定して方向を出力 できます。


ベクトルの方向を出力する記述は

rot vector元の向き vector軸 ラジアン角度

で出力できます。

rot vector image


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度回転させた方向の値を出力します。


結果:

-0.707107 0.707107 0


出力された値をSet Vertex Normal に入力して実行します。

setvertexnormal_xyz-0707


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

rot 45


Z正面から確認

rot 45 zcamera



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

xyz vt selected


選択した頂点法線のベクトルを取得します

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;


結果:

-0.146447 0.853553 0.5


取得した値を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度回転させた方向の値を出力します。


結果:

-0.146447 0.739291 -0.657269


出力された値をSet Vertex Normal に入力して実行します。

setvertexnormal_xyz-0107-06


実行:

rot_setvertexnormal_xyz

二本の法線間の角度を取得する

違う方向を向いている二本の法線間の角度は

angle vector法線1の向き vector法線2の向き;

で取得できます。

angle_setvertexnormal_xyz image


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 );

ラジアン単位から角度に変換します。

結果:

28.515965

二本の法線間の角度が取得できました。
XYZそれぞれの角度ではなく、あくまでも二本の法線の間の角度です。


以上です。



 最新のゲーミングPCが安く手に入れられる「 FRONTIER 」

 豊富なカスタマイズメニューで、あなた好みの1台が購入できます。

 人気の秘密は何と言ってもコスパの高さ。
 最新のCPU・GPUパーツを搭載したモデルを驚きの価格で提供。

 山口県の自社工場で組み立てられ徹底した試験・検査後に出荷。
 無償修理サービスもありサポート体制も安心。

 コスパに徹底的にこだわる方は公式サイトへ >> 【FRONTIER】





𝕏 ( 旧Twitter ) Facebook Pocket LINE はてブ

おすすめの関連記事



あわせてよく読まれている記事