Maya Script Python 頂点のスムージング

import maya.cmds as cmds
import maya.mel

#
#	http://giken.workarea.jp/
#	2012/5/25
#

def gkn_average_vertex(oVtx):
	cmds.polyAverageVertex(oVtx,i= 0)

def gkn_average_vertex_setvalue(oVtx):
	oVal= cmds.intField("Average_Vertex_Value",q= 1,v= 1)
	oSmoothVtx= cmds.ls(cmds.listHistory(cmds.ls(sl= 1,o= 1)),type= "polyAverageVertex")
	if oSmoothVtx != [] and set(oVtx) == set([cmds.ls(sl= 1,fl= 1)[0].split(".")[0]+"."+x for x in cmds.getAttr(oSmoothVtx[0]+".inputComponents")]):
		cmds.setAttr(oSmoothVtx[0]+".iterations",oVal)
		cmds.intSlider("Average_Vertex_Slider",e= 1,v= oVal)

def gkn_average_vertex_slidevalue(oVtx):
	oVal= cmds.intSlider("Average_Vertex_Slider",q= 1,v= 1)
	oSmoothVtx= cmds.ls(cmds.listHistory(cmds.ls(sl= 1,o= 1)),type="polyAverageVertex")
	if oSmoothVtx != [] and set(oVtx) == set([cmds.ls(sl= 1,fl= 1)[0].split(".")[0]+"."+x for x in cmds.getAttr(oSmoothVtx[0]+".inputComponents")]):
		cmds.setAttr(oSmoothVtx[0]+".iterations",oVal)
		cmds.intField("Average_Vertex_Value",e= 1,v= oVal)

def gkn_smooth_vertex_slider_val():
	oVal= cmds.floatSlider("Smooth_Vertex_Slider",q= 1,v= 1)
	cmds.floatField("Smooth_Vertex_Value",e= 1,v= oVal)

def gkn_smooth_vertex_field_val():
	oVal= cmds.floatField("Smooth_Vertex_Value",q= 1,v= 1)
	cmds.floatSlider("Smooth_Vertex_Slider",e= 1,v= oVal)

def gkn_smooth_vertex():
	oVal= cmds.floatField("Smooth_Vertex_Value",q= 1,v= 1)
	maya.mel.eval('artPuttyToolScript 4;')
	cmds.artPuttyCtx(cmds.currentCtx(),e= 1,mtm= "smooth")
	cmds.artPuttyCtx(cmds.currentCtx(),e= 1,si= 1)
	cmds.artPuttyCtx(cmds.currentCtx(),e= 1,op= oVal)
	cmds.artPuttyCtx(cmds.currentCtx(),e= 1,clr= 1)
	if cmds.selectContext("selectContext1",ex=1,q=1) == False:
		cmds.selectContext(n="selectContext1")
	cmds.setToolTo("selectContext1")

def gkn_smooth_vertex_update_window():
	oVtx= cmds.ls(sl= 1)
	cmds.intField("Average_Vertex_Value",e= 1,v= 0)
	cmds.intSlider("Average_Vertex_Slider",e= 1,v= 0)
	if cmds.filterExpand(sm= 31) != None:
		cmds.intField("Average_Vertex_Value",e= 1,cc= "gkn_average_vertex_setvalue("+str(oVtx)+")")
		cmds.intSlider("Average_Vertex_Slider",e= 1,dc= "gkn_average_vertex_slidevalue("+str(oVtx)+")")
		cmds.button("gkn_Average_Vertex",e= 1,c= "gkn_average_vertex("+str(oVtx)+")")

def gkn_smooth_vertex_window():
	if cmds.window("Average_VertexUI",q= 1,ex= 1) :
		cmds.deleteUI("Average_VertexUI")
	svwin= cmds.window("Average_VertexUI",title= "Gkn Smooth Vtxs",w= 200,h= 50)
	cmds.columnLayout(adj= 1)
	cmds.rowLayout(nc= 2,adj= 2,cw2= (50,150))
	cmds.intField("Average_Vertex_Value",w= 50,min= 0,max= 10,v= 0,s= 1)
	cmds.intSlider("Average_Vertex_Slider",min= 0,max= 10,v= 0,w= 100)
	cmds.setParent('..')
	cmds.button("gkn_Average_Vertex",l= "Average Vertexs",w= 100)
	cmds.rowLayout(nc= 2,adj= 2,cw2= (50,150))
	cmds.floatField("Smooth_Vertex_Value",w= 50,min= 0,max= 1,v= 1,s= 0.01,pre= 2,cc= "gkn_smooth_vertex_field_val()")
	cmds.floatSlider("Smooth_Vertex_Slider",min= 0,max= 1,v= 1,w= 100,s= 0.01,dc= "gkn_smooth_vertex_slider_val()")
	cmds.setParent('..')
	cmds.button("gkn_Smooth_Vertex",l= "Smooth Vertexs",w= 100,c= "gkn_smooth_vertex()")
	cmds.scriptJob(p= "Average_VertexUI",e= ["SelectionChanged","gkn_smooth_vertex_update_window()"])
	cmds.scriptJob(p= "Average_VertexUI",e= ["Undo","gkn_smooth_vertex_update_window()"])
	cmds.scriptJob(p= "Average_VertexUI",e= ["Redo","gkn_smooth_vertex_update_window()"])
	gkn_smooth_vertex_update_window()
	cmds.showWindow(svwin)
gkn_smooth_vertex_window()

スクリプトエディタを「Python」にして、上記のコードをペーストし実行するとウィンドウが表示されます。
image938l
簡単なウィンドウです。

 

前回、頂点のスムージングが見つからない。と書きましたが、書いたそばから見つけました。
ポリゴンメニューバーの、メッシュ>頂点の平均化でした。
しかし、昔の記憶を辿ると、スキニングのスムージングのようにペイントでスムーズが出来たことを思い出し、
探してみました。
同じくポリゴンメニューバーの、メッシュ>ジオメトリのスカルプトツールでした。

 

で、このスクリプトを作った時は、平均化のコマンドしか知らなかったので、まずはそれを実装しました。
そののち、スカルプとツールも実装できるのでは?と思い、実装してみたら出来ました。
ただ、困ったことに使い方が全く違う。そういったものを一つのウィンドウに収めるのはいかがなものか?
と、思いましたが、基本的に自分で使うものなので、いいや、とまとめてしまいました。
こういうことをすると、忘れた時に自分が困る。そして、当時の自分に横着するな、と突っ込む。

 

では、使い方です。
ウィンドウの上のスライダーとボタンが、頂点の平均化コマンドで使用するもので、
下のほうがスカルプとツールで使用するものです。どちらも頂点を丸めることを目的としています。

 

上の方の画像にありますが、乱雑に並んだ頂点で実行してみました。
Mayaでの作り方を調べるのが面倒なので、modoで作って持ってゆきました。ジッターです。
一番左のジオメトリが持ってきたそのままです。
真ん中が頂点の平均化で、丸めたものです。10の値で3回かけました。
右がスカルプトツールで丸めたものです。1の値で3回かけました。

 

因みにこちらの画像の右側がmodoのスムースを強さ1、反復30でかけたものです。
image939l

 

使い方の説明をしようと思い、話がそれました。
頂点の平均化は、ヒストリとして動作するのでノードが残ります。
出来れば、メニューバーの、編集>種類ごとに削除>デフォーマ以外のヒストリを実行してください。
ツールを使用した後も使ったほうが良いかと思います。
で、肝心の使い方は、均したい頂点を選択し、「Average Vertexs」ボタンを押します。
その後、スライダを動かして値を調整します。リアルタイムで変更できます。
決まったらデフォーマ以外のヒストリを削除して、もう一度同じ手順を繰り返すと、更に均すことが出来ます。
はじめからもっと大きな値を入れられるようにしたほうがいいのでは?とおもわれるかも知れませんが、
どうも10以降大して変化がないので10にしました。
要するに、こちらの機能は、ボタンを押す、値を決める。という手順です。
 

そして、下のスカルプとツールです。
こちらは反対で、設定できる値は、ブラシの透明度(?)です。要するにどれくらいの強さで掛けるかと言う事です。
その値を決定し、「Smooth Vertexs」を押すと実行されます。こちらはヒストリに残りません。
※追記2012/5/25
こちらの機能は頂点選択か、オブジェクト選択で機能します。
頂点の場合は選ばれている頂点に対して作用します。

 

どうも自分が探していた機能は後者のようです。
で、今回の収穫としては、melを読みこまなくてもペイントツールにアクセスできるようになった。ということでしょうか。
因みに参考とした、ペイントツールのコマンドは、
C:\Program Files\Autodesk\Maya2013\scripts\others\
にある、artPutty~.melとある、ファイル群です。
なるほどねぇ、そうやるんだ。という感じです。

 

調子に乗って、スキンウェイトのペイントにもアクセスしてみましたが、ある程度は出来たのですが、
コンフィグに書き込まれてしまったのか、ペイント自体の機能が変わってしまいました。
こんな事もあろうかと、Mayaやmodoのコンフィグは起動時にバックアップを取るように設定しておりました。
無きゃ無いで仕方がないが、あれば助かる。

 

image940l
ZBrushで作成中です。3DcoatとMudboxのリトポ、どちらがどうなのか。比べるためのものです。
久しぶりに触ると、やっぱり面白い。Cray系のブラシの素晴らしさに改めて関心です。他を触るとその差が歴然とする。
で、自分の誤作動の原因も分かりました。
パソコンが遅いせいでした。微量な遅延があったせいで、良く誤作動を起こしていたようです。
会社では全く誤作動がないので気が付きました。
まぁ、使えているから取り立てて文句はない。

※注記
すみません、、どうやらこのスクリプトを使用してスカルプとツールを起動するとスキニングウェイトのペイントモードが壊れるように、
スカルプとツールのペイントも壊れるようです。
修正できたら上げ直しますので、使用は控えてください。

 
※さらに注記
とりあえず、melを使うことで回避できました。うーん、ちょっと悔しい。

 

調べてみると、rememberCtxSettingsという関数が鍵を握っているようです。
で、ネットでその関数がどこにあるのか調べてみると、C:\Program Files\Autodesk\Maya2013\scripts\startup\initContexts.mel
にありました。
Pythonに移植できないか、と、見てみましたが、長い、、面倒くさい、、
いいや、mel使えば。と諦めました。

コメントする

post date*

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

トラックバックする

トラックバック用URL:

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

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

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