『Maya Python API 2.0 入門編『最近接頂点の取得』』で行った関数を使ってスナップツールを実装してみました。
管理人は最近接頂点のスナップツールはかなりの頻度で利用します。
結構使えると思うので実装チャレンジしてみてくださいね。
管理人がYouTubeで解説!
サンプルコード
1.入門編で作ったツールを関数化しましょう。
in_pos、in_meshを引数に置き換えました。
戻り値は最近接頂点を返すように変更しただけです。
『Maya Python API 2.0 入門編『最近接頂点の取得』』のサンプルコードと比較するとわかりやすいかもしれません。
from maya import cmds
from maya.api import OpenMaya as om2
def getClosestVertexPoint(in_pos, in_mesh):
# 選択リストを作ってターゲットメッシュを追加する
sl = om2.MSelectionList()
sl.add(in_mesh)
# 選択リストの0番目の要素をMDagPath型で取得する
dagpath = sl.getDagPath(0)
# 取得したMDagPathをMFnMeshに入れる
mesh = om2.MFnMesh(dagpath)
# MFnMeshのコマンドが使えるようになったので最近接頂点取得コマンドを使ってみる。
poly_pt, poly_id = \
mesh.getClosestPoint(om2.MPoint(in_pos),om2.MSpace.kWorld)
# 指定したポリゴン内の頂点IDを取得する
poly_ids = mesh.getPolygonVertices(poly_id)
# 入力頂点から最も近い頂点IDの位置を取得する
closest_vtx_pos = None
temp_length = None
for i in range(len(poly_ids)):
temp_pos = mesh.getPoint(poly_ids[i], om2.MSpace.kWorld)
delta = (temp_pos - om2.MPoint(in_pos)).length()
if temp_length is None or delta < temp_length:
closest_vtx_pos = temp_pos
temp_length = delta
return list(closest_vtx_pos)[:3]
2.1の関数を使ってスナップツールを実装する
from maya import cmds
from maya.api import OpenMaya as om2
# スナップ先のポリゴンメッシュ名
tgt= "tgtShape"
# 選択頂点でリストを作ってくれる。cmds.ls(sl=True)みたいなもの。
sl = om2.MGlobal.getActiveSelectionList()
# メッシュのDagPathと頂点といったコンポーネント情報を取得
dagpath, obj = sl.getComponent(0)
# 頂点のインデックス情報を取得できるのがMFnSingleIndexedComponent
fn_comp = om2.MFnSingleIndexedComponent(obj)
ids = fn_comp.getElements()
# 以下で作った関数を利用してスナップまで行う
fn_mesh = om2.MFnMesh(dagpath)
for i in range(len(ids)):
vtx_point = fn_mesh.getPoint(ids[i], om2.MSpace.kWorld)
closest_point = getClosestVertexPoint(vtx_point, tgt)
cmds.xform("{0}.vtx[{1}]".format(dagpath.fullPathName(), ids[i]), t=closest_point, ws=True)
おまけ
xformでシンプルに1の関数を使った場合。
from maya import cmds
from maya.api import OpenMaya as om2
# 選択した頂点を保存しておく
vtxs = cmds.ls(sl=True,fl=True)
for vtx in vtxs:
in_pos = cmds.xform(vtx, q=True, t=True)
closest_pos = getClosestVertexPoint(in_pos, "tgtShape")
cmds.xform(vtx, t=closest_pos, ws=True)
コメント