获取对象轴在 Maya 中指向的方向
Get the direction an object's axis is pointing in Maya
使用 python 我试图确认 Maya 中给定的变换节点的 Y 轴朝上,Z 轴朝前,X 轴朝侧面,如下图所示。变换节点可能是未知深度层次结构中另一个变换节点的子节点。
我第一个想到的是使用xform rotate pivot matrix?我不确定这是否正确或如何解释矩阵值。
对于大多数对象,您可以非常简单地获得世界 space 中的方向:
import maya.cmds as cmds
world_mat = cmds.xform(my_object, q=True, m=True, ws=True)
x_axis = world_mat[0:3]
y_axis = world_mat[4:7]
z_axis = world_mat[8:11]
如果你想要它们的矢量形式(这样你就可以标准化它们或给它们打点),你可以使用 maya api 将它们作为矢量。例如
import maya.cmds as cmds
import maya.api.OpenMaya as api
my_object = 'pCube1'
world_mat = cmds.xform(my_object, q=True, m=True, ws=True)
x_axis = api.MVector(world_mat[0:3])
y_axis = api.MVector(world_mat[4:7])
z_axis = api.MVector(world_mat[8:11])
# 1 = straight up, 0 = 90 degrees from up, -1 = straight down
y_up = y_axis * api.MVector(0,1,0)
这将包括可能对对象的 .rotateAxis
参数所做的任何修改,因此如果被操纵,不能保证与视觉三脚架对齐。
如果您没有理由期望 .rotateAxis
已设置,这是最简单的方法。一个好的中间步骤是警告具有非零 .rotateAxis
的对象,这样结果就没有歧义,在任何情况下都可能不清楚正确的操作过程是什么。
我将@theodox answer 包装到一个函数中。也许对以后的人有帮助。
def getOrientation(obj, returnType='point'):
'''
Get an objects orientation.
args:
obj (str)(obj) = The object to get the orientation of.
returnType (str) = The desired returned value type. (valid: 'point', 'vector')(default: 'point')
returns:
(tuple)
'''
obj = pm.ls(obj)[0]
world_matrix = pm.xform(obj, q=True, m=True, ws=True)
rAxis = pm.getAttr(obj.rotateAxis)
if any((rAxis[0], rAxis[1], rAxis[2])):
print('# Warning: {} has a modified .rotateAxis of {} which is included in the result. #'.format(obj, rAxis))
if returnType is 'vector':
from maya.api.OpenMaya import MVector
result = (
MVector(world_matrix[0:3]),
MVector(world_matrix[4:7]),
MVector(world_matrix[8:11])
)
else:
result = (
world_matrix[0:3],
world_matrix[4:7],
world_matrix[8:11]
)
return result
使用 python 我试图确认 Maya 中给定的变换节点的 Y 轴朝上,Z 轴朝前,X 轴朝侧面,如下图所示。变换节点可能是未知深度层次结构中另一个变换节点的子节点。
我第一个想到的是使用xform rotate pivot matrix?我不确定这是否正确或如何解释矩阵值。
对于大多数对象,您可以非常简单地获得世界 space 中的方向:
import maya.cmds as cmds
world_mat = cmds.xform(my_object, q=True, m=True, ws=True)
x_axis = world_mat[0:3]
y_axis = world_mat[4:7]
z_axis = world_mat[8:11]
如果你想要它们的矢量形式(这样你就可以标准化它们或给它们打点),你可以使用 maya api 将它们作为矢量。例如
import maya.cmds as cmds
import maya.api.OpenMaya as api
my_object = 'pCube1'
world_mat = cmds.xform(my_object, q=True, m=True, ws=True)
x_axis = api.MVector(world_mat[0:3])
y_axis = api.MVector(world_mat[4:7])
z_axis = api.MVector(world_mat[8:11])
# 1 = straight up, 0 = 90 degrees from up, -1 = straight down
y_up = y_axis * api.MVector(0,1,0)
这将包括可能对对象的 .rotateAxis
参数所做的任何修改,因此如果被操纵,不能保证与视觉三脚架对齐。
如果您没有理由期望 .rotateAxis
已设置,这是最简单的方法。一个好的中间步骤是警告具有非零 .rotateAxis
的对象,这样结果就没有歧义,在任何情况下都可能不清楚正确的操作过程是什么。
我将@theodox answer 包装到一个函数中。也许对以后的人有帮助。
def getOrientation(obj, returnType='point'):
'''
Get an objects orientation.
args:
obj (str)(obj) = The object to get the orientation of.
returnType (str) = The desired returned value type. (valid: 'point', 'vector')(default: 'point')
returns:
(tuple)
'''
obj = pm.ls(obj)[0]
world_matrix = pm.xform(obj, q=True, m=True, ws=True)
rAxis = pm.getAttr(obj.rotateAxis)
if any((rAxis[0], rAxis[1], rAxis[2])):
print('# Warning: {} has a modified .rotateAxis of {} which is included in the result. #'.format(obj, rAxis))
if returnType is 'vector':
from maya.api.OpenMaya import MVector
result = (
MVector(world_matrix[0:3]),
MVector(world_matrix[4:7]),
MVector(world_matrix[8:11])
)
else:
result = (
world_matrix[0:3],
world_matrix[4:7],
world_matrix[8:11]
)
return result