Maya Script Python – UVアイランドの整列

前回の記事の続きです。
元ネタはこちらの記事です。

MODOの標準のUV編集がそれなりに強力な上、フリーのツールがさらに強力なので、そもそもMayaでUVを編集することがないので、
MayaでのUV編集スクリプトを書く機会がありません。
何気なく見つけた記事で、これはpymelのオブジェクトを使ってやったらどうなるかぁ、というただの好奇心で作ってみました。

import pymel.core as pm
import maya.cmds as cmds

def rotAlignUV():
	oderFlag = cmds.selectPref(q=1,tso=1)
	
	if not oderFlag:
		cmds.selectPref(tso=1)
	
	sel = cmds.ls(os=1,fl=1)
	
	comp = cmds.filterExpand(cmds.polyListComponentConversion(sel,tuv=1),sm=35,ex=1)
	
	if not comp or len(comp) != 2:
		cmds.confirmDialog(t = "rotAlignUV",m = u"2点のUVを選択してから実行して下さい",b="OK",db="OK",ds="OK")
		return
	
	uvs = cmds.polyEditUV(comp[:2],q=1)
	vec1 = pm.datatypes.Vector(uvs[0],uvs[1],0)
	vec2 = pm.datatypes.Vector(uvs[2],uvs[3],0)
	cDir = vec2 - vec1
	aVec = pm.datatypes.Vector(0,1,0)
	angle = pm.datatypes.degrees(aVec.angle(cDir))
	axis = aVec.axis(cDir,normalize=1)
	
	cmds.polyEditUVShell(pu=uvs[0],pv=uvs[1],a=-1*axis[2]*angle)
	
	cmds.selectPref(tso=oderFlag)

rotAlignUV()

元のコードよりも長くなっていますが、エラー処理などを含んでいるためです。
Vectorクラスやdegressクラスを使って簡単にしてみたつもりです。最終的な変換はEulerRotationクラスを使うべきだったのかなぁ?
「-1*axis[2]*angle」などと冗長な感じがします。

 

データの扱いはpymelに任せて、実際のコンポーネントの編集はMayaコマンドに任せております。
やはりコンポーネントの編集をpymelでやるのは勇気が入ります、、
 

で、前回の記事「選択順のトラック」を関数が使用されている間は、機能オンにし、終了次第元の設定に戻す。というようにしています。
でも、このスクリプト、使ってみるともう一つ工夫が必要なことに気が付きます。
垂直軸に対して、より少ない角度の方に揃えてほしいなぁ。と感じてしまいます。
ベクトルの計算何でしょうねぇ。どんな感じか、気にはなるので多分調べると思うのですが、ツールとしてはこういた編集はMODOでやるので、
興味は無いなぁ。という感じです。

コメントする

post date*

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

トラックバックする

トラックバック用URL:

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

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

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