Maya Python API 2.0 応用編『最近接頂点スナップツールを作る』

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)

関連記事

  1. キューブ1個で15分で作る!ビル景観のプロトタイピング!

    2021-07-21

  2. Blend Shapeが壊れる?Transfer Vertex Orderで解決だ!

    2021-09-13

  3. 『God of War』から学ぶ”三平方の定理”

    2021-01-05

  4. ウェイトを非破壊かつ半自動で付けるテクニック

    2024-04-20

コメントをお待ちしています。

コメント

ABOUT

テクニカルアーティストの為のまとめサイトです。

本サイトでは、『YouTube ✕ Blog』を中心に
情報発信をしていきます。

また、テクニカルアーティストとしての様々な
ライフハック記事も投稿予定です。

限定情報会員

PATREONでは、限定情報やサンプルファイルの配布も行っています。登録頂けると更新頑張れます。支援の方よろしくお願いします。


免責事項

本ウェブサイト内で公開している全ての情報の有用性や安全性については当方は一切の保証を与えるものではありません。
利用したことによって引き起こる直接および間接的な損害に対して当方は一切責任を負うものではありません。
全て自己責任でご使用ください。

3DCGBOOK出版

BOOTHで技術書を販売利しております。







スポンサー

ページ上部へ戻る