如何使用openMaya将矩阵与另一个矩阵相乘?

时间:2017-07-31 23:13:58

标签: python maya

我正在尝试创建一个脚本,用于在Maya中跨yz平面镜像变换。

我能够建立一个获得所需结果的节点网络。我在原点获取了一个节点,其中sz设置为-1,左侧是源节点(此测试为lf_grp),并将其worldMatrix attrs提供给multMatrix节点。然后我通过分解矩阵将输出(multMatrix.matrixSum)传递到我的目标节点。

我真的更喜欢不创建一堆节点来进行镜像 - 每次运行创建/连接/断开/删除循环都是缓慢而痛苦的...我宁愿只是“数学废话”它“通过我的剧本,但我似乎无法弄清楚如何实际上乘以我的两个矩阵......

哦,我正在使用MTransformationMatrix,因为它为你处理MMatrix没有的一些事情 - 比如旋转顺序(至少从我读过的内容......)

感谢您提供任何帮助!

import maya.cmds as mc
import maya.OpenMaya as om

src_xfm = 'lf_grp'
mir_matrix_vals = [-1.0, -0.0, -0.0, 0.0,
                   0.0, 1.0, 0.0, 0.0,
                   0.0, 0.0, 1.0, 0.0,
                   0.0, 0.0, 0.0, 1.0]

# get src xfm matrix
#
selList = om.MSelectionList()
selList.add(src_xfm)
mDagPath = om.MDagPath()
selList.getDagPath(0, mDagPath)

src_xfmFn = om.MFnTransform(mDagPath)
src_matrix = src_xfmFn.transformation()

# construct mir xfm matrix
#
mir_matrix = om.MTransformationMatrix()
tmp_matrix = om.MMatrix()
om.MScriptUtil().createMatrixFromList(mir_matrix_vals, tmp_matrix)
mir_matrix = om.MTransformationMatrix(tmp_matrix)

# multiply matrices to get mirrored matrix
#
dst_matrix = src_matrix * mir_matrix  # HOW DO YOU DO THIS????

1 个答案:

答案 0 :(得分:0)

以下是使用openMaya api version 2的方法。

现在这是执行Python api工作的首选方法 - 除此之外,它更少冗长而且避免使用MScriptUtil,如果使用不当,则容易出现崩溃。对大多数事情来说,它也更快。

这是普通矩阵乘法:

from maya.api.OpemMaya import MMatrix
mat1  = MMatrix ([0.707107, 0, -0.707107, 0, 0.5, 0.707107, 0.5, 0, 0.5, -0.707107, 0.5, 0, 0, 0, 0, 1])
mat2 = MMatrix([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 100, 200, 300, 1])
print mat1 * mat2
# (((0.707107, 0, -0.707107, 0), (0.5, 0.707107, 0.5, 0), (0.5, -0.707107, 0.5, 0), (100, 200, 300, 1)))

你不能直接乘以MTransformationMatrix - 该类不是线性代数矩阵,它是矩阵的各种位置,旋转,比例,剪切和枢轴数据函数的访问器。如果你想在变换节点上自己完成所有连接数学运算,比如在不改变其比例的情况下设置其旋转,则可以使用它。

您可以使用MTransformationMatrix函数从asMatrix()获取重叠矩阵。要将矩阵应用于对象:

from maya.api.OpenMaya import MTransformationMatrix, MGlobal, MSelectionList, MFnDagNode

sel = MGlobal.getActiveSelectionList()  # selection
dagpath = sel.getDependNode(0)          # first node
transform_node  = MFnTransform(dagpath) # MFnTransform
xfm= transform_node.transformation().asMatrix()  # matrix
new_matrix = mat1 * xfm                 # math
new_trans = MTransformationMatrix(new_matrix)
transform_node.setTransformation(new_trans)