2017-11-14 19 views
1

MELまたはPythonでMayaの別のオブジェクトの座標系でオブジェクトの位置を取得する方法はありますか?私はどの方向に回転しても構わないシーン内のカメラを持っていて、シーン内のさまざまなオブジェクトの頂点までのローカルZ軸の距離を測定しようとしています。これは明らかに、シーン全体で何千回も実行されるため、高速である必要があります。他のオブジェクトの座標系でオブジェクトの位置を取得

のMAXScriptでコマンドが

" in coordsys $camera " 

ようなものになるだろうが、私はマヤでこのような何かを見つけるためには至っていません。これを行う直接のコマンドがない場合、行列計算を使用して計算する方法はありますか?

+0

カメラ錐台のオブジェクトを検索しようとしていますか? – Achayan

+0

オブジェクトがカメラの錐台の内側にあるかどうかを判断する必要はありません。オブジェクトまたは頂点がカメラからどれだけ離れているかを調べるだけです。 –

答えて

0

ありません - とメルでそれを行うための簡単な方法は。しかし、Pythonではこれをかなり簡単に行うことができます。

まず、OpenMaya APIの一部であるMMatrixとして必要な座標系の行列を取得する必要があります。次に、別のAPIクラスであるMPointとしてチェックしたい位置を取得します。ここではそれらを取得するための安価な方法があります(そこに速い方法があるが、彼らは多くのwordierだ):あなたは、マトリックスとポイントを持っていたら

from maya.api.OpenMaya import MVector, MMatrix, MPoint 
import maya.cmds as cmds 

def world_matrix(obj): 
    """' 
    convenience method to get the world matrix of <obj> as a matrix object 
    """ 
    return MMatrix(cmds.xform(obj, q=True, matrix=True, ws=True)) 


def world_pos(obj): 
    """' 
    convenience method to get the world position of <obj> as an MPoint 
    """ 
    return MPoint(cmds.xform(obj, q=True, t=True, ws=True)) 

、相対的な位置は、単純に倍の行列の逆行列を指す:

relative_position = world_pos('pSphere1') * world_matrix('pCube1').inverse() 
print relative_position 
# (0.756766, -0.0498943, 3.38499, 1) 

結果は、番号(X、Y、ZおよびW)を有するMPoint、あろう。 4位は常に1になるので、無視してもかまいませんが、数学では尺度と剪断を考慮する必要があります。

+0

ありがとう、それは素晴らしいです。そして説明はとても役に立ちます。私はOpenMayaスクリプトをまだあまり行っていません。それを使用するためのオンラインのリソースはありますか? –

0

camera1からnurbsSphere1プリミティブまでの距離を算出するために、このMELスクリプトを使用します。

# MEL 40.1965 

するか、camera1からの距離を計算するために、このPythonスクリプトを使用します。

vector $p1 = `getAttr camera1.translate`; 
vector $p2 = `getAttr nurbsSphere1.translate`; 
vector $result = $p1 - $p2; 
print (mag($result)) 

印刷結果は次のようでなければなりません〜nurbsSphere1プリミティブ:

import maya.cmds as cmds 
import math 

distance = math.sqrt(pow((float)(cmds.getAttr("nurbsSphere1.tx") - cmds.getAttr("camera1.tx")),2) + 
        pow((float)(cmds.getAttr("nurbsSphere1.ty") - cmds.getAttr("camera1.ty")),2) + 
        pow((float)(cmds.getAttr("nurbsSphere1.tz") - cmds.getAttr("camera1.tz")),2)) 
print(distance) 

印刷結果は次のようにする必要がありますMXSイディオムに類似誰ライナー

# Python 40.1964998512 
+0

これはあるオブジェクトから別のオブジェクトまでの距離を測定します。それは私が残念なことに必要なものではありません。私は、カメラの座標系における球の平行移動座標(特にZ位置)を調べる必要があります。 –

+0

このリンクを使用してトピックに移動してください:http://forums.cgsociety.org/archive/index.php?t-1072860.html これは高度なトピックです。 – andy

関連する問題