MAYAメモログ -4ページ目

Shelf Layout の名前取得

env でグローバル変数のリストを取得。その中の


$gShelfTopLevel


これがMayaのデフォルトの ShelfLayout 名を格納している。

print してみると↓


MayaWindow|mayaMainWindowForm|formLayout2|formLayout14|formLayout15|formLayout49|ShelfLayout


こんな感じ。

現在表示している ShelfTab の名前は以下で得る。


string $shelfTabName = ($gShelfTopLevel + "|" + `shelfTabLayout -q -selectTab $gShelfTopLevel`);


shelfTabLayout ではタブの名前しか返さないので、その前に親レイアウトの名前をつなぐ必要がある。

区切りは縦棒「|」で行います。

Grid Option を Shelf に登録するメニューを作る

grid の設定をシェルフなどに登録するMEL。

scriptEditor の excute all command を使っても gridOption は出力されず、 grid コマンドを手で打たなければならない。これは時間の無駄。ということで、作ってみました。


///////////////////////////////////////////////////////////////////////////////////

//

//Script name : ttSaveGridOptionToShelf.mel

//Command : ttSaveGridOptionToShelf

//

//どんなMEL? : 現在の GridOption の設定をシェルフに登録する。

//Gridの大きさ、分割をシーンに合わせて変えたいときに便利。


global proc ttSaveGridOptionToShelf()
{
string $flags[10] = {"-da","-dab","-ddl","-dgl","-dol","-dpl","-olp","-plp","-s","-sp"};
string $flag;
string $values[10];
int $i = 0;
for($flag in $flags)
{
$values[$i] = `grid -q $flag`;
$i++;
};
string $script = ("grid " +
$flags[0] + $values[0] +
$flags[1] + $values[1] +
$flags[2] + $values[2] +
$flags[3] + $values[3] +
$flags[4] + $values[4] +
$flags[5] + $values[5] +
$flags[6] + $values[6] +
$flags[7] + $values[7] +
$flags[8] + $values[8] +
$flags[9] + $values[9] + ";");
scriptToShelf ("grid", $script, 1);
//print $script; //上の行をコメントにして、この行を使えば ScriptEditor に出力するだけにもできる
}


///////////////////////////////////////////////////////////////////////////////////

これが .mel 。

で、せっかくなので Display Menu の下に Save Grid To Shelf というメニューを追加する。


まず、Maya のメインメニューの名前を取得。これは env コマンドで グローバル変数をリスト表示し、そこからそれらしい名前を検索した。

すなわち!


$gMainDisplayMenu


これがメインメニューの名前が入ってる変数。

というわけで次のように書けばOK


menuItem -parent $gMainDisplayMenu -d 1; //仕切りを追加します
menuItem -parent $gMainDisplayMenu -label "Save Grid to Shelf" -command "ttSaveGridOptionToShelf";


これを userSetup.mel に書き足しておけば、自動的にメニューが追加される。やったーー!!


自分のスクリプトをデフォルトの script フォルダ以外に置いている場合、

-command のところで source もしておくか、環境変数にスクリプトパスを追加しておけば、デフォルトのスクリプトフォルダ以外のところに .mel を置いてもMaya起動時にコマンドを読み込んでくれる。


<例>

menuItem -p $gMainDisplayMenu -l "Save Grid to Shelf" -command "source \"userDir/ttSaveGridOptionToShelf.mel\";\nttSaveGridOptionToShelf";


エクスプレッションもそうだけど、文字列に文字列を含めるの、嫌い。


<追記>

このブログ、インテンドとか、先頭にスペースとか入れられないのかな?

スクリプトが読みにくい;

reflection path を作る(反射パス)

Mayaのデフォルトでサポートされる Render Path は

beauty
color
shadow
specular
diffuse

の5つが基本。それぞれは以下のように計算された結果得られる。

beauty = color x shadow
color = specular + diffuse
diffuse = (diffuseColor x diffuseWeight) + reflection

となっている。diffuseColorはシェーディングされていない、マテリアルのカラーの値そのもの。diffuseWeightはシェーディングによって得られる、サーフェイスの明度。weightはマテリアルカラー真っ白の状態にしてレンダリングしたもの。incandencence translucence を設定している場合も weightと共にしてしまってもよいと思う。
この内、diffuse の reflection のみ個別にレンダリングで出力することができない?!※1 なぜだ、、、、。
というわけで、 reflection 素材を作ってみよう。

話は簡単。次の数式のとおり。

D = C + W + R

のとき

R = D - (C x W)

である。

つまり、
reflection = diffuse - (diffuseColor x diffuseWeight)
で作れます。
Photoshop で 「引き算」はレイヤー合成の「差の絶対値」
AfterFX では「差」「差(クラシック)」とか、こういった感じの合成モードで実現できる。

---------------------------------------------------------------------------------
※1 diffuseColorは、レンダーレイヤーのアトリビュートをMELで変更しないと出ない。 コマンドリファレンスのレンダーレイヤーを参照すべし。ambient path という隠れアトリビュートが存在し、それを On にする必要がある。