皆様、スープカレーは食べていますか。ヨセミテです。
なんということでしょう、スープカレーの話題が切れてしまいました。
そろそろ新規開拓をしたいところ。あぁ、気軽に北海道に行きたい。
- Maya Python API2.0の話
今回も前回同様、Maya Python API2.0を触っていこうと思います。
さて、ブログを書き出した段階で特に何をするかを考えておりませんでした。
勉強の機会としてAPIリファレンスを眺めてあまり触ったことの無いクラスから何が出来るかを考えて試したいと思います。
ところで、mayaAPIのクラスの名称には「M~」、「MFn~」、「MPx~」、「MIt~」の4種類の頭文字があり、以下のサポートで命名規則の意味合いが記述されています。
- クラスの命名規則
プログラミング知識の浅い僕としてはちょっと難しかったので、以下の様な認識をしています。(浅学ゆえ、完全に正しい認識ではないかも知れません)
- M~ :ベクターや選択リスト等、取り扱うデータを作成するためのクラス(MGlobalのような例外もある)。
- MFn~ : cmdsのような実行するための関数群。
- MPx~ : ノードやコマンドを作成したい際に利用するクラス。
- MIt~ : MFn同様、実行するための関数群。頂点のような複数の処理対象を前提に考えられている。
今回の目的である「良く知らないクラスを即興で試す」に適するのはMFn、もしくはMItに属するクラスですね。
試しに「MFnTransform」を使ってみることにします。transformノードを扱うための関数群らしいので覚えておくと汎用性がありそうです。
シーンに適当なポリゴンモデルを作成します。今回の実行環境はmaya2017です。
ここで利用しているMGlobalというクラスは汎用的な値を取得できるクラスで現在選択されているオブジェクトもMGlobalでMSelectionListとして取得できます。そしてMFn系のクラスを利用するために使うMDagPathはMselectionListから取得できます。
import maya.api.OpenMaya as om2 selList = om2.MGlobal.getActiveSelectionList() # 選択対象からSelectionListを取得 selDag = selList.getDagPath(0) # MSelectionListからindexを指定してDagPathの取得 MFnTransIns = om2.MFnTransform(selList.getDagPath(0)) # MFnTransFormインスタンスを作成
これでMFn関数群の利用が可能になりました。
以下を入力するとcmdsライブラリでも出来たscaleコマンドと同じようなことが出来ました。なんだか懐かしい気持ちになります。
MFnTransIns.setScale([4.0,1.0,2.0]) # スケール値を設定 print MFnTransIns.scale() # transformが保持するスケール値を取得
# 実行結果 [4.0, 1.0, 2.0]
同様に移動値と回転値もMFnクラスで取得、設定ができました。
scaleと異なり、移動値MVectorクラスで指定しないといけなかったり、空間指定をMSpaceクラスで定義されている定数で指定したりが必要でしたが、概ねcmdsと同様の処理を行うことは可能そうでした。
MFnTransIns.setRotationComponents([45.0, 45.0, 45.0, 1], om2.MSpace.kTransform) # 回転値を設定 print MFnTransIns.rotationComponents() # 回転値を取得 MFnTransIns.setTranslation(om2.MVector([5.0, 10.0, 15.0]), om2.MSpace.kWorld) # 移動値を設定 print MFnTransIns.translation(om2.MSpace.kWorld) # 移動値を取得
これで次からトランスフォームを扱う記述を書いていくことが問題なく出来そうです。
Maya Python API2.0では今回のようなDagPathを取得する流れでMFn関数群は大概が利用可能になるはずです。コマンド化しないとヒストリに残らないことだけは注意して下さい。
段々理解できてきた、高速で扱いのしやすいMaya Python API2.0。是非とも有効利用したいところです。
ではでは。