2009年から仕事でMAYAを勉強。MAYAはデフォルトでは使い勝手が悪い。逆にスクリプトを覚えてカスタマイズするとかなり強力なツールになることがわかってきた。

物覚えが悪いので勉強したことはリマインダとしてココに書き留めるようにする。

2009年6月16日火曜日

【MEL】グラフエディター制御

//////////////////////////////////////////////////////////////////
//チェックボックスでグラフエディターの設定をコントロール
//////////////////////////////////////////////////////////////////

//autoFit の設定
string $onc01 = "refreshEditor01(1)";
string $ofc01 = "refreshEditor01(0)";
//バッファカーブの設定
string $onc02 = "refreshEditor02(1)";
string $ofc02 = "refreshEditor02(0)";
//インフィニティディスプレイの設定
string $onc03 = "refreshEditor03(1)";
string $ofc03 = "refreshEditor03(0)";

//()の中は引数で、この値を変数として次のプロシージャに引き渡しています。

//チェックボックスウィンドウ表示
if (`window -ex GEOptionWindow`) deleteUI GEOptionWindow;
window -title "GraphEditor Option" GEOptionWindow;
columnLayout;
checkBox -label "カーブのオートフィット" -onc $onc01 -ofc $ofc01;
checkBox -label "バッファカーブ表示on/off" -onc $onc02 -ofc $ofc02 ;
checkBox -label "インフィニティ" -onc $onc03 -ofc $ofc03 ;
showWindow;
window -e -h 100 -w 180 GEOptionWindow;


//カーブのオートフィットを設定
proc refreshEditor01(int $fit)
{
animCurveEditor -edit -autoFit $fit graphEditor1GraphEd;
}

//カーブのバッファカーブ表示を設定
proc refreshEditor02(int $buf)
{
animCurveEditor -edit -showBufferCurves $buf graphEditor1GraphEd;
}

//カーブのインフィニティを設定
proc refreshEditor03(int $Inf)
{
animCurveEditor -edit -displayInfinities $Inf graphEditor1GraphEd;
}


この書き方はちょっとトリッキーで、カーブの設定毎に別プロシージャを呼んで設定を書き換えています。
本来は全ての変数要素を集めて一つのプロシージャでまとめて設定するのが正統派です。 でも正統派の書き方をするとこのコードよりはるかに長く、かつ複雑になります。これでいいならこのまま使うほうがシンプルでしょう。このスクリプトでは設定されなかったパラメータは前の状態を維持するという性質を利用しています。


.

2009年6月10日水曜日

【MEL】指定のタイプを含むノードを選択

以下のようなコードで任意のタイプが含まれるノードを選択できる。
----------------------

string $TypeList[]=`ls -type "★★★"`;
string $connectionList[];
clear $connectionList;
string $buf[];


for($work in $TypeList)
{
   $buf=`listConnections $work`;
   if(`size $buf`)
     {
        $connectionList = `stringArrayCatenate $connectionList $buf`;
     }
}

select -r $connectionList;


----------------------

★の部分に選択したいタイプを入れる。-typeフラグに使えるタイプで、自分が調べたのは以下。
(ls -showTypeで調べることができる)

オブジェクトに含まれるtypeの種類

ls -type "hogehoge"
でリスト可能なタイプ指定の一覧

animCurve・・・アニメーションカーブ全部
animCurveTL・・・トランスレーションのカーブ
animCurveTA・・・ローテーションのカーブ
animCurveTU・・・スケールとビジビリティのカーブ
ikEffector・・・IKハンドルエフェクター
ikHandle・・・IKハンドル
joint・・・ジョイント
mesh・・・ポリゴン
pointConstraint・・・位置コンストレイン
orientConstraint・・・回転コンストレイン
scaleConstraint・・・スケールコンストレイン
aimConstraint・・・エイムコンストレイン
poleVectorConstraint・・・極ベクトルコンストレイン
locator・・・ロケータ
【注】ロケータ自体はtransformだが、ロケータの形状属性はlocatorと表示される。
一方グループは単なるtransformなのでtypeでlocator属性の含まれるものを抽出すれば
区別できるのかもしれない。

~ここから下は現時点ではよくわからない~

hyperView・・・ハイパービュー(?)
hyperLayout・・・ハイパーレイアウト(?)
lightLinker・・・ライトリンカー(?)
mute・・・ミュート(?)
displayLayer・・・ディスプレイレイヤー
shadingEngine・・・シェーディングエンジン(?)
materialInfo・・・マテリアルインフォ(?)まあきっとマテリアル
file・・・ファイル(?)
place2dTexture ・・・プレイ2Dテクスチャー(?)たぶんテクスチャ
camera・・・カメラ
groupId・・・(?)
groupParts・・・(?)

【注2】上記のような一般的なもの以外にもプラグイン固有のtypeが取得できるので、
typeというのはユーザーが明示的に設定できるようだ。





2009年6月9日火曜日

【MEL】選択中キーの最大/最小フレーム

選択中キーの最大/最小フレームを抽出する。キーに時間軸方向のスケールを掛ける際に使用。


float $KeyTimeList[] = `keyframe -q`;

float $maxframe = -9999.9;
float $minframe = 9999.9;

for ($val in $KeyTimeList)
 {
   $maxframe = `max $val $maxframe`;
   $minframe = `min $val $minframe`;
 }

print ("最大=" + $maxframe + " 最小=" + $minframe+ "\n");






2009年6月8日月曜日

【MEL】ifの条件式(応用)

if文は普通は

if ( $test > 0)

のように条件式を書くが、コマンドがtrueかfalseを返す場合は以下のように記述することができる。


//チェックボックスの状態を調べる

  if (`checkBox -q -value check1`)   
  {
   hoge
  }


if文で何も条件を書いてないのに動くということはつまり、返り値がtrue/falseのものはtrueなら条件を満たしたと判断されるということになる。


もう一個サンプル

//pCubeという物体が存在するかどうか調べる

if( `objExists pCube1` )
{
   select pCube1;
}


else

{
   warning("No pCube1 exists");
}




.

【MEL】チェックボックス

//////////////////////////////////////////////////////////////////
//結果を反映させる
//////////////////////////////////////////////////////////////////
proc result()
{
  if (`checkBox -q -value check1`)    //チェック1がオンだったら…
  {
    textCurves -ch 0 -f "Impacth-20w400c0" -t "check1";
  }

  if (`checkBox -q -value check2`)    //チェック2がオンだったら…
  {
    polySphere -r 3;
  }

  if (`checkBox -q -value check3`)    //チェック3がオンだったら…
  {
    ambientLight -intensity 0.8;
  }

  if (`checkBox -q -value check4`)    //チェック4がオンだったら…
  {
    file -f -new;
  } 

}

//////////////////////////////////////////////////////////////////
//チェックボックスのウィンドウ
//////////////////////////////////////////////////////////////////

window;
columnLayout;
checkBox -label "チェック 1" check1;   //check1というチェック設定のon/off
checkBox -label "チェック 2" check2;   //check2というチェック設定のon/off
checkBox -label "チェック 3"check3;   //check3というチェック設定のon/off
checkBox -label "クリア "check4;     //check4というチェック設定のon/off
button -label "apply" -c "result";     //apllyボタンが押されたらproc result()に飛ぶ
showWindow;


// 重要なのは”チェックボックスに名前をつけておく”ことです。名前をつけておかないと
// 他のプロシージャで結果を反映させることができません。check1~4がチェックボックスの名前です。


.

【MEL】listRelatives

listRelatives 
→選択中オブジェクトと関係のあるものをリストする。

listRelatives
選択しているもの自身およびその直下の子をリスト

listRelatives -pa
listRelatives でリストされたものをパス名込みでリスト。
→シーン内に名前の重複したノードがある場合、これを付けないと次の処理で引数の数が合わなくなったりして困る場合がある。重要なフラグ。厳密には『別のコマンドに渡すことができる、適切なオブジェクト名』を返している。

listRelatives -s
選択中ノードに設定されているシェイプアトリビュートをリスト。ジョイントなどシェイプアトリビュートを持たない場合は空白を返す

listRelatives -f
-paとは違いパスを返すのだが、今のところ違いがはっきりしない。変数として渡せば同じように次の処理ができる。階層が深いと当然パスが長くなるので、すっきりした名前を渡したいような場合は-paがいいが、変数で内部的に扱っているだけならどっちでもいいのか・・?



.

2009年6月4日木曜日

【MEL】ロード方法による挙動の違い

スクリプトエディターからロードした時と、スクリプトフォルダにMELを入れておいて起動時に読み込ませておくのではスクリプトの挙動が違うようだ。


スクリプトエディターからロードした時にはローカルプロシージャが読めたのに、起動時読み込みだと
見つからなくなる。

ある日急にスクリプトが動かなくなるのはこの辺の挙動の理解が足りていないせいな気がする。


ローカルプロシージャはそのファイル内では呼び出し可能なはずなのに、実際はそうではないのか?
世間で出回っているスクリプトをみても全部グローバルにしちゃっているようだ。
まあ挙動が安定するのは理解できる。しかし他のプロシージャと名前が衝突する危険が高まる。

どーすっかなあこれは。




【MEL】プロシージャ引数についての研究

小規模実験
proc test(string $text,int $val,float $num)
{
 print ($text + "\n");
 print ($val + "\n");
 print ($num + "\n");
}

$temptext = "hello world";
int $onogu;
float $rimo = 3.1415;

test( $temptext, $onogu, $rimo );

これで$onoguや$rimoを変えるとちゃんと結果に表示される。


・引数は数と型があっていれば順番に代入されるので名前の一致は必要ない(ゆえに汎用性が高い。むしろ内容を特定しない名前がいいかも)
・ただし汎用性のために複数の引数をセットしたら、渡す側も同じ数を(空っぽでもいいので)用意しなければいけない
・引数は”使わなきゃいけない”というもんではなく(←ここ勘違いしていた)、用意するかどうかと使うかどうかは全然別個に考えればいい
・returnも書かなければ以降に処理が流れていくだけで特に問題はない。 書けば呼び出した場所に戻る。




2009年6月3日水曜日

【MEL】3桁の数字の任意の桁数を取り出す

せっかく考えたのに作った後で不要なことに気がついたorz
後で必要になるかもしんないのでメモっとく。

//テスト用の3桁の数字
int $gaga = 278;
//100の位抽出
$hyaku = `floor ($gaga/100)`;
print $hyaku + "\n";

//10の位抽出
$juu = `floor (($gaga - ($hyaku *100)) /10)`;
print $juu + "\n";

//1の位抽出
$ichi = $gaga - ($hyaku *100 + $juu *10);
print $ichi + "\n";




しかしこれ、桁が7くらいになるともうきついよな。ちゃんと関数とか命令があると思うんだけど。

【MEL】引数を変数で渡す時の注意

引数を2つ以上要求するフラグに変数で引数を渡す場合

これはダメ
----------------
{
string $col = "0.5 0.8 0.1";
window;
columnLayout;
button -label " test " -bgc $col;
showWindow;
}
----------------


こう書かなくてはいけない
----------------
{
float $colR = "0.5";
float $colG = "0.8";
float $colB = "0.1";
window;
columnLayout;
button -label " test " -bgc $colR $colG $colB;
showWindow;
}
----------------

【MEL】キーが打たれているか判定

キーが打たれているかどうかを判定するスクリプト

$test4 = `findKeyframe -curve -at "rotateX" pCube1`;
print $test4;

string $attex = $test4[0];

if ( $attex != "")
{
   print "移動Xのキーがあります";
}
else
{
   print "キーはありません";
}


------------------

...でいいと思っていたが、どうやらこれは2008以降でしか通用しないらしい。
8.5以前にはfindKeyframe命令に-curveのフラグが存在していないのだ。

で、古いバージョンでも使える代用処理を考える。


findKeyframe -t "-99:99" -at "rotateX" pCube1;

-timeフラグで-99から99の範囲を探す。キーがなければ-99を返すので-99以外ならキーはあると判断する。



常識的なキーの打ち方をしていれば問題が起こることはないだろう。




2009年6月2日火曜日

【MELメモ】端数を0か5に

小数点以下任意の最後の桁を「0」か「5」にするロジックのメモ

・任意小数点の桁だけ抽出し1桁の整数にする
・この1桁の整数を3.33で割る
 →もし結果が2以上だったら切り上げ
 →もし結果が2未満1以上だったらこの桁は5である
 →もし結果が1未満だったら切り捨て


小数点以下任意の最後の桁をとりだすやりかたがわからんけど。
あとで検証するので思いついたアイデアをメモしておく。


・・・いやまて、任意の桁を取り出せるなら”その値が3,4,5,6,7のいずれかなら5”
でいいじゃん(汗