graphics.hatenablog.com

技術系テクニカルアーティストのあれこれ

(メモ)mel と pymel の違いを説明してみる。

こないだ「mel と python って何がちがうの?」って聞かれたので、息抜きがてら書いてみる。(python は maya.cmds と pymel があるけど、ここでは pymel のほう)

たとえば mel で

setAttr "obj.translate" -type float3 0 0 0

ってかくと、

  1. "obj.translateX" っていう名前の設定値を
  2. float3 形式の 0 0 0 という値にしてくれと
  3. setAttr さんにお願いする

って意味になる。
これが pymel だと

obj.translate = [0, 0, 0]

ってかいて、

  1. あんたが持ってる translate という値を
  2. [0, 0, 0] にしてくれと
  3. obj さんにお願いする

って意味になる。

一番大きな違いは、「"obj.translate" という名前の設定値」「obj が持ってる translate という値」 に変わったとこ。mel だと何もかも名前で書いてやらなきゃいけない。「"obj.translate" っていう名前に一致するもの」を mel 君が探してくれてるのね。mel 君は「obj が translate を持ってる」「translate の形式は float3」ってことを知らないから、とりあえず探してみないとわからない。だからまずそれを探し出さないと、setAttr さんにお願いできない。

けど pymel 君は「obj さんが translate を持ってる」ことを知っていて、obj さんは「translate の形式は float3 だ」ってことを知ってるから、「おまえ translate っての持ってるだろ? それに [0,0,0] いれとけよ?」って、obj さんにお願いできるわけだ。もっというと、mel では「setAttr さんが」その値を設定するんだけど、pymel では「obj さんが」その値を設定する。ようするに行為の主体が違ってて、mel だと setAttr さんが obj の translate に設定する んだけど、pymel だと obj 自身が translate に設定する ことになる。些細なことだけど、プログラムってのは「だれが」「なにを」「どうする」っていうのを書いていく ものだから、この違いはとても大事。

ちなみにこういう仕組みを「オブジェクト志向」っていって、ここでは obj っていうオブジェクトを中心に物事を考える ってことになる。mel だと「世界のどっかにある "obj.translate" という名前のもの」に対して操作をするんだけど、pymel だと「この世界には obj ってのがいて、そいつが持ってる translate」に対して操作をすることになるわけだ。厳密にいうとちょっと違うけど、イメージ的にはだいたいそんなかんじ。

あとは、例えば numpy や scipy みたいな、maya と関係ないプログラムを持ってきて、そいつらを使って超複雑なことが pymel だとできたりするんだけど、個人的には、そこまでやるんなら C++ でやれよって気はしないでもない。まぁでも、「maya の世界にはなかっけど python の世界にはあるものを自由に取り入れることができる」 っていうのはとても大きなメリットだとは思う。mel でもできるけどわりとめんどくさい。


というわけで、「なんで mel じゃなくて pymel 使ってんの?」って聞かれたら、俺は、「pymel のほうがプログラミング言語として綺麗だと思うだから」って答える。ここでいう「綺麗」っていうのは、↑にかいたオブジェクト指向の仕組みがしっかりしてるから、って意味。もっとも、そんなプログラマ的価値観をアーティストさんが理解する必要はないし、プログラマにしても、「mel みたいなシェルスクリプト式コマンド言語のほうが素直で使いやすい」って言われれば、それはそれで納得できる。maya も 2013 Extension 2 で C# を新たに導入するみたいだし、まぁ、自分が好きな奴を使えばいいんじゃないですかね。どれ使ったって、やり方が違うだけで、できること自体はたいして変わらんわけだし。