見出し画像

【MAYA】最初に選択された頂点に向かって頂点を結合する

地味ツールです。
TargetWeldツールは別オブジェクトが前面にあったりするとうまく選択できず、MargeVertexCenterのほうが使いやすいシーンが多いですが、真ん中に移動してほしくないときあるんですよね。
なので作りました。

  • 最初に選択された頂点に向かって頂点結合します。

  • UVは保持されます。

  • シンメトリーモードにも対応してます。

  • たぶん動きます。

  • MAYA2023にて動作確認済み

うまく動作しない場合
PreferencesのSelectionの中にあるAuto-select set members in the OutlinerをオンにしてMAYAの再起動などを試みてください。
https://note.com/mk_laboratory/n/n696053dade5a
うまく挙動は掴めてませんがそれで使えるようになるようです。

import maya.cmds as cmds

def MergeVerticesFirst():
    # 頂点を選択
    selected_vertices = cmds.ls(os=True, fl=True)
    if not selected_vertices:
        raise Exception("No vertices selected")

    # 最初に選択した頂点の座標を取得
    first_vertex_position = cmds.xform(selected_vertices[0], query=True, worldSpace=True, translation=True)

    # マージされた頂点を最初の頂点の位置に移動(UVが保持されます)
    cmds.xform(selected_vertices, worldSpace=True, puv=True,translation=first_vertex_position)

    # 頂点のマージ
    cmds.polyMergeVertex(d=0.01)
    cmds.warning(u'Marged Virteces to first!')

def SymetricMergeVerticesFirst():
    # シンメトリーモード設定の保存
    symmetry_axis = cmds.symmetricModelling(query=True, axis=True)
    symmetry_tolerance = cmds.symmetricModelling(query=True, tolerance=True)

    # 選択された頂点の順序を保存
    selected_vertices = cmds.ls(os=True, fl=True)
    if not selected_vertices:
        raise Exception("No vertices selected")

    # 正負の頂点を分ける
    positive_vertices = []
    negative_vertices = []
    for v in selected_vertices:
        pos = cmds.pointPosition(v, world=True)
        if (symmetry_axis == 'x' and pos[0] >= 0) or (symmetry_axis == 'y' and pos[1] >= 0) or (symmetry_axis == 'z' and pos[2] >= 0):
            positive_vertices.append(v)
        else:
            negative_vertices.append(v)

    # 最初に選択された正負の頂点の座標を取得
    first_positive_vertex = positive_vertices[0] if positive_vertices else None
    first_negative_vertex = negative_vertices[0] if negative_vertices else None
    first_positive_position = cmds.pointPosition(first_positive_vertex, world=True) if first_positive_vertex else None
    first_negative_position = cmds.pointPosition(first_negative_vertex, world=True) if first_negative_vertex else None

    # 頂点の移動
    if positive_vertices and first_positive_position:
        cmds.xform(positive_vertices, worldSpace=True, puv=True, translation=first_positive_position)

    if negative_vertices and first_negative_position:
        cmds.xform(negative_vertices, worldSpace=True, puv=True, translation=first_negative_position)

    # 頂点の結合
    all_vertices = positive_vertices + negative_vertices
    if all_vertices:
        cmds.polyMergeVertex(all_vertices, d=symmetry_tolerance)

# シンメトリーモードの状態を検出
symmetry_mode = cmds.symmetricModelling(query=True, symmetry=True)
if symmetry_mode:
    # シンメトリーモードがオンの場合の処理
     SymetricMergeVerticesFirst()
else:
    # シンメトリーモードがオフの場合の処理
    MergeVerticesFirst()

・AIによるアシスタントを活用しながら作成しています。

更新:
2024/04/05
負側の頂点など一部の条件において結合されない問題を解消
2024/01/01
Auto-select set members in the Outlinerをオンにするスクリプトを削除。
かわりに解説で補足

この記事が気に入ったらサポートをしてみませんか?