レイヤー・ユーティリティ

レイヤーのコピー

Display Layer を使ってモデリングなどの作業を行なった後に、 同じ構成の Render Layer を作ってレンダリングを実行したい場合があるかもしれません。 そのようなときに Display Layer から Render Layer にレイヤーとメンバーをそのままコピーするツールを作ってみましょう。

レイヤー・ユーティリティの例

Display Layer をメンバーもそのままで Render Layer にコピーする copyDisplayLayer1 プロシージャーを作ってみましょう。

  1. 以下の MEL スクリプトを copyDisplayLayer1.mel という名前で作ります。
    global proc copyDisplayLayer1()
    {
    	for($dlayer in `listConnections layerManager.displayLayerId`)
    	{
    		string $di[] = `listConnections ($dlayer + ".drawInfo")`;
    		if(size($di) == 0)
    			continue;
    		string $rlayer = `createRenderLayer -empty`;
    		for($o in $di)
    		{
    			print ($dlayer + " " + $o + "\n");
    			editRenderLayerMembers $rlayer $o;
    		}
    	}
    }
    
  2. Display Layer をいくつか作っておきます。
    [Display Layer の図]
    Render Layer は空の状態にしておいてください。
    [Render Layer の図]
  3. 適当に数個のオブジェクトを作成し、 それぞれのオブジェクトを Display Layer のメンバーにしておきます。 
    [数個のプリミティブの図]
    [Relationship Editor の図]
  4. Script EditorFile → Source Script によって copyDisplayLayer1.mel を読み込みます。
  5. Script Editor のインプットウインドウで、copyDisplayLayer1() を実行します。
  6. Display Layer と同じ個数、同じメンバーの Render Layer ができているはずです。
    [copyDisplayLayer1() 実行図]
    [copyDisplayLayer1() 実行後の Relationship Editor の図]

スクリプトの解説

global proc copyDisplayLayer1()
copyDisplayLayer1 というプロシージャーの宣言です。 
for($dlayer in `listConnections layerManager.displayLayerId`)
layerManager ノードの displayLayerId アトリビュートに接続されている、 Display Layer の名前をひとつづつ取り出して変数 $dlayer に代入し、 以下のコマンドを実行します。 
layerManager は Display Layer 全体を管理しているノードです。
以下の図では、 displayLayer, displayLayer1, displayLayer2 などがここで作られた Display Layer です。
これらは listConnections layerManager.displayLayerId コマンドによって返ってくる名前になります。 defaultLayer は始めからある Display Layer で、 オブジェクトはデフォールトで defaultLayer に属するようになっています。
[layerManager の hypergrath 図]
ちなみに Render Layer では renderLayerManager というノードがレイヤ全体を管理しています。
string $di[] = `listConnections ($dlayer + ".drawInfo")`;
Display Layer の drawInfo アトリビュートから、 Display Layer に属しているオブジェクトのリストを得て、 文字列配列 $di に代入します。
以下の図は、 displayLayer2 に属しているオブジェクトを表示しています。
[Display Layer の hypergrath 図]
if(size($di) == 0)
  continue;
配列 $di のサイズが 0 なら Display Layer に属しているオブジェクトが無いので、 次の Display Layer を調べます。
string $rlayer = `createRenderLayer -empty`;
空の Render Layer を作り、 その名前を変数 $rlayer に代入します。
for($o in $di)
配列 $di の要素(オブジェクトの名前)をひとつづつ変数 $o に代入して、 以下のコマンドを実行します。
print ($dlayer + " " + $o + "\n");
確認のために Display Layer の名前とオブジェクトの名前を Script Editor に表示します。
editRenderLayerMembers $rlayer $o;
Render Layer の $rlayer のメンバーに、 オブジェクト $o を加えます。
以下の図は、作られた Render Layer のノードを表示したものです。
[Render Layer の hypergrath 図]
上図の renderLayer は nurbsSphere1 と nurbsSphereShape1 をメンバーにしていることがわかります。
[Render Layer の hypergrath 図]

練習

練習課題

参考


Prev
Home | Contents
Mail