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

Get an object's position in another object's coordinate system

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

在 Maxscript 中,命令类似于

" in coordsys $camera " 

但我还没有在 Maya 中找到类似的东西。如果没有直接命令执行此操作,有没有人有办法使用矩阵数学来计算它?

使用此 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

没有与 MXS 习语相似的班轮 -- 在 mel 中也没有简单的方法来做到这一点。然而,在 Python 中,您可以很容易地做到这一点。

首先,您需要获取您想要的坐标系矩阵 MMatrix,它是 OpenMaya api 的一部分。然后获取要检查的位置作为一个MPoint,也就是另一个apiclass。这是获得它们的廉价方法(有更快的方法,但它们更冗长):

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,它有 4 个数字(x、y、z 和 w);第 4 个将始终为 1,因此您可以忽略它,尽管数学需要它来考虑比例和剪切。