2012年12月22日土曜日

[MEL]オブジェクトにアサインされたマテリアルを調べる



ひさしぶりにツールっぽいツールを作ってみた。
選択したメッシュモデルにアサインされたマテリアルの一覧を表示し、
それがどの箇所に使われているかを調べられるツール。
ページ下部からダウンロードしたファイルを解凍、フォルダ内の2つの
ファイルをMayaのスクリプトパスにコピー後、Mayaを起動すると使用できる。

【使い方】
1.任意のメッシュオブジェクトを選択(複数可)
2.Script Editorに MaterialLister(); と入力。シェルフ等に登録しても良い。

【機能】
①選択オブジェクト名ボタン。複数オブジェクトの場合は”Multi Objects”と表示。
②マテリアルリスト。選択オブジェクトにアサインされているマテリアル一覧。
③再選択ボタン。別のオブジェクトを選択した後にクリックするとリストが更新される。
④ツール終了ボタン。ウィンドウを閉じツールを終了する。




①を押すとオブジェクトが選択状態になる。


②のリスト項目をクリックすると、選択モデルの中で
 そのマテリアルがアサインされているフェースが選択状態になる。



②のリスト項目をダブルクリックすると、そのマテリアルのアトリビュートが開く。


たったこれだけの機能だが、Mayaはオブジェクト毎でのマテリアル管理が
あまり得意でないので、今のところそこそこ便利に使っている。


「MaterialLister」をダウンロード


2013/02/11 MELを更新。複数マテリアル選択に対応しました。
2013/04/10 オブジェクトにアサインされた単一マテリアルが
        選択されない不具合を修正。

2012年12月5日水曜日

[MEL]ビューポートのパネルサイズを取得する

仲間内の勉強会で出たお題への回答案。

メインビューポートパネルの縦横サイズを得る方法。

現在アクティブになっているビューポート※のサイズを表示する。



{
    //パネルレイアウトのサイズ取得
    string $panelX[];
    string $panelY[];
    int $mainX=`paneLayout -q -w viewPanes`;
    int $mainY=`paneLayout -q -h viewPanes`;



    //アクティブなパネルを取得
    string $selectPanel =`getPanel -wf`;


    //各パネルの名前とサイズを取得
    string $panelname[] = `paneLayout -q -ca viewPanes`;
    int $panelwh[] = `paneLayout -q -ps viewPanes`;


    //パネル名とパネルサイズのインデックスを揃える
    for ($i=0;$i<4;$i++)
    {
        $panelX[$i] = $mainX*$panelwh[($i*2)]/100;
        $panelY[$i] = $mainY*$panelwh[($i*2)+1]/100;


        //選択パネル名と同じなら結果を表示
        if ($panelname[$i] == $selectPanel)
        {
            print ($panelname[$i]+":X="+$panelX[$i]+",Y="+$panelY[$i]+"\n");
        }
    }
}



※アクティブなビューポートとはビューポートの外側に白枠のついた状態のもの。

 ”Render the current frame”使用時にレンダリングされるビューと同じ。



出力結果とPhotoshopで計った結果、数ドットの誤差があるような、合っているような・・・。

流用等は自己責任でお願いします。

2012年10月26日金曜日

[MEL]文字列関連のメモ

何かとよく使う、文字列に関係するMELのメモをいくつか。


【現在のシーンのフルパスを取得する】
 file -q -sceneName;

file -q -sceneName;
// Result: C:/Users/mmb_jp/Documents/maya/projects/sample/sample.mb //



【現在のシーンファイル名を取得する】
 file -q -shortName -sceneName;

file -q -shortName -sceneName;
// Result: sample.mb //



【テクスチャのパスを取得する】
 getAttr ファイルノード名.fileTextureName;

getAttr file1.fileTextureName;
// Result: C:/Users/mmb_jp/Documents/maya/projects/sample/sample.tga // 



【フルパスからファイル名のみ(拡張子なし)を取り出す】
 basenameEx("フルパス");

basenameEx("C:/Users/mmb_jp/Documents/maya/projects/sample/sample.mb");
// Result: sample //



【文字の置換】
 substituteAllString("文字列", "検索", "置換後");

substituteAllString("Maya_Memo_Blog", "Maya", "Softimage");
// Result: Softimage_Memo_Blog //


置換の応用、文字列の一部を削除する。

substituteAllString("Maya_Memo_Blog", "Memo_", "");
// Result: Maya_Blog //



【文字列の分割】
 tokenize "対象文字列" "分割文字" $string[];

分割文字は1文字のみ。
複数文字の場合は分割文字が2種という扱いになる。
戻り値は分割数。文字列はstringの配列で受け取る。

string $result[];
clear $result;
tokenize "Maya_Memo_Blog" "_" $result;
print $result;

Maya
Memo
Blog



【文字列の中にダブルクォーテーションを含める】
 \" ("の前に\)

 $str="Maya\"Memo\"Blog";
// Result: Maya"Memo"Blog //

2012年8月8日水曜日

続・物理挙動っぽいカメラを作ってみた



ローカルな勉強会で発表するため、過去に作った物理カメラを
久しぶりに改造してみた。(過去記事はこちら)


【前回からの変更点】
・パラメータ連動の計算をより正確なものに変更
・ズームレンズのf値自動調整を削除
・画像素子サイズを追加。35mm、APS-C、フォーサーズから選択。
 画像素子サイズは設定に応じて焦点距離・F値に補正が掛かる
・シャッター速度に連動するモーションブラーを実装

【追加アトリビュート】
物理カメラは以下の追加アトリビュートのみで設定できる。



・焦点距離(レンズ)
・開放F値(レンズ)

・画像素子サイズ
・絞り
・シャッター速度
・ISO感度


【レンダリング作例】



【画像素子サイズ比較】

画像素子以外変更していないので35mmではオーバー気味に
なっているが、画角・露出が変化しているのが確認できる。



【モーションブラー比較】

シャッター速度を落とす事でモーションブラーが発生する事と合わせて、
露光調整の為に絞りを変更している影響で被写界深度にも違いが
出ていることが確認できる。



相変わらず自習・趣味の域をでない内容だが、手軽にリアリティが
得られるので、急ぎの仕事などでは役に立つかもという感触が得られた。

【追記】
ここで作ったカメラRIGを使い、CEDEC2014「スカルプトマイスター!」の
完成動画をレンダリングさせて頂きました。

【CEDEC 2014】スカルプト・マイスター!

プラスチカ 浅井真紀 / 沙悟浄・完成動画

カプコン 黒籔裕也 / 猪八戒・完成動画

ModelingCafe 山家遼 / 孫悟空・完成動画


Double Negative Visual Effects 田島光二 / 三蔵法師・完成動画

2012年5月4日金曜日

[MEL]シーン内インスタンスオブジェクトの取得

タイトルの通り、シーン内のインスタンスのリストを取得するMEL。
関数にしてみたので取得後の使い道はいろいろ。
ダウンロードしたファイルをスクリプトフォルダにコピー後、
Mayaを起動すると使用できる。

「SelectInstance.mel」をダウンロード

//【シーン内インスタンスリストの取得】
global proc SelectInstance(string $ReturnList[])
{
//変数の宣言
    string $Trans[];
    string $Shape[];
    string $ListDAG[];
    int $NoT;
    int $NUM;
    int $NoI = 0;
//配列の初期化
    clear $Trans;
    clear $Shape;
//トランスノードリストの作成
    $Trans =`ls -tr`;
    $NoT =`size $Trans`;
//シェイプノードリストの作成
    for ($i=0 ; $i<$NoT ; $i++)
    {
        select -r $Trans[$i];
        clear $ListDAG;
        $ListDAG =`ls -sl -dag -s`;
        $Shape[$i]=$ListDAG[0];
    }


//インスタンスの選出
    for ($i=0 ; $i<$NoT ; $i++)
    {
        $NUM = 0;
        for ($j=0 ; $j<$NoT ; $j++)
        {
            if ($Shape[$i] == $Shape[$j])
            {
                $NUM++;
            }
        }
        if ($NUM>1)
        {
            $ReturnList[$NoI]=$Trans[$i];
            $NoI++;
        }
    }
}

【使い方】
下のサンプルのように配列を引数として渡す事により、
その配列にインスタンスのリストが書き込まれる。


//インスタンスを選択する
string $a[];
SelectInstance($a);
select -r $a;




2012年4月17日火曜日

BatchBakeをMELで使用する


リアルタイム系のデータなどでは重宝する"BatchBake"だが、
mentalrayを使った機能であるためかスクリプトでの使用法がわかりにくい。
とりあえずわかった範囲での、MELで"BatchBake"を使う方法。

メニューから選択する"BatchBake"は2つの過程で実行されている。
 1."BakeSet"ノードを作成、オブジェクトのシェイプノードに接続
 2.対象オブジェクトの"BakeSet"ノードを参照し、ベイクを実行

これはそれぞれ、以下の命令でMELから実行できる。
 1.createAndAssignBakeSet

 2.convertLightmapSetup


"createAndAssignBakeSet"は焼き込み先がバーテックスカラーか
テクスチャーかによって書き分ける。
createAndAssignBakeSet vertexBakeSet "";     //バーテックスカラー
createAndAssignBakeSet textureBakeSet "";     //テクスチャー
""内は対象となるモデル名。指定無しの場合は選択中のモデルが選択される。

実行後作成されたノードのアトリビュートを編集し、ベイクオプションを設定する。
詳細はアトリビュートを編集しながらScriptEditorを眺めるか、
listAttrでアトリビュートの一覧を取得すれば把握しやすい。

"convertLightmapSetup"はなぜかMayaのドキュメントに載っていないが、
ScrptEditorに入力すればコマンドとして認識される。
("convertLightmap"はマニュアルに載っているが、こちらは上手く使えなかった)
もちろんhelpコマンドでオプションフラグも調べる事ができるので、そちらも参考になる。

以下、サンプルのMEL。選択したモデルのライトマップをバーテックスに焼き込む。

string $TransName[];
$TransName =`ls -sl`;
for ($Obj in $TransName)
{
        createAndAssignBakeSet vertexBakeSet $Obj;
        setAttr "vertexBakeSet1.colorMode" 1;
        setAttr "vertexBakeSet1.bakeColor" 1;
        setAttr "vertexBakeSet1.colorBlending" 0;
        convertLightmapSetup -camera persp -vm -bakeSetOverride vertexBakeSet1 -showcpv;
        delete vertexBakeSet1;
}

2012年4月2日月曜日

DiamantModelingToolsによるリトポロジー作業


先日Richard Diamant氏が無償公開した”DiamantModelingTools”(最新はAlpha1.01a)
モデリングツールやUVエディタなどの機能がセットになっていてどれもかなり使いやすい。
なかでもモデリングツールはリトポロジー作業を意識した機能となっており、
標準でリトポロジー機能のないMayaにとってはとても有用なツールだと思った。
そこで今回、リトポロジー作業に絞って同ツールの使用方法をまとめてみた。


Maya2011/2012の64bitのみ対応、32bitでは動作しないので注意。


【インストール】
1."http://rd3d.com/dtools.htm"から圧縮ファイルをDL。
2.解凍したフォルダ”DiamantToolsAlpha1.0”Cドライブ直下に置く。
3.同フォルダの”modules”フォルダ中の”DiamantTools.txt”
4.”C:\Program Files\Autodesk\Maya2012\modules”にコピー。
5.Mayaを起動、[Window][Settings/Preference][Plug-in Manager]
 開き、[ModelingTool_201X_x64.mll][Loaded]にチェック。
6.初回起動時、シェルフにツール起動用のアイコンが作成される。


【ツールの起動/終了】
インストール時に作成されたシェルフのアイコンをクリックして起動。
専用のツールウインドウが開く。
DiamantModelingToolsからMayaの通常機能へ戻るには"Q"を押す。
(単に他ツールを選択するだけでは切り替わらない事がある)




【ベースモデルの指定】
1.ベースモデルの含まれたシーンを開く。もしくはシーンにベースモデルを読み込む
2.DiamantModelingToolsのウインドウを開き、[Modeling]タブに切り替え
3.[Slide On Surface of Mesh]欄の[List]ボタンをクリック、リストからモデル名を選択
(以前に別モデルを読み込んでいた場合などは[Clear Objects]で選択をクリアする)




【リトポロジーモデルの生成】

1.ツールウインドウ内Modelingタブの左側[Quad Draw]アイコンを左クリック





2.ベースモデル上で左クリックすると緑のポイントが打たれるので、これを4点配置。





3.4点の緑のポイントに囲まれた範囲を"Shift+左クリック"すると最初のポリゴンが生成される
 以降も緑のポイントを設置→ポリゴン生成を繰り返す。生成に使うポイントは設置する
 緑のポイントと既存メッシュモデルのバーテックスから任意の4点を選択できる。
 生成されるポリゴンは青い半透明でプレビューされるので、希望の状態で生成する。




※注意点
四角ポリゴンのみで制作する。三角や五角形以上のポリゴンも一応作れるが不安定
大量のポイントを一度に配置するより、こまめにポリゴンを生成していく方が動作が安定する
ポイントの削除はアンドゥで行う。



【リトポロジーモデルの編集】
ベースメッシュ上に頂点をスナップさせた状態でコンポーネントの移動やスムージングを
行う事ができる。
このツールで生成したモデル以外でも、通常のMayaの機能で作成したモデルや追加した
頂点などもベースメッシュ上にスナップさせる事ができる


・移動/スムージングの共通操作
1.ツールウインドウ内[Modeling]タブの左側[AdvancedModeringTools]アイコンを左クリック
2.ビューポート上で"中クリック+マウス移動"でブラシの拡大/縮小が出来る




・頂点/エッジ/フェースの移動
1.モデル上にカーソルを乗せると、直近の頂点/エッジ/フェースのいずれかが強調表示される
2.そのまま状態から"Ctrl+左ドラッグ"で任意の場所に移動。
ブラシのサイズに応じて周囲のコンポーネントもソフト選択される




・頂点/エッジ/フェースのスムース
1.モデル上にカーソルを乗せると、直近の頂点/エッジ/フェースの何れかが強調表示される
2.そのまま状態から"Shift+左ドラッグ"で任意の場所に移動。
ブラシのサイズに応じて周囲のコンポーネントもソフト選択される。
ボーダーエッジにスムースを掛けるとフェースが縮むので注意




以上の機能を使ってリトポロジー作業を進めるが、手順としては、
最初は大まかにメッシュを生成。必要に応じてMayaの基本機能も使ってポリゴン分割等を行い、
メッシュのスムース機能でトポロジーを整えていくと手間が少なく済みそう。
生成されたモデルは多少不安定な事もあるので、早めに保存するか
FBXやOBJでエクスポートしておく事をお勧めする。