yslog

ゆるめに技術ブログかきます。Maya_Python

MayaAPIのすゝめ 第1稿

MayaAPIのすゝめ 第1稿

最近MayaAPIが難しいという話をよく聞くので、なにがしか導入のきっかけになればと思い記事にしてみます。

PythonのMayaAPIは1.0と2.0の2種類があり今回はAPI2.0を主題にします。

そもそもMayaAPI1.0はC++APISwig変換されたものであり、パフォーマンス的にも書式的にも不利な面が多くありました。


Pythonの書式になれきってる人は初見だとぉうぇっ、てなりますね(なりました

 

MayaAPI2.0ではPython向けに諸々刷新され書式が大幅に簡略化、パフォーマンスも向上し、場合によってはC++のそれを上回る局面もあるようです。

バージョン毎に使えるクラスも増えてきて私も最近はもっぱらAPI2.0ばかり使うようになりました。

 

ツール作成にあたってはいきなりAPIで作ろうとするとコストが高く、イテレーションも悪いので、自分の場合は

・MayaCmdsで必要な機能を作成

・PySideでUI作成(Mayaのレイアウトは使ったことないので知らない、、)

・パフォーマンスに問題がある場合は部分的、または全体をAPI

・UIの最適化

っていう手順を踏んでいます。

MayaCmdsでツール仮作成

部分的な機能解説ではわかりにくいと思うので作例としてちょっとしたウェイト編集ツールを作成しました。

↓こちらを例に実際にAPI化、速度の最適化していきたいと思います

※可読性優先で例外処理やら再利用性は考慮してません

Sample Editor 1 Cmds + QTableWidget

実行するとウィンドウが開き、スキンメッシュやコンポーネントを選択してGet_Weightボタンを押すとテーブルに反映されます。

実行時間はUI下部とスクリプトエディタに出力されます。

f:id:ys_45:20190414215337g:plain

 

・ウェイト取得はcmds.skinPercent

・UIのテーブルはQTableWidget

とどちらも制御は簡単なのですが、いかんせんパフォーマンスがイケてません。

実際に計測してみましょう。

協力いただくのは今回もXSI男さん(5137頂点、骨入れ済み)

f:id:ys_45:20190414215754g:plain

計測結果がこちら↓

f:id:ys_45:20190414222456p:plain

約5000頂点27Jointで

読み込み0.41sec

テーブルに設定7.08sec

書き込み6.59sec

、、5000頂点でこれではツールとしてはお話にならないですね。

読み込みはまぁ許せる範囲ですが、テーブル表示と書き込みがとにかく遅い。

昨今のハイレゾなリソースを考えると数万頂点でもさらっと耐える速度が必要そうです。

 

ちなみにSIWeightEditorでは同じモデルで

読み込み~テーブルセットまで0.09sec

書き込み0.235sec

でした。

これを指標に高速化を進めていきます。

f:id:ys_45:20190414224734p:plain

とりあえず読み込みと書き込みをAPI

順番的には実行コマンドを高速化するのが旨味が大きいので読み込み部分と書き込み部分をMayaAPI化していきます。

んで、したのがこちら↓

Sample Editor 2 MayaAPI2.0 + QTableWidget

具体的にはクラスのメンバ関数

get_skin_data(self)
set_weights(self)
API仕様に変更しています。

詳細はあとにしてまずは計測してみましょう。

f:id:ys_45:20190414222418p:plain

読み込み0.036sec

テーブルに設定7.63sec

書き込み0.066sec
読み込み10倍、書き込み100倍高速になりました!ヤター!!

とここまでは比較的簡単なのですが、この先が面倒くさい、、

本当に使えるツールにするにはこの他様々な対応が必要になってきます。

 

・UndoRedoの実装

MayaAPIでの操作は元に戻すの待ち行列に入らないのでUndo、Redoのコマンドを自前で実装してやる必要があります。

・UIの高速化

API化しても相変わらずテーブル設定が遅くてボトルネック、、

こちらはQAbstractTableModelを利用することで劇的に改善します。

ただPySideのView_Modelの仕様を理解する→プリミティブなModelで必要な機能を自前実装してやる、とふた山くらいあります。

どちらも一息に紹介するにはかなりボリューミーなので、次回以降数回に分けてまとめて行きたいと思います。

これから

APIの書式ざっくり解説、コンポーネントタイプ変換テクニックの紹介

・書き込みをプラグイン化してUndoRedoできるコマンドを実装

・UIのView_Model化(QStandardItemModelでの実装)

・QStandardItemModelをQAbstractTableModelで置き換え(Tableの基本機能を自前実装)

・QAbstractTableModel高速化のコツ

を順を追って記事にしていこうかなと思ってます。

 

この辺を抑えられるとウェイトに限らず頂点カラー、UV、法線、頂点座標等なんでも(実用的な速度で)オレオレエディタ化できるようになったり。

 

他にもMayaAPI使えるとベクトル計算やマトリックス変換、球面線形補間等、cmdsではちょっとできないいろんな計算もサクッとできちゃったりします。

ぜひMayaAPIに親しんで行きましょう。

では今回はこの辺で、アディオスばいなら。