MAYA,MEL,Python [MAYA Python] MELの型vectorを使って2点間の距離の値を取得

[MAYA Python] MELの型vectorを使って2点間の距離の値を取得

maya_python_mel_mag_topimage

過去にこのブログで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つのベクトル間の角度を簡単に取得できたりと、意外に強力です。

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スクリプトを実行します。

オブジェクトを選択して、MELスクリプトを実行
1.975707

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つ選択して実行
3.13541950187

選択した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つ選択して実行
2.67756388373

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

まとめ

MELの型vectorを使って2点間の距離の値を取得方法を紹介しました。

MAYAのスクリプトをPythonで書く場合であっても、MELを使うメリットがあります。

MELはMAYAの為に作られたスクリプトなので、Pythonには無いMAYAを使う上で便利な機能が用意されています。

PythonでもMELのコマンドを簡単に使えるので、効率的なスクリプトコードを書くためにも、使ってみる事をオススメします。


Twitter Facebook Pocket LINE はてブ

おすすめの関連記事
コチラの記事も読まれています
あわせてよく読まれている記事
タグ: ,