获取对象轴在 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