Utility ノード
Utility ノードとは
Utility ノードはシェーダーの機能を拡張することができます。
- General Utilities
- マッピング、算術演算など
- Color Utilities
- 色に関するもの
- Switch Utilities
- 同じシェーダーで、オブジェクトごとに一部のアトリビュートだけ変化させたい場合に使用
Sampler Info とは
Sampler Info ノードによって、
サンプリング点(カメラからの視点がオブジェクトにあたる点)についての、
さまざまな情報を得ることができます。
- Facing Ratio (0.0 〜 1.0)
- サンプリング点からカメラへのベクトルと、法線ベクトルの内積を計算したもの。
カメラへの向きと、法線がどれくらいの角度をなしているかがわかります。
1.0 で向きが同じ、0.0 で角度が 90 度になります。
Sampler Info の使用例 1
Sampler Info を作成して、色々な実験をしてみましょう。
ここでは、Sampler Info の他に以下のノードを使ってみます。
- Reverse
- 入力(0.0 〜 1.0)の値を逆転(1.0 〜 0.0)させます。
- Remap Value
- 入力を別の値にマッピングします。
ramp に似ています。
- Blender Colors
- 2 つの色を混ぜ合わせます。
- 球と平面で適当にシーンを作成します。
わかりやすくするために、平面にテクスチャーをアサインしておきます。
- Blinn マテリアルを作成し、球にアサインしておきます。
- Sampler Info ノードを作成します。
Hypershade → Create Maya Nodes → General Utilities → Sampler Info
から Sampler Info ノードを作成します。
- Sampler Info ノードの Facing Ratio と Blinn ノードの
transparencyR, transparencyG, transparencyB をコネクトします。
- レンダリングするとカメラと同じ向きの部分が透明に、
垂直な部分が不透明になっているのがわかります。
- transparency と同じように、
Sampler Info の Facing Ratio を球の incandenscence にコネクトしてみます。
球の真ん中が白くなって透明になりません。
- 修正するために incandenscence へのコネクトをはずします。
- Reverse ノードを作成します。
Hypershade → Create Maya Nodes → General Utilities → Reverse
- Sampler Info の Facing Ratio を Reverse ノードの input にコネクトします。
- Reverse ノードの output を球の incandenscence にコネクトします。
- レンダリングをすると、今度は真ん中が透明になっています。
- 次に、色を変更できるようにしてみましょう。
そのために、Reverse ノードを削除し、Blend Colors ノードを作成します。
- Sampler Info の Facing Ratio を Blender Colors ノードの Blender にコネクトします。
- Blender Colors ノードの Blender を球の incandenscence にコネクトします。
- Blender Colors ノードのアトリビュート Color1, Color2 を変更すると色を変えることができます。
- しかし、このままでは incandenscence の範囲を調節することができません。
ということで、Remap Value ノードを作成します。
Hypershade → Create Maya Nodes → Colors Utilities → Remap Value
- Sampler Info の Facing Ratio を Remap Value の Input Value にコネクトします。
- Sampler Info の Facing Ratio から Blend Colors の Blender へのコネクトを解除します。
- Remap Value の Out Value を Blend Colors の Blender にコネクトします。
- Remap Value の Value セクションで値を調節します。
以下の図は、interpolation を smooth にして、グラフを変更しています。
Sampler Info のアトリビュート
カメラからの視線と法線の角度を調べるには Facing Ratio が便利ですが、
法線マップによる法線ベクトルとの角度を調べるためには使用できません。
その場合には Ray Direction などを使って自分で内積の計算を行う必要があります。
- Ray Direction
- カメラからサンプリング点への長さ 1 のベクトル
Sampler Info の使用例 2
Crater テクスチャーを利用して、
バンプの部分にも Facing Ratio を使用したのと同じような効果が出るようにしてみましょう。
新しく以下のノードを利用します。
- Multiple Divide
- 1 〜 3 個の数同士を乗算・除算・階乗します。
- Vector Product
- ベクトル同士の演算(内積・外積など)を行います。
- 球と平面で適当にシーンを作成します。
わかりやすくするために、平面にテクスチャーをアサインしておきます。
- Surface Shader マテリアルを作成し、球にアサインしておきます。
ここでは、色の計算をすべてシェーディングネットワークで計算してしまうので、
Surface Shader を使用します。
- General Utilities から Sampler Info ノードを作成します。
- General Utilities から Multiple Divide ノードを作成します。
- Sampler Info ノードの Ray Direction と Multiple Divide ノードの
input1 をコネクトします。
- Multiple Divide ノードのアトリビュートエディタを開き、
input2 の 3 つの数値をすべて -1 にします。
これによって、カメラからサンプリング点に向かっているベクトルの向きを逆転します。
- 3D Texture から Crater ノードを作成します。
- General Utilities から Vector Product ノードを作成します。
- Crater ノードの outNormal と Vector Product の input1 をコネクトします。
- Multiple Divide ノードの output と Vector Product の input2 をコネクトします。
ここまでのシェーディングネットワークで Facing Ratio と同じ計算しています。
- Colors Utilities の Blender Colors ノードを作成します。
- Vector Product の outputX を Blender Colors ノードの Blender にコネクトします。
- Blender Colors ノードの output を Surface Shader の outColor にコネクトします。
- 以下のアトリビュートを適当に変更します。
Crater ノード
- Frequency
- テクスチャーの色を混ぜる度合い
- Norm Depth
- クレーターの深さ
Blender Colors ノード
- Color1
- Blender アトリビュートの値が 1 の場合の値
- Color2
- Blender アトリビュートの値が 0 の場合の値
- Crater の代わりに任意のバンプマップを使用することができます。
その場合は、Bump2d または Bump3d の outNormal から
Vector Product の input1 へコネクトします。
Sampler Info を使った MEL スクリプトの例
前回の Sampler Info の Ray Direction を利用したシェーダーの作成を
MEL スクリプトで自動化してみましょう。
- 以下の MEL スクリプトを makeUtilityNode1.mel という名前で作ります。
proc string makeSurfaceShader(string $obj)
{
string $shname = `shadingNode -asShader surfaceShader`;
string $sgname = `sets -renderable true -noSurfaceShader true -empty`;
connectAttr -f ($shname + ".outColor") ($sgname + ".surfaceShader");
select $obj;
sets -e -forceElement $sgname;
return $shname;
}
proc string makeCrater()
{
string $crater = `shadingNode -asTexture crater`;
string $ptex = `shadingNode -asUtility place3dTexture`;
connectAttr ($ptex + ".wim[0]") ($crater + ".pm");
return $crater;
}
global proc makeUtilityNode1()
{
string $sname[] = `sphere`;
move 0 1 0;
nurbsPlane -ax 0 1 0;
scale 25 25 25;
string $ssname = makeSurfaceShader($sname[0]);
string $siname = `shadingNode -asUtility samplerInfo`;
string $mname = `shadingNode -asUtility multiplyDivide`;
connectAttr -f ($siname + ".rayDirection") ($mname + ".input1");
setAttr ($mname + ".input2X") -1;
setAttr ($mname + ".input2Y") -1;
setAttr ($mname + ".input2Z") -1;
string $crname = makeCrater();
string $vname = `shadingNode -asUtility vectorProduct`;
connectAttr -f ($crname + ".outNormal") ($vname + ".input1");
connectAttr -f ($mname + ".output") ($vname + ".input2");
string $bname = `shadingNode -asUtility blendColors`;
connectAttr -f ($vname + ".outputX") ($bname + ".blender");
connectAttr -f ($bname + ".output") ($ssname + ".outColor");
setAttr ($crname + ".frequency") 0.5;
setAttr ($crname + ".normDepth") 8;
setAttr ($bname + ".color1") -type double3 0 0 0;
setAttr ($bname + ".color2") -type double3 0 1 1;
}
- の によって makeUtilityNode1.mel を読み込みます。
- のインプットウインドウで、makeUtilityNode1() を実行します。
(makeUtilityNode1() 実行後の図)
スクリプトの解説
proc string makeSurfaceShader(string $obj)
- SurfaceShader マテリアルを作成し、
$obj で表されるオブジェクトにアサインするプロシージャです。
このプロシージャは SurfaceShader ノードの名前を返すので string がついています。
global がついていないので、この MEL スクリプト内でしか使用できません。
string $shname = `shadingNode -asShader surfaceShader`;
- SurfaceShader ノードを作成し、作成されたノード名を変数 $shname に代入します。
string $sgname = `sets -renderable true -noSurfaceShader true -empty`;
- SurfaceShader マテリアルをコネクトするためのセットを作ります。
- -renderable true
- 作られたセットはシェーディンググループになって、
renderPartition ノードにコネクトされます。
- -noSurfaceShader true
- デフォールトのシェーダーにコネクトしません。
上で作ったマテリアル $shname にコネクトするためです。
- -empty
- 空のセットを作ります。
セレクトされているオブジェクトがあっても、
このセットに加えません。
connectAttr -f ($shname + ".outColor") ($sgname + ".surfaceShader");
- マテリアル $shname が出力する色情報を表す outColor アトリビュートを、
セット $sgname の surfaceShader アトリビュートにコネクトします。
これで、マテリアル $shname がレンダリング可能になります。
select $obj;
- $obj を選択します。
sets -e -forceElement $sgname;
- 選択された $obj をシェーディングループであるセット $sgname に追加します。
- -e
- 編集モードにします。
- -forceElement
- 選択されているオブジェクトを強制的にセットに追加します。
選択されているオブジェクト別のセットのメンバーである場合は、
別のセットから削除されます。
return $shname;
- プロシージャの終わりに SurfaceShader ノードの名前を返します。
proc string makeCrater()
- crater ノードを作成するプロシージャです。
このプロシージャは crater ノードの名前を返すので string がついています。
string $crater = `shadingNode -asTexture crater`;
- crater ノードをテクスチャーとして作成します。
string $ptex = `shadingNode -asUtility place3dTexture`;
- ramp ノードをテクスチャーとしてオブジェクトに張るための、
place3dTexture ノードを作成します。
connectAttr ($ptex + ".wim[0]") ($crater + ".pm");
- place3dTexture ノードの wim (worldInverseMatrix) アトリビュートと、
crater ノードの pm (placementMatrix) アトリビュートをコネクトします。
return $crater;
- プロシージャの最後に crater ノードの名前を返します。
global proc makeUtilityNode1()
- Sampler Info を使ったシェーダーを作成するプロシージャ
makeUtilityNode1 を定義します
string $sname[] = `sphere`;
- NURBS の球を作成します。
move 0 1 0;
- NURBS の球を (0, 1, 0) に移動します。
nurbsPlane -ax 0 1 0;
- NURBS の平面を作成します。
-
-ax 0 1 0
- 平面の軸を (0, 1, 0) の方向にします。
scale 25 25 25;
- NURBS の平面を XYZ 方向に 25 倍します。
string $ssname = makeSurfaceShader($sname[0]);
- プロシージャ makeSurfaceShader を使って SurfaceShader を作成します。
string $siname = `shadingNode -asUtility samplerInfo`;
- samplerInfo ノードを作成します。
string $mname = `shadingNode -asUtility multiplyDivide`;
- multiplyDivide ノードを作成します。
connectAttr -f ($siname + ".rayDirection") ($mname + ".input1");
- samplerInfo ノードの rayDirection アトリビュートを
multiplyDivide ノードの input1 アトリビュートにコネクトします。
setAttr ($mname + ".input2X") -1;
- multiplyDivide ノードの input2X アトリビュートを -1 に設定します。
setAttr ($mname + ".input2Y") -1;
- multiplyDivide ノードの input2Y アトリビュートを -1 に設定します。
setAttr ($mname + ".input2Z") -1;
- multiplyDivide ノードの input2Z アトリビュートを -1 に設定します。
string $crname = makeCrater();
- プロシージャ makeCrater を使って crater ノードを作成します。
string $vname = `shadingNode -asUtility vectorProduct`;
- vectorProduct ノードを作成します。
connectAttr -f ($crname + ".outNormal") ($vname + ".input1");
- crater ノードの outNormal アトリビュートを
vectorProduct ノードの input1 アトリビュートにコネクトします。
connectAttr -f ($mname + ".output") ($vname + ".input2");
- multiplyDivide ノードの output アトリビュートを
vectorProduct ノードの input2 アトリビュートにコネクトします。
string $bname = `shadingNode -asUtility blendColors`;
- blendColors ノードを作成します。
connectAttr -f ($vname + ".outputX") ($bname + ".blender");
- vectorProduct ノードの outputX アトリビュートを
blendColors ノードの blender アトリビュートにコネクトします。
connectAttr -f ($bname + ".output") ($ssname + ".outColor");
- blendColors ノードの outColor アトリビュートを
SurfaceShader ノードの outColor アトリビュートにコネクトします。
setAttr ($crname + ".frequency") 0.5;
- crater ノードの frequency アトリビュートを 0.5 に設定します。
setAttr ($crname + ".normDepth") 8;
- crater ノードの normDepth アトリビュートを 8 に設定します。
setAttr ($bname + ".color1") -type double3 0 0 0;
- blendColors ノードの color1 アトリビュートを 0 0 0 に設定します。
setAttr ($bname + ".color2") -type double3 0 1 1;
- blendColors ノードの color2 アトリビュートを 0 1 1 に設定します。
参考
- Maya
Maya, MEL 関係(Tips, FAQ, コマンド)のページ
Prev
Index | Home
Mail