Maya Python API围绕另一个矩阵缩放矩阵

2024-06-01 08:08:37 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我在玛雅有两个矩阵。我想反映一个矩阵关于另一个矩阵的x和y。在

例如:

对象1的矩阵如下: [1.0,0.0,0.0,0.0,0.0,0.70710678118654746,0.70710678118654757,0.0,0.0,-0.70710678118654757,0.70710678118654746,0.0,0.0,0.0,1.0] 这是一个在原点沿x旋转45度的物体

对象2的矩阵如下: [1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,2.0,2.0,1.0] 坐在世界空间中的2,2,2,没有旋转值。在

在object1的scaleX上反射时,我们得到如下矩阵: [1.0,0.0,-0.0,0.0,-0.0,0.70710678118654746,-0.70710678118654757,0.0,0.70710678118654757,0.70710678118654746,0.0,2.0,2.8284271247461898,-2.22044604925031E-16,1.0]

当我手动反映对象的比例时,这只是我在查询矩阵。在pythonapi中实现这一点的方法是什么?在

我想用MTransformationMatrix做一些假设,但没能搞清楚。在

任何帮助将不胜感激!在


Tags: 对象方法pythonapi世界空间矩阵手动比例
3条回答

最后用向量来确定位置。将obj1和obj2替换为反射对象和要反射的对象。在

import maya.OpenMaya as OpenMaya
import maya.cmds as cmds
from functools import partial

get_pnt = partial(cmds.xform,
                 query=True,
                 worldSpace=True,
                 translation=True)

N = OpenMaya.MVector(*get_pnt('obj1'))
N.normalize()
V = OpenMaya.MVector(*get_pnt('obj2'))
R = (N * 2.0) * (V * N) - V

loc = cmds.spaceLocator()
cmds.move(R.x, R.y, R.z, loc[0])

Formula for vector reflection

这是我按照你给我的想法去做的代码。很有道理了!在

import maya.OpenMaya as OpenMaya
import maya.cmds as cmds
import math

reflectObj = cmds.xform('pSphere1', query=True, ws=True, matrix=True)
targetObj = cmds.xform('pSphere2', query=True, ws=True, matrix=True)
reflectXZ = [-1 * reflectObj[0], -1 * reflectObj[1], -1 * reflectObj[2], reflectObj[3],
             -1 * reflectObj[4], -1 * reflectObj[5], -1 * reflectObj[6], reflectObj[7],
             reflectObj[8], reflectObj[9], reflectObj[10], reflectObj[11],
             reflectObj[12], reflectObj[13], reflectObj[14], reflectObj[15]]

targetMMatrix = OpenMaya.MMatrix()
OpenMaya.MScriptUtil.createMatrixFromList(targetObj, targetMMatrix)

reflectObjMMatrix = OpenMaya.MMatrix()
OpenMaya.MScriptUtil.createMatrixFromList(reflectObj, reflectObjMMatrix)

reflectXZMMatrix = OpenMaya.MMatrix()
OpenMaya.MScriptUtil.createMatrixFromList(reflectXZ, reflectXZMMatrix)

reflected_matrix = targetMMatrix * reflectObjMMatrix.inverse()
result = reflected_matrix * reflectXZMMatrix

mt = OpenMaya.MTransformationMatrix(result)

trans = mt.translation(OpenMaya.MSpace.kWorld)
eulerRot = mt.rotation().asEulerRotation()
angles = [math.degrees(angle) for angle in (eulerRot.x, eulerRot.y, eulerRot.z)]
loc = cmds.spaceLocator()
cmds.move(trans[0], trans[1], trans[2], loc[0])
cmds.rotate(angles[0], angles[1], angles[2], loc[0])

在这个例子中,我只做了两个球体,并且能够在这些矩阵上反射。 编辑:修正此项以消除任何旋转。在

通常,您需要在API中创建一个MMatrix或MTransformationMatrix,然后将它们串联起来以获得所需的转换。麻烦是从Python中获取值到这些类中,这需要可怕的MScriptUtil

import maya.OpenMaya as OpenMaya
import maya.cds as cmds


def APIMatrix ( valList ):  # where vallist is a list of floats
    mat = OpenMaya.MMatrix()
    OpenMaya.MScriptUtil.createMatrixFromList( valList, mat )
    return mat

例如,将从python编号列表创建MMatrix。在Pymel中,使用Matrix类比较容易:

^{pr2}$

将矩阵相乘后,可以使用xform命令应用它们:

cmds.xform(item, m = my_new_matrix)

或者在皮梅尔:

import pymel.core as pm
pm.xform(item, my_new_pymel_matrix)

MMatrix是一个原始矩阵-只需要数字来进行数学运算MTransformationMatrix更像是对象的实际转换:它提供了一些方法,例如,在不知道哪些矩阵成员需要手动旋转的情况下,将数字插入平移或旋转:

def get_obj_quaternion ( mayaTransform, worldSpace=True ):
    '''
    gets the rotation quat for the supplied dag node in world or local space
    '''
    #convert from mMatrix to MTransformationMatrix....
    mMatrix = matrix_from_transform( mayaTransform, worldSpace=worldSpace )
    mTransformMtx = OpenMaya.MTransformationMatrix( mMatrix )

    # MscriptUtil. Sigh
    xPtr = OpenMaya.MScriptUtil(0.0)
    x = xPtr.asDoublePtr()

    yPtr = OpenMaya.MScriptUtil(0.0)
    y = yPtr.asDoublePtr()

    zPtr = OpenMaya.MScriptUtil(0.0)
    z = zPtr.asDoublePtr()

    wPtr = OpenMaya.MScriptUtil(0.0)
    w = wPtr.asDoublePtr()

    mTransformMtx.getRotationQuaternion( x, y, z, w )
    # getRotationQuaternion is an MTransformationMatrix method

    #convert them back to normal python floats
    x = OpenMaya.MScriptUtil().getDouble( x )
    y = OpenMaya.MScriptUtil().getDouble( y )
    z = OpenMaya.MScriptUtil().getDouble( z )
    w = OpenMaya.MScriptUtil().getDouble( w )

    return x, y, z, w

所以在你的情况下,你应该:

1)获取目标对象的矩阵

2)获取反射对象的矩阵

3)制作反射矩阵,例如:

 -1  0  0  0
  0  1  0  0 
  0  0 -1  0
  0  0  0  1

反射X轴和Z轴的反射矩阵

4)将目标反映为:

reflected_matrix = reflectXZMatrix * reflectionObjectMatrix
result = target_matrix * reflected_matrix
cmds.xform( target_object, m = result)

这是一个只使用mmatrics的最简版本-如果您需要自己构造矩阵,mttransformationmatrix将允许您设置旋转或缩放矩阵,而无需手动管理矩阵中的数字。在

相关问题 更多 >