Maya Script Pymel API2.0 – ピボットの修正2

以前modoからモデルデータをFBXなどでMayaに持っていった後に、
各ジオメトリのピボットをバウンディングボックスの中心に設定するスクリプトを書きました。
しかし、使ってみると色々と修正するべき点があったので、それを修正しました。

import pymel.core as pm

def set_bb_center_pymel():
	sel = [x for x in pm.ls(sl=1,type=pm.nt.Transform) if x.getShape() and type(x.getShape())==pm.nt.Mesh]
	if sel:
		for s in sel:
			bbc = s.getBoundingBox().center()
			s.setTranslation([-x for x in bbc],"world")
			pm.makeIdentity(s,a=1)
			s.zeroTransformPivots()
			s.setTranslation(bbc,"world")
set_bb_center_pymel()

Pymelでやるとこんな感じです。
Pymelのメソッドを使いまくって、簡単に書いております。
バウンディングボックスの中心点を求め、それにマイナスした値で移動させると、ジオメトリが原点に行きます。
その後、トランスフォームのフリーズを行い、ピボットをゼロにして、以前求めたバウンディングボックスの中心点に
ジオメトリを移動させて終了です。

 

これをAPI2.0でやるとどうなるのだろうか、と思い立ったので、やってみました。

import maya.api.OpenMaya as om2

def set_bb_center_om2():
	selList = om2.MGlobal.getActiveSelectionList()

	if not selList:
		return

	selObj = []
	selMesh = []
	
	for x in range(selList.length()):
		try:
			mDag,mCmp = selList.getComponent(x)
		except:continue
		
		if mDag.hasFn(om2.MFn.kMesh):
			selObj.append(om2.MFnTransform(mDag))
			selMesh.append(om2.MFnMesh(mDag))

	if selObj:
		for t,m in zip(selObj,selMesh):
			pCenter = t.translation(om2.MSpace.kWorld)
			mPoints = m.getPoints(om2.MSpace.kWorld)
			xPoints = []
			yPoints = []
			zPoints = []
			[[xPoints.append(x.x),yPoints.append(x.y),zPoints.append(x.z)] for x in mPoints]
			#bBox = [[min(xPoints),min(yPoints),min(zPoints)],[max(xPoints),max(yPoints),max(zPoints)]]
			bBoxCenter = om2.MVector(sum(xPoints)/len(xPoints),sum(yPoints)/len(yPoints),sum(zPoints)/len(zPoints))
			if (round(pCenter.x,4),round(pCenter.y,4),round(pCenter.z,4)) == (round(bBoxCenter.x,4),round(bBoxCenter.y,4),round(bBoxCenter.z,4)):
				continue
			m.setPoints([x.__isub__(bBoxCenter) for x in mPoints],om2.MSpace.kWorld)
			t.setTranslation(bBoxCenter,om2.MSpace.kWorld)
set_bb_center_om2()

こんな感じになりました。
やっている手順は同じです。ただ、注意しなくてはならない点は、プラグイン化していないので、取り消しが効きません。
処理が簡単なので、Pymelでやってもさほど重さは感じないので、Pymelを使ったほうが良いかと思います。

 

APIにはMBoundingBoxというクラスがあるので、それを使ってみようかと思ったのですが、Mpointの最小値と最大値を渡して作るようで、
それなら自分で求めたほうが楽かなぁ、と使いませんでした。コメントアウトされている箇所は、バウンディングボックス自体を求めております。
この辺りもPythonの組み込み関数に頼りっぱなしです。

 

APIではトランスフォームノードだけでなく、メッシュノード自体にも編集を加えます。
メッシュ全体の頂点を直接移動させています。本当に正しいやり方かは知りません。
色々とやってみたのですが、トランスフォームノードだけではどうにもなりませんでした。
行列にもちょっと手を出してしまいました。
最終的には頂点を直接編集する方法を選びました。さすがにAPIでもそれは遅いだろう。と思っていたのですが、
それでもPymelより早いです。

 

中々スキニングクラスターの編集には至りませんが、APIで色々と作って慣れてゆくしか方法はなさそうです。
でもなんでこんなに情報が少ないのだろうか?結局1.0の方ができることが多いのだろうか?
まぁ、その辺も含めてとにかくやってみて知ってゆこう。

コメント/トラックバック (1件)

  1. CG なんて ららら のコメント:

    […] 技研 | Maya Script Pymel API2.0 – ピボットの修正2 […]

コメントする

post date*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トラックバックする

トラックバック用URL:

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

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

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