liquidjumper MAYA,Python [MAYA] Pythonでエッジやフェースをカットする

[MAYA] Pythonでエッジやフェースをカットする

maya_python_edge_face_polysplit_topimage

MAYAのエッジやフェースをMELスクリプトでカットするには


[polySplit]コマンドのエッジは [-edgepoint] 、フェースは[-facepoint] フラグを使います。


しかし、Pythonでこの2つのフラグの使用は推奨されてません


本記事では、MAYAのメッシュオブジェクトのエッジやフェースをPythonスクリプトでカットする方法を紹介します。




Pythonスクリプトでエッジをカットする

MELと同様にPythonでエッジをカットする場合もコマンドは

polySplit


そしてフラグには

insertpoint(ip)

を使います。


insertpoint(ip)フラグで、挿入する頂点の位置を指定する方法は、

ip=[(エッジのインデックス, エッジに挿入する頂点位置のパーセンテージ)]


インデックス[2]のエッジの中間地点[0.5]に新しい頂点を追加するには次のように書きます。

import maya.cmds as cmds

cmds.polySplit( ip=[(2, 0.5)] )


オブジェクトを選択してスクリプトを実行すると、インデックス[2]のエッジの中間地点に頂点が追加されました。

Pythonスクリプトでエッジをカットする

選択したエッジを中央でカットする

エッジのインデックスについてもう少し詳しく解説すると、

insertpoint(ip) フラグの第1引数に指定するエッジのインデックスは、オブジェクトのエッジを選択して次のコードを実行

import maya.cmds as cmds

select_edge = cmds.ls(sl=True)
print(select_edge[0])


返されたエッジ名に付いてる [3] がインデックス番号を指します。

pCube2.e[3]


ポリゴンオブジェクト「pCube2」の選択したエッジの名前が「pCube2.e[3]」

「pCube2」の選択したエッジの名前が「pCube2.e[3]」


例えば、選択したエッジの中間地点に頂点を追加するコードを書くとしたら次のようになります。

import maya.cmds as cmds 
import re

select_edge = cmds.ls(sl=True)

#エッジ「pCube2.e[3]」から正規表現を使ってエッジのインデックス番号 3 を取り出す
select_edge_name = select_edge[0] 
RE_EDGE_INDEX = re.compile(r'\[(?P<select_edge_name>[\d]+)\]') 
match_edge_index = RE_EDGE_INDEX.search(select_edge_name) 
edge_index = int(match_edge_index.group('select_edge_name'))

cmds.polySplit( ip=[(edge_index, 0.5)] )


ポリゴンオブジェクト「pCube2」のエッジを選択して、上記のコードを実行すると、選択したエッジの中間地点に頂点が追加されました。

選択したエッジの中間地点に頂点が追加されました。

エッジを7:3でカットする

頂点を追加する位置を中間地点以外の位置にするには、insertpoint(ip) フラグの第2引数に指定する値を変更します。


中間地点の「0.5」を「0.7」又は「0.3」にすると7:3の位置に頂点が追加されます。

※「0.7」と「0.3」のどちらが7:3になるのかはメッシュが生成される順番・並びで変わります。

import maya.cmds as cmds 
import re

select_edge = cmds.ls(sl=True)

select_edge_name = select_edge[0] 
RE_EDGE_INDEX = re.compile(r'\[(?P<select_edge_name>[\d]+)\]') 
match_edge_index = RE_EDGE_INDEX.search(select_edge_name) 
edge_index = int(match_edge_index.group('select_edge_name'))

cmds.polySplit( ip=[(edge_index, 0.7)] )


エッジを選択して上記のコードを実行すると、7:3の位置に頂点が追加されました。

7:3の位置に頂点が追加されました。

フェースをカットする(エッジを挿入する)

フェースをカットする場合も

polySplitコマンドとinsertpoint(ip)フラグを使います。

insertpoint(ip)フラグに指定するエッジのインデックスと頂点位置のパーセンテージを続けて指定すると、追加した頂点に跨るエッジで繋がります。


エッジのインデックス[2]と[3]を中間地点てカットする場合は次のようになコードになります。

import maya.cmds as cmds

cmds.polySplit( ip=[(2, 0.5),(3, 0.5)] )


メッシュオブジェクトを選択して、上記のコードを実行すると、フェースを上下で分ける中間地点にエッジが挿入されました。

フェースをカットする(エッジを挿入する)

フェースに複数の頂点を追加してカットする

insertpoint(ip)フラグには2つの以上のインデックスとパーセンテージの値を指定できます。

例えば、追加する頂点の値を4つ指定して実行すると

import maya.cmds as cmds

cmds.polySplit( ip=[(3, 0.1), (1, 0.5), (2, 0.7), (0, 0.3)] )


フェースの4辺のエッジに1つずつ頂点が追加され、それぞれの頂点で繋がるエッジが挿入されました。

それぞれの頂点で繋がるエッジが挿入されました。

フェースに頂点を追加する

フェースに頂点を追加するには、insertpoint(ip)フラグに4つの引数を指定します。

ip=[(フェースのインデックス, ローカル座標X, ローカル座標Y, ローカル座標Z)]


注意しなければならないのは、フェースに頂点を追加する場合は、その前後に頂点を指定する必要がある事。

ip=[(エッジのインデックス, 頂点位置のパーセンテージ),(フェースのインデックス, ローカル座標X, Y, Z),(エッジのインデックス, 頂点位置のパーセンテージ)]


5つ追加する頂点の4つ目に、インデックス[0]のフェースのローカル座標XYZに[0.3, -0.5, 0.0]を指定。

import maya.cmds as cmds

cmds.polySplit( ip=[(3, 0.1), (1, 0.5), (2, 0.7), (0, 0.3, -0.5, 0.0),(0, 0.3)] )


実行すると、フェースに4つ目の頂点が追加されました。

フェースに4つ目の頂点が追加されました。

フェース面から外れた位置に頂点を追加する

XYZの値を変更すればフェースの平面上から外れた位置に頂点を追加することも出来ます。

cmds.polySplit( ip=[(3, 0.1), (1, 0.5), (2, 0.7), (0, 0.3, -0.5, 1.0),(0, 0.3)] )


Z値を[1.0]にすると、ローカル座標1.0の位置に頂点が追加されます。

ローカル座標1.0の位置に頂点が追加







 最新のゲーミングPCが安く手に入れられる「 FRONTIER 」

 豊富なカスタマイズメニューで、あなた好みの1台が購入できます。

 人気の秘密は何と言ってもコスパの高さ。
 最新のCPU・GPUパーツを搭載したモデルを驚きの価格で提供。

 山口県の自社工場で組み立てられ徹底した試験・検査後に出荷。
 無償修理サービスもありサポート体制も安心。

 コスパに徹底的にこだわる方は公式サイトへ >> 【FRONTIER】





𝕏 ( 旧Twitter ) Facebook Pocket LINE はてブ

おすすめの関連記事



あわせてよく読まれている記事

タグ: , ,