XSI / MAYA(MEL) 覚え書き

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

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

2010年3月2日火曜日

【XSI】オレ操作系カスタマイズ

XSIの基本ナビゲーションはfcurveが素早く操作できていい。この点はMAYAはウンコ。
一方カメラ操作はMAYAのaltナビゲーションがいい。XSIのZOPナビとかありえない。

というわけでこの両方のいいとこどりがオレの理想。その設定方法メモ


インタラクションはXSI(デフォルトです)

カメラは[ファイル→設定→Tools→Camera]でマウスマッピングが代替、ナビゲーションAltのチェックボックスにチェックを入れる

これでいいとこどりの完成!!

2009年11月17日火曜日

【XSI】テクスチャーで凹凸マップ

テクスチャーで凹凸マップ

・グリッド出す
・長さを64*48、分割も64*48(640*480比率で正方形に分割されたグリッドできる)
・「レンダー」→「プロパティ」→「テクスチャマップ」→「XZ」(上から投影する設定)
・「アニメート」→「デフォーム」→「デフォーム」→「プッシュ」
 →ウインドウ出たらコンセントマークをクリック
  →「接続」→「texture map」を選択(かりの画像が貼られる)

この時点では振幅がゼロなので何も起こらない。振幅を適当にいじれば立体処理される


・あらかじめ用意した凹凸用の画像(フォーマットはなんでもOK)をXSI画面にD&D
・クリップに追加されているので選択すると適用される


--------------------------------
別の簡単な方法
--------------------------------
アニメーション→プロパティ→マップペイントツール→ペイントプッシュツール

こちらの場合、最も低い位置から最も高い位置までの幅は「ウェイト値範囲」の変更で行う。変更後にペイントしないと基本的には反映されないので注意

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がいいが、変数で内部的に扱っているだけならどっちでもいいのか・・?



.