liquidjumper MAYA,Python [MAYA-Python]ポリゴン頂点・CV・ロケータなどポイントの位置を取得

[MAYA-Python]ポリゴン頂点・CV・ロケータなどポイントの位置を取得

maya_python_pointPosition_topimage

MAYAのスクリプトでオブジェクトの位置情報を取得するには

import maya.cmds as cmds

cmds.getAttr("test_Cube.translateX")
cmds.getAttr("test_Cube.translateY")
cmds.getAttr("test_Cube.translateZ")


「getAttr(オブジェクト名.translateX)」として移動値を取得する事ができます。

「ポリゴンの頂点の位置を取得するにはどうしたら良いの?」

もちろんMAYAはスクリプトでポリゴンの頂点の位置を取得する事ができます。
この記事ではMAYAのスクリプトでポリゴン頂点の位置を取得できるコマンド

pointPosition

の使い方を紹介します。


pointPositionの使い方

Python

import maya.cmds as cmds

selectedVertex_list = cmds.ls(sl=True)
vertex_pos_1 = cmds.pointPosition(selectedVertex_list[0])
print(vertex_pos_1)


説明:

vertex_pos_1 = cmds.pointPosition(selectedVertex_list[0])

pointPositionで選択した頂点の位置を取得、変数に代入

結果:

ポリゴンの頂点を選択して実行

ポリゴンの頂点を選択して実行


選択したポリゴン頂点の位置が出力されました。

[1.10463386075323, 1.1644376620686903, -0.3615708482477157]

ワールド空間とローカル空間

フラグを設定してワールド空間とローカル空間の空間位置を設定できます。

world(w) : ワールド空間
local(l) : ローカル空間

ローカル空間のフラグを設定しました。

import maya.cmds as cmds

selectedVertex_list = cmds.ls(sl=True)
vertex_pos_local = cmds.pointPosition(selectedVertex_list[0], local=True)
print(vertex_pos_local)


説明:

vertex_pos_local = cmds.pointPosition(selectedVertex_list[0], local=True)

pointPositionに”local=True”ローカル空間のフラグを設定

結果:

ポリゴンの頂点を選択して実行

ポリゴンの頂点を選択して実行


ローカル空間(オブジェクト内の位置)の座標が出力されました。

[-0.8090171813964844, 1.0, 0.5877853631973267]


フラグを指定しないと、ワールド空間位置が既定で返されます。

pointPositionでポリゴン頂点以外のポイント位置を取得する

pointPositionで取得できるのはポリゴン頂点の位置だけではありません。

あらゆるタイプのポイントの位置を取得できます。

取得できる項目は

  • カーブおよびサーフェス CV 
  • ポリゴン頂点 
  • ラティス ポイント
  • パーティクル 
  • カーブおよびサーフェス エディット ポイント 
  • カーブおよびサーフェス パラメータ ポイント 
  • ポリゴン UV 
  • 回転/スケール/ジョイント ピボット 
  • セレクション ハンドル 
  • ロケータ、パラメータ ロケータ、および円弧長ロケータ

カーブCV の位置を取得

カーブCV の位置を取得します。

import maya.cmds as cmds

cv_point = cmds.ls(sl=True)
cv_point_pos_1 = cmds.pointPosition(cv_point[0])
print(cv_point_pos_1)


結果:

カーブCVを選択して実行

カーブCVを選択して実行


カーブCVの位置を取得できました。

[2.666032686690995, 1.784920196525508, 0.15694407222954343]

応用:pointPositionで2点間の距離を取得する

2つのポイント位置が取得できれば、2点間の距離の値も取得できます。

3D空間の座標から2点間の距離の値を導き出すのは高度な計算が必要でPythonのモジュールが欲しくなりますが、MAYAオリジナルのスクリプト「MEL」には、float値を3つ並べた集まりを指す vector型 が備わっていて、この様な計算を簡単に扱えます。

MELのvector型の表記

<<float,float,float>>

MAYAはPythonにMELのコードを組み込むことによって、PythonでもMEL独自の機能を簡単に使う事ができます。

PythonでMELを組み込むには maya.mel をインポートして eval() を使います。

eval(“MELスクリプト”)

例:

import maya.mel as mm

maya_location = mm.eval("getenv MAYA_LOCATION")
print(maya_location)


2つのvector型の値の距離はコマンド mag で取得できます。

mag(<<float,float,float>>)

import maya.cmds as cmds
import maya.mel as mm

selectedVertex_list = cmds.ls(sl=True)
selectedVertex_No =cmds.filterExpand(selectedVertex_list , sm=31)
vertex_pos_1 = cmds.pointPosition(selectedVertex_No[0])
vertex_pos_2 = cmds.pointPosition(selectedVertex_No[1])

mm.eval("vector $vertex_pos_1 = << %s , %s , %s >>; " % (vertex_pos_1[0],vertex_pos_1[1],vertex_pos_1[2]))
mm.eval("vector $vertex_pos_2 = << %s , %s , %s >>; " % (vertex_pos_2[0],vertex_pos_2[1],vertex_pos_2[2]))
mm.eval("vector $vertex_Vector = $vertex_pos_1 - $vertex_pos_2;")

distance_value = mm.eval("mag $vertex_Vector;")
print(distance_value)


説明:

selectedVertex_list = cmds.ls(sl=True)
selectedVertex_No =cmds.filterExpand(selectedVertex_list , sm=31)

選択した2つの頂点のリストが纏まっていると扱えないので filterExpandの引数にポリゴン頂点のセレクションマスク番号[31]を指定してバラバラにします。

vertex_pos_1 = cmds.pointPosition(selectedVertex_No[0])
vertex_pos_2 = cmds.pointPosition(selectedVertex_No[1])

pointPositionで頂点の位置の値を取得します。

mm.eval("vector $vertex_pos_1 = << %s , %s , %s >>; " % (vertex_pos_1[0],vertex_pos_1[1],vertex_pos_1[2]))
mm.eval("vector $vertex_pos_2 = << %s , %s , %s >>; " % (vertex_pos_2[0],vertex_pos_2[1],vertex_pos_2[2]))

頂点の位置の値をeval()でvector型に文字列で当てはめます。

mm.eval("vector $vertex_Vector = $vertex_pos_1 - $vertex_pos_2;")

2つの頂点間の距離を取得したいので、2つの頂点のベクター値を減算します。

distance_value = mm.eval("mag $vertex_Vector;")

magでベクター $vertex_Vector の大きさ(長さ)を取得。Pythonの変数 distance_value に代入しました。

実行:

頂点を2つ選択して実行します。

頂点を2つ選択して実行


選択した2つの頂点の距離が出力されました。

2.67756388373







SAMURAI ENGINEER Plus+


 月額定額制の完全オンライン・プログラミングスクール

 「SAMURAI TERAKOYA(侍テラコヤ)」

 ・月々定額のサブスクで利用でき、入会金も不要、いつでも退会可能
 ・現役エンジニアの講師とマンツーマン・レッスンで疑問や悩みを解決
 ・オンラインで学べるので地方在住者でも受講可能

侍テラコヤ






𝕏 ( 旧Twitter ) Facebook Pocket LINE はてブ

おすすめの関連記事



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