Maya Script Pymel – ポリゴン数を数える

スクリプトを書いていて、記事にしようとまとめていたら、以前に似たような記事を書いたなぁ。
と、読み返してみると、ありました、、

 

その時記事にしたのは、ポリゴン数のカウントではなく、Pythonでの整数での四捨五入でした。
round関数にはマイナスが入る。ということが衝撃でした。

 

その時も実はポリゴン数のカウントでした。
その時は何でカウントしていたのだろうか?書いていないので、恐らくMayaコマンドだろうかと思います。

 

今回はPymelです。
やはりノード関連はPymelが手っ取り早い。
時間があるときにじっくりとスクリプトを作ることができれば良いのだろうけれど、大抵ツールというのは、
現場で作業をしていて、まどろっこしい部分をなんとか手早くしたい。という感じで作るので、そんな時にPymelは重宝します。

 

ただ、メッシュのシェイプノードには、numTriangles()というメソッドがあり、APIを見ても三角ポリゴンの数を返してくれる感じですが、
エラーが帰ってきます。
色々とためしてみると、numSelectedTriangles()というメソッドがどうも色々と情報を返してくれます。
引数にゼロを渡し、numSelectedTriangles(0)などとすると、
{‘vertexComponent’: 0, ‘shell’: 1, ‘triangle’: 760, ‘faceComponent’: 0, ‘vertex’: 382, ‘face’: 400, ‘triangleComponent’: 0, ‘edge’: 780, ‘uvcoord’: 439, ‘uvComponent’: 0, ‘edgeComponent’: 0}
こんな感じに、たくさん情報を返してくれます。なんか色々できそうですねぇ。

 

さて、それでは実践です。
ゲームモデルでは大抵命名規則が決まっていて、ツールが目的のノードやアトリビュートを探しやすくなっています。
今回はモデルデータのトップノードには「_mdl」というサフィックスが付く、という前提で話を進めます。
目的は、読み込んだ複数のモデルデータのそれぞれのポリゴン数を調べることと、そのポリゴン数を1.5倍した数を端数を切り捨てた数が知りたい。
というちょっとややこしいものです。
さらには、トップノード以下の命名規則はなく、中には「_mdl」のサフィックスがついたものもあったり、複数のジオメトリで構成されていたり、というものです。
随分と仕事的な感じがします。
2016_07_28_108
こんな感じです。
で、スクリプトを実行すると、
2016_07_29_109
こんな感じになります。ちょっと見にくいですね、、すみません。
コードを貼り付けるので、実際にやってみてください。

import pymel.core as pm

def poly_count():
	sel = pm.ls( "*_mdl", type=pm.nt.Transform )
	if not sel:
		return
	root = list(set([x.root() for x in sel]))
	if not root:
		return
	print "{0:=<80}".format("")
	for s in sorted( root ):
		num = []
		[ num.append( x.numSelectedTriangles(0)["triangle"] ) for x in s.listRelatives( ad=1, s=1 ) if type( x )==pm.nt.Mesh ]
		goukei = sum( num )
		gPlus = goukei * 1.5
		print "{0:-<50}".format("")
		print s.name()
		print goukei
		print int( round( gPlus, -int( len( str( int( gPlus ) ) ) / 2 )) )
	print "{0:=<80}".format("")
poly_count()

Mayaでのパターン選択。
また躓きました、、
でもやっぱり
2016_07_29_110
こういうのって、出来ると助かりますよねぇ。
そんなに頻繁に出番はないけど。
Mayaでモデリングしいて、できない事を思い出すと、ちょっとショックを受けます。

Maya Script – MODOのパターン選択

以前ちょっと挑戦した、MODOのパターン選択をMayaで再現するのを試しておりました。
Mayaも2016になり、だいぶモデリングが強化されMODOにない機能なども搭載されておりますが、
やはり、ハンドリングの軽さはMODOの方が良いなぁ、、ストレス溜まる、、

 

でも、MODOも10になり、プロシージャルモデリングを始め、様々な機能が追加されましたが、
起動が重くなり、尚且つとても落ちやすい、、更には古いスクリプトで作られた、
特定の角度で隣接するフェイスのエッジを選択するツールなどで、選択されるエッジの一部選択解除などができない、、
スクリプトで選択されるのは、手で選択するのと、内部的に違いが生じるようになったのでしょうか、、困ったものだ。

 

で、本題のパターン選択です。
MODOでは、例えば一つおきにポリゴンを選択したい時に、始めの2つのポリゴンをそのように選択し、「↑」キーを押すと、
そのパターンのまま、一つ飛ばしにポリゴンが選択されます。
最初の2つのパターンをその後の選択に適応することから、パターン選択とよばれます。
何気に便利な機能なので、以前からMayaにも移植できないか、とあがいていたのですが、ようやく出来ました。

 

2016_07_20_102
一つ飛ばしは、こんな感じです。
2016_07_20_103
4つ飛ばしは、こんな感じです。
2016_07_20_104
でも、2つ飛ばしはこんな感じです、、

 

MODOでもジオメトリの面の数と、選択の面の数によっては、おかしくなるので、これは致し方のないことだとは思います。
まだフェイスだけで、エラー処理も書いていないので、拡張、デバッグが済んだら公開します。
やっぱり、MODOのようにキーを押して拡張が1つずつ実行される方が便利だなぁ。
そうそう、「polySelectSp」というコマンド、マニュアルに乗っておりませんが、

from maya import cmds
print cmds.polySelectSp( "pCylinder1.e[140]", q=1, ring=1 )

というような使い方ができます。
上記を実行すると、シリンダーのインデックスが140のエッジのリングを返してくれます。
さらに、「polySelect」というコマンドでパターンの抽出ができます。
なので、MayaコマンドとPythonの便利機能を組み合わせると、割りと簡単にできてしまうようです、、
それに気づくまでに随分と時間がかかりました。

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

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

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