ユーティリティノードを作成する MEL スクリプト

Sampler Info を使った MEL スクリプトの例

前回の Sampler Info の Ray Direction を利用したシェーダーの作成を MEL スクリプトで自動化してみましょう。

  1. 以下の 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;
    }
    
  2. Script EditorFile → Source Script によって makeUtilityNode1.mel を読み込みます。
  3. Script Editor のインプットウインドウで、makeUtilityNode1() を実行します。
    (makeUtilityNode1() 実行後の図)
    [makeUtilityNode1() 実行後の図]
    [HyperShade の図]

スクリプトの解説

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 に設定します。

練習

練習課題

参考


Prev
Home | Contents
Mail