Mayaのシーンが表示されるパネル

モデリングしたりレイアウトする時に使うパネル。Helpでは、まずビューと呼ばれている領域。
“modelPanel”というコマンドで用意出来るんですが、作る以前にデフォルトで存在しているこのビューの領域をスクリプトからどうやって弄るのか?というのは、結構疑問だったりする訳です。

まず「getPanel -wf」。
直前にフォーカスを持っていたパネルが取得できます。perspビューでオブジェクトを作成して、その後スクリプトエディタを開いて「getPanel -wf」を実行すると、perspビューのパネル名称を取得できます。(スクリプトエディタのパネルにフォーカスが移動するので、都合直前にフォーカスを持っているのはperspビューのパネル。という事になります。)

「getPanel -type “modelPanel”」を実行すると、下記のようになる。

 
4枚modelPanelが存在するという事です。実際、「top, front, side, persp」があるので4枚です。

modelPanel -q -l “modelPanel4″」を実行すると「// Result: Persp View //」が返ります。

逆に「getPanel -withLabel “Persp View”」を実行すると「// Result: modelPanel4 //」が返ります。

「modelPanel -q -cam “modelPanel4″」を実行すると「// Result: persp // 」が返ります。
※同様に「modelEditor -q -camera “modelPanel4″」でも「// Result: persp // 」が返ります。

予め「camera1」を作成しておいてから、「modelPanel -e -cam “camera1” “modelPanel4″」を実行すると、perspビューは「camera1」からの視点に変更されます。
同じことは「lookThru modelPanel4 camera1」でも可能です。(modelPanel4 –> perspView 置き換え可能。)

lookThruコマンドは、ビューへのカメラ設定専用コマンド。
ニア/ファー・クリップの値設定も可能。

 
先ほど少し触れた「modelEditor」コマンドを使うと、ビューの表示制御もできます。
予めシーンに「cube」を作成しておき、「modelEditor -e -displayAppearance “flatShaded” “modelPanel4″」を実行すると、画面表示がシェーディングモードに変更されますし、「modelEditor -e -displayTextures on “modelPanel4″」だと、テクスチャ表示がONになります。

「cube」を選択して「viewFit」コマンドを実行するとcubeが画面に収まるようにカメラ位置が調整されます。
viewFitは、アクティブなビューに対するコマンドなので、スクリプトで実行する場合には事前に対象のビューをアクティブに設定する必要があります。(例えば、perspビューならば「setFocus modelPanel4」を実行)

コマンドによって、オブジェクト名(modelPanel4)ではなくラベル名(“Persp View”)で指定できるが、コマンドにより異なるので留意。

Mayaをコマンドラインから立ち上げる

前回ちょっとしか書かなかったので、もうちょっと追加。

自動実行のmelを利用するには、

拡張子”.mel” のファイルを作成して、その中にmelで実行したい処理を列挙していけばOK。

もしバッチ実行ではない場合は、実行する処理の最後に quitコマンドを記述しておくことで、自動的に終了させることも可能。
但し、usersetup.melやusersetup.pyで起動時に独自に起動処理を設定している場合や、起動直後に新機能などを表示するダイアログを自動表示させる設定になっている場合には終了に失敗する場合があるので、まずはダイアログを自動表示させる設定はOFFにしておいて欲しい。
起動処理を設定している場合は使用しないように対処したり、evalDeferredコマンドを使用して、自動実行したい処理を遅延実行させるような対応が必要になる。

上記のように、バッチ実行ではない場合には自動終了時に面倒が起こる場合があるので、GUIや画面表示が存在しなくてはならない処理を実行する必要がない場合以外は、基本バッチモードでの実行が無難。(但し、playblastなど画面表示の機能が稼働していないと動作が得られないものもある点に留意。)

そういえば、参考サイトのサンプルのバッチファイルの記述では、Maya.exeを起動した場合にはスクリプトの自動実行を行わないような内容になっているが、MayaもMayaBatchもその辺りの設定項目は同じなので、通常のMaya起動からの自動実行もバッチファイルを少し変えてやれば可能になる。
一番最初のハードルは

環境設定群だと思う。
とても基本的な部分なのだが、通常は特に設定を変更する必要なく使えてしまう部分な上、変更すると使えていたものが使えなくなってしまい、元に戻せなくて焦る…といったことも起こりやすい。
この部分を試すにしても、冒頭の参考サイトにあるバッチファイルによる設定が活躍する。
バッチファイルで実行するぶんには、Windowsに直接設定されている内容を汚すことはないので、存分に設定を弄り倒すことができる。(但し、既にWindowsに設定された内容を引き継いでしまう部分があるので、逆に設定を消すようなバッチファイルの記述が必要になる場合がある点には留意。)

環境設定の学習が進めば、複数の環境を切り替えながら使うことも出来るようになるので、頑張って習得するのが良いと思う。

追記

maya.envにて、環境設定をカスタマイズできる事を知らなかったもので追記しておく。

AETemplateの基礎

めも。

Intro to AETemplates
Google翻訳版

英語なんで、掻い摘んで列挙しておく。

AETemplateの基礎的なことが書かれている。

まず、最低限の定義内容。

上記のままだと、実際のノードを表示した場合に、アトリビュートが馬鹿みたいに大量に列挙されて非常に見づらい状態になる。
それを避けるには、必要なものに限って表示させる必要がある。

“transform”ノードタイプの場合の、基礎的な定義内容。

「stringAttr, enumAttr, numAttr」のコントロールを追加してみる。
※個々の項目名の項目が、アトリビュートエディタの冒頭に追加される。
※当たり前だけど、追加するアトリビュートが存在しなければ項目追加もされない。(例の場合、stringAttr, enumAttr, numAttrという名称のアトリビュートが存在する前提。)

追加部分をカスタマイズする方法の例。
※ stringAttrを “TXT:”という項目名に変更。
※ numAttrを “NUM:”という項目名に変更。

enumのコントロールのカスタマイズはやや複雑で、editorTemplate -callCustom フラグで動作を指定する必要がある。

対応するプロシージャは、こんな感じで。

 根本的には、ノードを自分で作った場合に威力を発揮する機能なので、まずはノードを作ってみないとピンとこない気がする。
 あとは、どうしてもビルトインでMayaのUIに既存ノードの編集を楽にする機能を盛り込みたい場合か…

 テンプレートの定義自体は、起動時にstartup処理の一環として読み込まれるものなので、定義を変更した場合は再起動しないとダメかも。
 (※melのrehashで再定義できれば…と思ったけど、どうもダメっぽい。)

そもそもAETemplateとは

 素朴な疑問というか、本当の初心者には「なんのことやら?」という部分。
 これを知るには「ノード」の概念を知る必要があります。(これについては、マヤ道!!を読むのも良いですね。)

 Mayaの管理している情報は、基本的にノード(Node)と呼ばれる情報の単位を持っています。
 名前、位置、向き、サイズ、色、形状…等々、Mayaが扱う情報はいろいろありますが、これらを利用するニーズに合わせた情報単位に構成したものをノードとして管理、使用します。
 例えば画面にポリゴンを表示する時も、transform&meshノードが作成されますし、ポリゴンもMayaで機械的に生成したものであれば、polyPlane, polySphere, polyBoxのように利用した機能に対応するノードが付随します。これらがノードです。

 AETemplateは、これらノードが保持している多数のアトリビュートのうち、ユーザーが編集に必要な要素をMayaのUI上で確認したり編集したりする為に必要な設定です。
 polyPlaneには、AEpolyPlaneTemplate.melというテンプレートがあります。
定義は、以下の通り。

 
 幅、高さ、分割数(幅・高さ)、UV生成の設定、texture要素の抑止、polyPrimitiveテンプレートの参照指定が入っています。
 ※polyPrimitiveテンプレートには、axis項目が定義されています。

 このように、ユーザがノード編集に必要な項目を定義するのがAETemplateです。
 この設定は melで書かれているので、ユーザー側でカスタマイズすることも出来ますし、新しく自分でノードを作成(pluginを用意)した場合にはその為の定義を新しく書くことも出来るようになっています。

AETemplateフォルダの .res.melファイル

めも。

startupフォルダにある、~.mel と ~.res.melの関係とか?【わかってないところアリ版】

要は、displayString コマンドがキモ。「m_AEtransformMain.kTransformAttributes」みたいな定義済名称をキーに、それに対応する項目名の表記を辞書式に取り出す為の仕組み。
uiRes 関数が定義されていて、実処理内からはこれで辞書から表示文字列を取り出す。

listHistoryは、基本的にDGノードの連なりを列挙するもの

 ヘルプには、小難しく「コンストラクション ヒストリがあるすべてのノードを返します。コンストラクション ヒストリは、クリエータとして定義されているノードの特定アトリビュートへの接続、および NURBS カーブ ノードのカーブなど、ノードのメイン データの結果から構成されます。」とか書かれていて、非常に判り辛い。。

 おおまかに、下記のように考えた方が良いのでは??(厳密さが必要になったら、いろいろあるとは思うけど)

DGは、ディペンデンシグラフ
※対義語的に、DAG(directed acyclic graph : 有向非循環グラフ)があって、要はTransformノードのこと。

 
 ちなみに、listHistoryは Transformノードのコネクションは追ってくれない。

アニメーションレイヤーのExport

 アニメーションレイヤータブの Layersメニューより、”Export Layer..” でExport可能。
 自分で実装していた時に、機能を見つけてしまった..

 実装は、C:/Program Files/Autodesk/Maya2014/scripts/startup/layerEditor.mel (animLayersExport関数)
 どうも AnimLayer, blendNode, animCurveの構造をまとめて出力しておくと、import時にBaseAnimationと接続してくれるっぽい。

 また、以下の処理で レイヤー由来のカーブや blendNodeを取得できる。blendNodeの destinationPlug には接続先が書き込まれる。

Maya MELのグローバル変数定義と、source, rehashについて

グローバル変数のタイプ定義は一回限り。
定義時に指定したタイプは、アプリケーションを起動し直すまで変更は出来ない。

sourceしているファイルの内容に変更があった場合には、sourceし直しで再読み込み可能。

Maya起動後に追加したsource対象のファイルがある場合には、rehashコマンドで再読み込み。

アトリビュートがデフォルト値から変更されたかを調べたい

 まず、1つ目の方法。
 リファレンスされたファイルに関連するノードの場合にしか使えない点に注意。

 『ネームスペース名:ノード名.アトリビュート名』のように特定のアトリビュートを確認することもできれば、『ネームスペース名:ノード名』のようにしてノード中の変更されたアトリビュートの列挙も可能。
 変更された場合には、アトリビュート名が返ってくる。
 なにも変更されてなければ、なにも返ってこない。

 2つ目の方法。
 以下のものは、リファレンス云々に関わらず使える。
 アトリビュートは特定のものに限定して使用するので、なにが変わったか知りたい場合には、全アトリビュートを総当りで調べる必要がある。
 ※multi 要素については、スカラーにしなくても一括で取得できる。

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

>[MEL]シーン内インスタンスオブジェクトの取得
http://maya-memo.blogzine.jp/blog/2012/05/post_f6a3.html

インスタンスなノードを取得する方法は意外に悩むところなので、このMELは貴重かも。

処理的には、以下のようなものだった。
・各ノードのTransformの抱えるシェイプ(複数の可能性があるので、先頭の1つ)をリスト化。
・各ノードのTransformの抱えるシェイプと、上記のシェイプ・リストを突き合わせて出現個数を数える。
・2個以上ある場合は、インスタンスとして返される。

bakeResultsのフラグ-attributeの引数の複数指定の方法..

>Maya: Walking the Line(@Stumbling Toward “Awesomeness”)
http://www.chrisevans3d.com/pub_blog/?p=762

MELでは何故かリスト指定できなかった、のでメモ。
Pythonでは、リンク先の指定方法でリスト指定できるのに、MELでは何故かリスト指定できない。Helpにはリスト指定しろ、みたいに書かれているのに..

MELでは、-attribute フラグを何度も使って、1つずつ指定することは出来た.

…で、後日気づいた。
Helpを良く見ると、MELの場合『Multiuse』という扱いのフラグはリスト指定できるのではなくて、『複数回指定できる』という意味。
結局、複数書くしかなかった…

Shapeの頂点座標の取得方法

 頂点の座標の取得・設定方法について。

 ワールド座標系で位置を取得・設定するには、xformを利用するのが手っ取り早い。
 [参考] http://creativeart.blog.shinobi.jp/Entry/987/

 CV座標系で位置を取得・設定するには、getAttr,setAttrでいける
 ※別の座標系への変換を考慮しないといけない場合は、素直に上記のワールド座標系で処理する方法を採った方がいい。
 [参考] animImportExport.mll (デフォルトPluginの出力でアトリビュートのアクセス先を確認.)

MELやPythonで、処理が遅い時にどうするか

単純に言えば、処理の高速化実装の考え方。

やらなければならないのは..

  • 時間の掛かっている場所の特定
  • 繰り返し実行している場所の特定

その上で、以下を行う。

  • 時間の掛からない方法への切替
  • 繰り返し手順の簡素化

MEL/Pythonで一般的に時間の掛かるパターンは、同じコマンドを繰り返し呼び出している部分。

例えば..

100回 deleteしている
⇒100回分の指定を配列にまとめて、1回のdeleteに変更

以下のように書けば大まかな時間計測が出来る。

Pythonの場合は、プロファイラモジュールで細かい計測が可能
(Python)各関数呼び出し時の実行時間をprofilingする方法

選択した順番に『指定名称 + “A~Z”』とリネームする

で、26以上もある場合を考えると、当然文字を生成した方が利口…ということに気付く。。

dockableではないウィンドウを、ドックに配置してみる

実用的とは思えないけど、ネタとして。。

・ウィンドウ名を列挙する(表示中のウィンドウの名前を調べる時に使う)
 lsUI -windows;

 ※例えば、スクリプトエディタは”scriptEditorPanel1Window”というウィンドウ名。

・scriptEditorウィンドウをドックに配置してみる
 if(window -ex dockWindow){deleteUI dockWindow;}
 dockControl -area right -content scriptEditorPanel1Window dockWindow;

・ドックに入れたscriptEditorを閉じる時(もしくは閉じた後で)
 removeScriptEditorPanel scriptEditorPanel1;
 if(window -ex dockWindow){deleteUI dockWindow;}

  動作的には、”dockWindow”というdockableなウィンドウを作って、-content 指定で格納したいウィンドウ内容を持っているウィンドウ名を指定することで、”dockWindow”内にウィンドウ内容が移植される。内容を移植され た”dockWindow”は、-area right の指定により画面右のエリアに格納される。

 閉じる際は、次に開くときの為に”scriptEditorPanel1″, “dockWindow”共に消しておく。
 ※”removeScriptEditorPanel scriptEditorPanel1;” は、スクリプトエディタを閉じる時のコマンド。