在Maya的MEL或Python中是否有办法在另一个对象的坐标系中获得一个对象的位置?我在一个可以向任何方向旋转的场景中都有一个摄像头,我试图测量其局部Z轴到场景中各种物体顶点的距离。这显然需要很快,因为它可能会在整个场景中运行数千次。
在Maxscript中,命令类似于
!(variableOne && variableTwo) == !variableOne || !variableTwo
但我还没有在Maya找到这样的东西。如果没有直接命令来执行此操作,是否有人可以使用矩阵数学计算它?
答案 0 :(得分:0)
使用此MEL脚本计算从camera1
到nurbsSphere1
原语的距离:
vector $p1 = `getAttr camera1.translate`;
vector $p2 = `getAttr nurbsSphere1.translate`;
vector $result = $p1 - $p2;
print (mag($result))
印刷结果必须如下:
# MEL 40.1965
或者使用此Python脚本计算从camera1
到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)
印刷结果必须如下:
# 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,所以你可以忽略它,虽然数学需要它来解释尺度和剪切。