HEXA BLOG

その他

HEXA BLOGその他2016.11.18

本日からのAPI2.0

皆様、スープカレーは食べていますか。

ヨセミテです。

 img_5390

横浜の ラマイがとても美味しかったのでまた行って来ました。

トッピングを2つしたらなんだか別の料理みたいに。

大量のブロッコリーと舞茸で彩られたその姿はまるで

 

ブログを書いていたらまた行きたくなってきました。 


 

  • API2.0の話

今回はブログネタに、という理由でMaya Python API 2.0を触っていこうと思います。覚えなければなぁと思いつつ、なんだかんだで今まで触っておりませんでした。

MayaAPI2.0は現在もMayaのアップデートごとに頻繁に更新が掛かっているモジュールであり、Maya2016で大幅なクラスの更新がかけられたことで話題になっていました。

 

Maya2016でAPI2.0に追加されたクラス一覧

 

 まだ更新中ということもあり、クラスの数はAPI1.0に及ばないものの速度も速く使いやすいらしい・・・。

用途はAPI1.0と同様だと思われるので以前書いたAPI1.0に近しいことを試してみて比較してみたいと思います。

 

以前API1.0について記述した際のブログ

検索して初めて気づいたのですがこの時もラマイのことを書いてます。北海道に行きたいですね。

 

テストしたシーン。新しいシーンにポリゴンの球を作成しただけのシーンです。

 scene

 とりあえず準備です。API1.0、API2.0の定義と、メッシュのトランスフォーム名を取得しておきます。 

  1. import maya.cmds as cmds
  2. import maya.api.OpenMaya as om2<br />import maya.OpenMaya as om1
  3. mesh_name = cmds.ls(sl = True)[0]

 

 以前のブログで作成したAPI1.0の手順ではselectionListにノードを格納するために以下のような手順で取得しました。

  1. # om_1これならいく
  2. selList_om1 = om1.MSelectionList()
  3. om1.MGlobal.getSelectionListByName(mesh_name, selList_om1)

 

先にselectionListを定義し、受け渡して初めてデータの取得を出来ます。

一方API2.0では

  1. # om_2はセレクションリストがこれで取得できる
  2. shape_om2 = om2.MGlobal.getSelectionListByName(mesh_name)

返り値がそのままselectionListとして帰ってきました

これを試したタイミングにちょっと大きい独り言で「マジで!?」って言ってしまいました。

事前にselectionListを定義する必要もありません。

 

もちろん、このやりかたではAPI1.0ではエラーになってしまいます。

  1. # om_1だとこれではエラー
  2. shape_om1 = om1.MGlobal.getSelectionListByName(mesh_name)
  3. # エラー: TypeError: file &lt;maya console&gt; line 1:MGlobal_getSelectionListByName() takes exactly 2 arguments (1 given) #

 

 また、先ほどのAPI1.0でうまく動作した場合の返り値を取得してもAPI2.0と異なり、Noneが帰ってきています。

 取得した値はselList_om1に格納されています

  1. # om_1これならいく
  2. shape_om1 = om1.MGlobal.getSelectionListByName(mesh_name, selList_om1)
  3. # ただし返り値は成否をあらわすためのNone
  4. print shape_om1
  1. &gt;&gt;None

 

同様にDagPathを取得しようとしても、関数の返り値として帰ってくる挙動をしてくれました。

  1. # om_1のDagPath取得
  2. om1_dag_path = om1.MDagPath()
  3. selList_om1.getDagPath(0, om1_dag_path) # ちなみに間の0は渡したセレクションリストの何番目を対称にするかのindex
  4. # om_2のDagPath取得
  5. om2_dag_path = shape_om2.getDagPath(0)

 

APIの処理を行う際に必要になるのがこのDagPath。以前API1.0を使った際は関数化して取得していました。

こうやって比較してみると挙動がとてもわかりやすいです。ただしい表現では無い気がしますが返り値からぽんぽんと次の値にアクセスしていけるのはPymelを彷彿とさせて扱い易そうです。

 

便利!!

しかもちゃんとPythonのリファレンスがあるのでAPI1.0より情報も調べ易いという印象でした。

今回は以上になります。ちょっと感動したので次回もAPI2.0で書いていけたら良いな、と思いました。

では。

 

 

RECRUIT

大阪・東京共にスタッフを募集しています。
特にキャリア採用のプログラマー・アーティストに興味がある方は下のボタンをクリックしてください

RECRUIT SITE 

S