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で選択した頂点の位置を取得、変数に代入
結果:
ポリゴンの頂点を選択して実行
選択したポリゴン頂点の位置が出力されました。
ワールド空間とローカル空間
フラグを設定してワールド空間とローカル空間の空間位置を設定できます。
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”ローカル空間のフラグを設定
結果:
ポリゴンの頂点を選択して実行
ローカル空間(オブジェクト内の位置)の座標が出力されました。
フラグを指定しないと、ワールド空間位置が既定で返されます。
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の位置を取得できました。
応用: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つの頂点の距離が出力されました。
|
月額定額制の完全オンライン・プログラミングスクール
「SAMURAI TERAKOYA(侍テラコヤ)」
・月々定額のサブスクで利用でき、入会金も不要、いつでも退会可能
・現役エンジニアの講師とマンツーマン・レッスンで疑問や悩みを解決
・オンラインで学べるので地方在住者でも受講可能
|
|
BTOパソコンの草分け的ブランドFRONTIER(フロンティア) 3DCG/動画編集/ゲーム用途に合わせてCPUやGPUなどパーツを自由に選べてコスパにもこだわる方にオススメ。 |
|
|
|
|
|