過去にこのブログでMAYAのPythonスクリプトにでMAYAの標準スクリプトMELを組み込む方法を紹介しました。
⇒MAYAのPythonスクリプトにMELを組み込んでベクトル計算をする方法
その記事でMELを使用するメリットとしてPythonにはない便利な型や関数があり、そしてそれをPythonスクリプトに簡単に組み込み利用できる事を紹介しました。
前回の記事でも紹介したMELにしかない型 vector を使った活用法をこの記事では紹介したいと思います。
MELのベクトルは、float値を3つ並べた集まりを指して
<<float,float,float>>
と表記します。
このvector型を使うと
vector $vec_multi = <<3.6,8.3,4.1>> * <<52.8,1.2001,7.30000>>;
のようにして加算減算を一度に行えたり、
float $rad = `angle <<-0.391374, 0.920232, 0>> <<0.279635, 0.960106, 0>>`;
コマンド angle を使って2つのベクトル間の角度を簡単に取得できたりと、意外に強力です。
そして今回vectorを使った機能で紹介するのが
コマンド mag です。
mag は MELのvectorの値から大きさ(長さ)を取得する事ができます。
長さ つまり 距離 を取得できます。
配置してオブジェクトが0.0座標からどれだけ離れているのか、
2つのオブジェクト(メッシュ、カメラ、ライト など)間の距離の値を取得したい場合など、使い所は多々ありそう。
もちろんPythonだけで距離の値を取得する事は可能ですが、モジュールを入れる必要もなく、MAYAの標準スクリプトのMELで簡単に利用できるので紹介します。
PythonスクリプトにMELを組み込む
PythonにMELスクリプトを組み込むには
maya.mel をインポートします。
そして
eval(“MELスクリプト”)
と記述することでPython内でMELを使用する事が可能になります。
例:
import maya.mel as mm
maya_location = mm.eval("getenv MAYA_LOCATION")
print(maya_location)
MELスクリプトmagの使い方
MELのvector型からコマンド mag を使って大きさ(長さ)を取得する書き方は
mag(<<float,float,float>>)
これだけでベクターの値から、大きさ(長さ)つまり距離を取得できます。
では実際に0.0の座標から配置したオブジェクトまでの距離をMELスクリプトで書いてみましょう。
0地点からオブジェクトの位置までの距離を取得
MEL
string $polyCube[] = `ls -sl`;
vector $v_polyCube_translate = getAttr($polyCube[0] + ".translate");
float $distance_value = mag($v_polyCube_translate);
print($distance_value);
説明:
string $polyCube[] = `ls -sl`;
vector $v_polyCube_translate = getAttr($polyCube[0] + ".translate");
getAttr で選択した polyCube の Translate値を取得し、vectorの変数 $v_polyCube_translate に代入しました。
float $distance_value = mag($v_polyCube_translate);
magを使って $v_polyCube_translate の 大きさ(長さ)を取得。
実行:
オブジェクトを選択して、MELスクリプトを実行します。
0.0座標から選択したオブジェクトまでの距離が出力されました。
Pythonスクリプトにmagを組み込む
MELスクリプトでmagの使い方は理解出来たでしょうか?
今度はPythonでmagを使ってみたいと思います。
2つのオブジェクト間の距離を取得
選択した2つのオブジェクトの距離をmagを使って取得します。
Python
import maya.cmds as cmds
import maya.mel as mm
selectedObj_list = cmds.ls(sl=True)
object_pos_1 = cmds.getAttr(selectedObj_list[0] + ".translate")
object_pos_2 = cmds.getAttr(selectedObj_list[1] + ".translate")
mm.eval("vector $object_pos_1 = << %s , %s , %s >>; " % (object_pos_1[0][0],object_pos_1[0][1],object_pos_1[0][2]))
mm.eval("vector $object_pos_2 = << %s , %s , %s >>; " % (object_pos_2[0][0],object_pos_2[0][1],object_pos_2[0][2]))
mm.eval("vector $object_Vector = $object_pos_1 - $object_pos_2;")
distance_value = mm.eval("mag $object_Vector;")
print(distance_value)
説明:
selectedObj_list = cmds.ls(sl=True)
object_pos_1 = cmds.getAttr(selectedObj_list[0] + ".translate")
object_pos_2 = cmds.getAttr(selectedObj_list[1] + ".translate")
getAttrを使い選択した2つのオブジェクトのTranslate値を取得して変数に代入します。
mm.eval("vector $object_pos_1 = << %s , %s , %s >>; " % (object_pos_1[0][0],object_pos_1[0][1],object_pos_1[0][2]))
mm.eval("vector $object_pos_2 = << %s , %s , %s >>; " % (object_pos_2[0][0],object_pos_2[0][1],object_pos_2[0][2]))
オブジェクトのTranslate値をeval()でvector型の値に文字列で当てはめます。
mm.eval("vector $object_Vector = $object_pos_1 - $object_pos_2;")
0.0座標からの距離ではなく、2つのオブジェクト間の距離を取得したいので、2つのベクターを減算します。
※遠い距離の地点から近い距離の地点分を引く
distance_value = mm.eval("mag $object_Vector;")
magでベクター $object_Vector の大きさ(長さ)を取得。Pythonの変数に代入しました。
実行:
オブジェクトを2つ選択して実行します。
選択した2つのオブジェクト間の距離が出力されました。
2つの頂点間の距離を取得
選択した2つの頂点の距離をmagを使って取得します。
Python
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 でバラバラにします。
|
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つの頂点の距離が出力されました。
まとめ
MELの型vectorを使って2点間の距離の値を取得方法を紹介しました。
MAYAのスクリプトをPythonで書く場合であっても、MELを使うメリットがあります。
MELはMAYAの為に作られたスクリプトなので、Pythonには無いMAYAを使う上で便利な機能が用意されています。
PythonでもMELのコマンドを簡単に使えるので、効率的なスクリプトコードを書くためにも、使ってみる事をオススメします。
|
|
BTOパソコンの草分け的ブランドFRONTIER(フロンティア) 3DCG/動画編集/ゲーム用途に合わせてCPUやGPUなどパーツを自由に選べてコスパにもこだわる方にオススメ。 |
|
|
|
|
|