获取对象在另一个对象坐标系中的位置

时间:2017-11-14 18:13:43

标签: python maya mel

在Maya的MEL或Python中是否有办法在另一个对象的坐标系中获得一个对象的位置?我在一个可以向任何方向旋转的场景中都有一个摄像头,我试图测量其局部Z轴到场景中各种物体顶点的距离。这显然需要很快,因为它可能会在整个场景中运行数千次。

在Maxscript中,命令类似于

!(variableOne && variableTwo) == !variableOne || !variableTwo

但我还没有在Maya找到这样的东西。如果没有直接命令来执行此操作,是否有人可以使用矩阵数学计算它?

2 个答案:

答案 0 :(得分:0)

使用此MEL脚本计算从camera1nurbsSphere1原语的距离:

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

印刷结果必须如下:

# MEL 40.1965

或者使用此Python脚本计算从camera1nurbsSphere1原语的距离:

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)

印刷结果必须如下:

# Python 40.1964998512

答案 1 :(得分:0)

没有一个类似于MXS习语的衬垫 - 并且在 mel 中没有简单的方法。但是在Python中你可以很容易地做到这一点。

首先,您需要获得所需坐标系的矩阵MMatrix,它是OpenMaya api的一部分。然后得到你想要检查的位置作为MPoint,这是另一个api类。这是获得它们的便宜方式(有更快的方法,但它们更加冗长):

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)

结果将是一个MPoint,其中<​​em> 4 个数字(x,y,z和w);第四个将永远是1,所以你可以忽略它,虽然数学需要它来解释尺度和剪切。