Maya Script Python インポートされたモジュールの更新

小技が続きます。
Mayaでスクリプトを作る場合、エディタがついているので小さいものはそこで行うかと思います。
ただ、ファイルとして用意し、モジュールとしてインポートしているものはMayaを立ち上げ直さないと通常は更新されません。
なので、それを更新する方法を書きます。

import filename
reload(filename)
filename.functionName()

filenameと書かれた場所全てに拡張子(.py)を抜かした名前を書きます。
test.pyというファイルであれば「test」です。
functionNameと書かれた部分にはその中で使われている関数名を書きます。
3行目は、関数を実行するときに使うものなので、なくてもモジュールは更新されます。
いちいちMayaを立ち上げ直さなくても良くなります。

 

要するにPythonの標準関数として入っている「reload()」を使えばリロードができる。
というだけの話です。

 

しかしpymelには色々なメソッドが用意されていますねぇ、
仕事で使う小物スクリプトがだんだんと膨大なものになって来つつあります。
これを機に要素をクラス化してpymelで書きなおして完全オブジェクト指向に移行しようか。
などと考え始めました。考えただけですが。
そうしてゆくと、現状のゲーム制作における方向性のようなものが見えてきそうな気はします。
ただ、日に日に多様化してゆく作り方にどこまで耐えられるか。そう考えると面白そうでもあり、ゲンナリもします。

 

C++の勉強はほとんどストップしております。
というのも、そもそもそれを始めようと思った理由が、早さの追求でした。
しかし、Mayaのプラグインとして公開されていらっしゃる方がいますが、
モデルの左右対称を検出するものがありました。
自分のパソコンで約1万ポリゴンのメッシュを検索するのに約5秒くらいでしょうか?
十分に早いのですが、試しにmodoの標準機能である、形状>対象ツール
を使って同じ事をすると、約3万ポリゴンのものでも一瞬で終わります。

 

なので、ちょっとヤル気が失せました。
それならpymelでできることを極めたほうが面白そうだ。
さらに、どうせプラグインを作るならmodoのほうが楽しそうだ。
そんなことを思ってしまいました。

Maya Script Python 表示のトグル

選択したオブジェクトの表示をトグルする方法です。

import maya.cmds as cmds
sel = cmds.ls(sl=1,o=1)[0]
cmds.setAttr(sel+".visibility",not cmds.getAttr(sel+".visibility"))

一つのオブジェクトを選んで実行すれば、表示がトグルされます。
で、pymelでは、

import pymel.core as pm
sel = pm.ls(sl=1,o=1)[0]
sel.hide() if sel.isVisible() else sel.show()

メソッドが用意されております。

 

マヤコマンドにもメソッドが用意されておりますが、pymelのほうが圧倒的に多いようです。
トランスフォームノードで73個と286個の差がありました。
因みに特定の名前のトランスフォームノードをトグルするには、

import maya.cmds as cmds
[cmds.setAttr(x+".visibility",not cmds.getAttr(x+".visibility")) for x in cmds.ls("Rig*",type="transform")]

もしくは、

import pymel.core as pm
[x.hide() if x.isVisible() else x.show() for x in pm.ls("Rig*",type="transform")]

と、なります。
この場合名前が「Rig」で始まるトランスフォームノードに対して作用します。
どのようなメソッドが用意されているか調べるためには、

import pymel.core as pm
for x in dir(pm.ls(sl=1)[0]):
	print x

で出力可能です。
オブジェクトを選択してスクリプトエディタで実行すると表示されます。
pymelははじめの読み込みに時間がかかるのが難点ですが、
C:\Users\(ユーザー名)\Documents\maya\2013-x64(※バージョンによって違う)\ja_JP\scripts\
内に、userSetup.pyというテキストファイルを作成し、

import pymel.core as pm

と書き込んでおけば起動時に読み込まれます。
起動には時間がかかるので、pymelを読み込む時間は体感できないものになります。

Visual Studio 2010 Express を使って64bitコンパイル

まずはこちらからVisual Studio 2010 Expressをダウンロードします。
そして、WindowsSDKをダウンロードします。
次に、Visual Stuidio(VC)をsp1にアップデートします。
最後にWindowsSDKをアップデートします。

 

ややこしい、、
順番を間違えるといけないようです。
どうやらExpressには64bitコンパイルの機能が無いようで、
そのためにWindowsSDKを入れる必要があるそうです。
で、VCをsp1に上げる必要はあるのか?と聞かれると、困ります。忘れました。
ただ、sp1に上げるとWindowsSDKを入れた時に入った64bit関係のものが使えなくなるそうです。
で、最後にWindowsSDKを更新する。ということのようです。

 

インタプリタ型の言語と違い、コンパイル言語はコンパイルの時にヒヤヒヤしますね。
と言っても、それほど勉強が進んだわけではありません。

 

ここしばらくPCの調子がすこぶる悪くなりました。
WindowsSDKはMicrosoft Visual C++ 20xx x86 Redistributable関係のものが入っているとインストール出来ないそうです。
それを知らずに、何度もインストールを実行してしまいました。
インストールされているものを見ると、同じようなものがたくさんありすぎて嫌気が差しました。
元々調子が悪かったものが、それでか余計に調子が悪くなりました。

 

で、再インストールです。
せっかくなので、CドライブをSSDにしてみました。約7千円。
すこぶる早い。
これならしばらくPCを買い替えなくても大丈夫そうだ。

Maya API

ついにMayaAPIに興味を持ってしまいました。
それで検索すると、このようなページがあります。
MayaのAPIについて書かれたAutodeskのガイドページです。

 

リファレンスまでは和訳が進んでいないようですが、解説は和訳されております。
PymelとAPIでオブジェクティブなプログラムを作ると面白そうだ、という発想から、
だったらC++を勉強してみたらどうだろう。ということで、少しC++を勉強中です。

 

そこで、色々な発見がありました。
今までPythonやJavaScriptを使っておりましたが、なぜこれはそういった扱いなのだろう、
なぜ、そういった記述なのだろう。という疑問が幾つかありましたが、C++を知るとよく分かりました。
なるほど、歴史的な流れがあるのだなぁ、と改めて関心です。

 

恐らくそこで感じる疑問も、FORTRANやCOBOLを知ると理解できるような気がします。
ただ、そこまで辿る気はない。
それにそういった知識は豆知識にしかならない。そこが面白くはある。

 

modoはSP3になったようです。
頂点マップで幾つかバグがあるのですが、それは解消されたのでしょうか。
modoではあまり使用頻度が少なそうなので、あまり期待はできそうにない。
もうちょっとゲームCGに優しくなって欲しいが、ゲームCGももはや転換期。
そんな使い方はそもそもしない。という時が来るのだろう。
しかし、そういった使い方を別の角度から見て出来たのがZBrushでもある。ということを考えると、これまた面白いなぁ。

Maya Script melの紹介 – Fill Selection Tool

Fill Selection Toolというmelを知りました。

 

中を開けてみると、驚くほどシンプルにできています。
動作は、modoの「クローズドループ」に似ています。
しかし、性能はそれ以上です。modoのクローズドループはうまく動作しない時もあります。
こちらのmelでは、エッジループを選択し、スクリプトを実行します。
すると、選択したところを堺にどちらの塊をポリゴン選択に変換するかを選べます。

 

内部的にやっていることは、
専用のUVを作成し、選択されているエッジでUVを切断。
そして、polySelectConstraintを使って選択範囲を選択できるようにしているようです。
試しにPythonに翻訳してみたのですが、全く変わらない。

 

コマンドの効用が良くわからないので、載せません。
そのまま書き写しただけのようなものです。

 

うーん、応用できないものだろうか。
modoのようなシンメトリー選択機能が欲しい。
以前少し紹介した、Diamant Tools、どうやら無料版は制限時間があるようで、使えなくなりました。残念。
高速で動くシンメトリー選択機能が作りたいところです。

Maya Script Python フェース選択の境界エッジを選択

import maya.cmds as cmds

def select_boder_edge():
	oSel = cmds.ls(sl=1)
	if oSel == []:
		return
	oPolys = cmds.filterExpand(sm=34)
	if oPolys == None :
		return
	oEdges = []
	oEdgeSet = set()
	[oEdges.extend(x.split()[2:]) for x in cmds.polyInfo(fe=1)]
	oRemoveEdges = [x for x in oEdges if x in oEdgeSet or oEdgeSet.add(x)]
	cmds.select([oSel[0].split(".")[0]+".e["+x+"]" for x in list(oEdgeSet-set(oRemoveEdges))])

select_boder_edge()

突然ですが、Mayaのスクリプトです。
modoで、ポリゴンを選択した状態で、「Ctrl」キーを押しながらエッジ選択を実行すると
選択されたポリゴンの境界にあるエッジを選択できます。地味に便利な機能です。
それをMayaで出来ないものか。と、やってみました。できました。

 

しかし、相変わらずスクリプトでの実行は遅くて嫌になる。
pypyはMayaでは使えないのでしょうか?
そもそもWindowsへのインストールも良くわからない。
Windowsだと32bit版しかないし、、
Mayaでpypyが普通に使えるようになったら、うーん、想像しただけで楽しそうだ。
バイナリ化されたものと比べても遜色ない早さ、というのは本当なのかなぁ。

アニメーションが親切に解説されております

レンダリング、ライティングの基本が分かります

図版が見やすい美術解剖書です