modo Script Python モデルの中心線をXゼロに設定
# python import lx fg = lx.eval("query layerservice layers ? fg") if (lx.eval("select.typeFrom {edge;polygon;item;vertex} ?") and lx.eval("select.count edge ?") or lx.eval("select.typeFrom {polygon;item;vertex;edge} ?") and lx.eval("select.count polygon ?") or lx.eval("select.typeFrom {vertex;edge;polygon;item} ?") and lx.eval("select.count vertex ?")): lx.eval("select.convert vertex") lx.eval("select.connect") else: lx.eval("select.typeFrom vertex true") lx.eval("select.drop vertex") lx.eval("select.invert") vtx = lx.eval("query layerservice verts ? selected") lx.eval("select.drop vertex") [lx.eval("select.element {0} vertex add index:{1}".format(fg,v)) for v in vtx if lx.eval("query layerservice vert.pos ? {0}".format(v))[0] == 0] if lx.eval("query layerservice verts ? selected"): lx.eval("select.convert edge") lx.eval("select.edgeLoop base false m3d") lx.eval("select.convert vertex") vtx = lx.eval("query layerservice verts ? selected") lx.eval("select.drop vertex") [lx.eval("select.element {0} vertex add index:{1}".format(fg,v)) for v in vtx if not lx.eval("query layerservice vert.symmetric ? {0}".format(v))] lx.eval("vert.set x 0.0")
前回のスクリプト、半分選択にバグがありました。修正版を上げておきました。すみません。
modoでは取得するものが複数あれば配列、そうでなければ文字列として返ってくる。ということを忘れておりました。
「lx.eval」では頂点を一つしか選択していないときは配列として返って来ません。なので「lx.evalN」でそれがどのようなものでも配列で返すようにしました。
さて、今回のスクリプトは中心線がXゼロから少しずれているものをXゼロに設定するものです。
動作としては、
このように中心線がずれているモデルを用意し、スクリプトを実行します。
選択があれば、そのメッシュだけ、なければそのレイヤーすべてのメッシュに適用されます。
こんな感じです。
交差しているモデル、穴の開いたモデルでも対応できます。
「query layerservice vert.symmetric ?」便利ですねぇ。Mayaにも同じ物が欲しいです。
「?」マークの後ろに頂点インデックスをつけるとそれに対応したシンメトリーの頂点のインデックスを返してくれます。
しかし、作っておいてなんですが、エッジ選択のダブルクリックでループを選択し「vert.set x 0.0」をショートカットに割り当てた方が圧倒的に早いです。
試しにZBrushで随分前に作ったモデルでテストします。
恐らくこのモデルの中心線はループ選択されている場所だと思います。
スクリプトを適用するとこんな感じです。
このスクリプトの欠点は、ゼロにかかる頂点が幾つか存在しなければなりません。
そうでない場合は、反応なしです。
うーん、使えるのかなぁ、、
コメントする
トラックバックする
トラックバック用URL: