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 を作る(反射パス)
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 にする必要がある。