如何用openMaya将矩阵乘以另一个矩阵?

问题描述:

我正在尝试在Maya中创建一个用于在yz平面上镜像变换的脚本。如何用openMaya将矩阵乘以另一个矩阵?

我能够建立一个能获得理想结果的节点网络。我将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???? 
+0

忘了提及我不想使用pymel ... –

以下是如何使用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) 
+0

感谢您的信息!我能够从中得出我需要的东西。我实际上并不知道openMaya api v2 ......它比原来更适合我 - 你是否知道它是否具有所有相同的功能? –

+0

这几乎是一样的。如果你在现有的东西中没有沉没成本,这绝对是值得的 – theodox