レイヤー・ユーティリティ
レイヤーのコピー
Display Layer を使ってモデリングなどの作業を行なった後に、
同じ構成の Render Layer を作ってレンダリングを実行したい場合があるかもしれません。
そのようなときに Display Layer から Render Layer にレイヤーとメンバーをそのままコピーするツールを作ってみましょう。
レイヤー・ユーティリティの例
Display Layer をメンバーもそのままで Render Layer にコピーする
copyDisplayLayer1 プロシージャーを作ってみましょう。
- 以下の 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;
}
}
}
- Display Layer をいくつか作っておきます。
Render Layer は空の状態にしておいてください。
- 適当に数個のオブジェクトを作成し、 それぞれのオブジェクトを Display Layer のメンバーにしておきます。
- の によって copyDisplayLayer1.mel を読み込みます。
- のインプットウインドウで、copyDisplayLayer1() を実行します。
- Display Layer と同じ個数、同じメンバーの Render Layer ができているはずです。
スクリプトの解説
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 に属するようになっています。
ちなみに Render Layer では renderLayerManager というノードがレイヤ全体を管理しています。
string $di[] = `listConnections ($dlayer + ".drawInfo")`;
- Display Layer の drawInfo アトリビュートから、
Display Layer に属しているオブジェクトのリストを得て、
文字列配列 $di に代入します。
以下の図は、 displayLayer2 に属しているオブジェクトを表示しています。
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 のノードを表示したものです。
上図の renderLayer は nurbsSphere1 と nurbsSphereShape1 をメンバーにしていることがわかります。
練習
- 使用例の copyDisplayLayer1.mel を参考にして、
copyDisplayLayer2.mel を作り、
引数に与えられたオブジェクトの属している Display Layer だけを
Render Layer にコピーするプロシージャーを作ってください。
(プロシージャーと引数)
copyDisplayLayer2(string $変数名)
(実行例)
- Display Layer をいくつか作っておきます。
Render Layer は空の状態にしておいてください。
- 適当に数個のオブジェクトを作成し、
それぞれのオブジェクトを Display Layer のメンバーにしておきます。
- の
によって
copyDisplayLayer2.mel を読み込みます。
- のインプットウインドウで、
引数に適当なオブジェクトの名前を与えて実行します。
オブジェクト名が nurbsCylinder1 ならば、
以下のように実行します。
copyDisplayLayer2("nurbsCylinder1");
- nurbsCylinder1 の属していた Display Layer が、
その他のメンバーも含めて Render Layer にコピーされます。
(ヒント)
以下のプロシージャーはオブジェクト $name が属している Display Layer のメンバーを返すプロシージャーです。
このプロシージャを使用すると copyDisplayLayer2 が簡単になるでしょう。
global proc string [] findDisplayLayer(string $name)
{
string $di[];
for($dlayer in `listConnections layerManager.displayLayerId`)
{
$di = `listConnections ($dlayer + ".drawInfo")`;
if(size($di) == 0)
continue;
for($o in $di)
{
if($o == $name)
{
return $di;
}
}
}
clear $di;
return $di;
}
練習課題
参考
- Maya
Maya, MEL, Maya関係のコマンドなどのページ。
Prev
Home | Contents
Mail