見出し画像

【MAYA】表と裏の頂点位置を揃える Move Vertex to nomalvector

地味に使えるツールができた気がします!
1つ目に選択した頂点位置に2つ目以降の頂点位置をあわせて、頂点位置を揃えます。

スカートとか服作ってるとズレた裏表面の頂点位置を揃えたい時ありますよね

1つ目の頂点に合わせて2つ目以降の頂点を移動します。
動作としては法線方向が描く直線上の最近接座標に頂点を移動します。

法線方向を基準に整列する。と言ったほうがわかりやすいかもですね。

法線方向がいい感じになっている部分にしか使えないと思うので、なだらかなカーブを描く布モデルとかには有効です。
逆に急激に折れ曲がって法線が乱れているようなモデルだと意図した位置に来ないこともあるかと思います。

#Move Vertex to nomalvector 

import maya.cmds as cmds
import maya.api.OpenMaya as om

def get_vertex_normal(vertex):
    # 頂点のインデックスを取得
    index = int(vertex.split('[')[-1][:-1])

    # オブジェクトの名前を取得
    obj_name = vertex.split('.')[0]

    # オブジェクトのDAGパスを取得
    dag_path = om.MSelectionList().add(obj_name).getDagPath(0)

    # オブジェクトのメッシュを取得
    mesh = om.MFnMesh(dag_path)

    # 頂点の法線を取得
    normal = mesh.getVertexNormal(index, True, om.MSpace.kWorld)
    return normal

def move_vertex_along_normal(base_vertex, target_vertex):
    # 基準頂点の法線を取得
    normal = get_vertex_normal(base_vertex)

    # 基準頂点の座標を取得
    base_position = cmds.pointPosition(base_vertex, world=True)

    # 対象頂点の座標を取得
    target_position = cmds.pointPosition(target_vertex, world=True)

    # 法線方向の単位ベクトルを計算
    normal_vector = om.MVector(normal).normal()

    # 対象頂点から基準頂点へのベクトルを計算
    target_vector = om.MVector(target_position) - om.MVector(base_position)

    # 法線方向に投影した距離を計算
    distance = target_vector * normal_vector

    # 最接近点の座標を計算
    closest_point = om.MVector(base_position) + normal_vector * distance

    # 対象頂点を最接近点に移動
    cmds.move(closest_point.x, closest_point.y, closest_point.z, target_vertex, absolute=True, worldSpace=True)

# 最初に選択した頂点の法線方向に沿って、次に選択した頂点を移動
selection = cmds.ls(os=True, flatten=True)
print(selection)
base_vertex = selection[0]
for target_vertex in selection[1:]:
    move_vertex_along_normal(base_vertex, target_vertex)

MAYA2024で動作確認をしています。
本ツールはAIアシスタントを利用し作成しています。

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