【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をオンにするスクリプトを削除。
かわりに解説で補足
この記事が気に入ったらサポートをしてみませんか?