如何使用 openMaya 将一个矩阵与另一个矩阵相乘?
how do you multiply a matrix to another with openMaya?
我正在尝试创建一个脚本,用于在 Maya 中跨 yz 平面进行镜像变换。
我能够建立一个获得预期结果的节点网络。我在原点取了一个节点,sz 设置为 -1,在左侧取了一个源节点(lf_grp 用于此测试),并将它们的 worldMatrix 属性输入到 multMatrix 节点。然后我将输出 (multMatrix.matrixSum) 通过分解矩阵传递到我的目标节点。
我真的不想创建一堆节点来做我的镜像 - 运行 一个 create/connect/disconnect/delete 循环每次都是缓慢而痛苦的......我宁愿只是 "math the crap out of it" 通过我的脚本,但我似乎无法弄清楚如何实际乘以我的两个矩阵...
哦,我正在使用 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????
以下是如何使用 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
-- class 不是线性代数矩阵,它是各种位置、旋转、缩放、剪切和枢轴数据函数的访问器的一个矩阵。如果您想自己在变换节点上进行所有连接数学运算,例如在不更改其比例的情况下设置其旋转,则可以使用它。
您可以使用 asMatrix()
函数从 MTransformationMatrix
中获取底层矩阵。将矩阵应用于对象:
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)
我正在尝试创建一个脚本,用于在 Maya 中跨 yz 平面进行镜像变换。
我能够建立一个获得预期结果的节点网络。我在原点取了一个节点,sz 设置为 -1,在左侧取了一个源节点(lf_grp 用于此测试),并将它们的 worldMatrix 属性输入到 multMatrix 节点。然后我将输出 (multMatrix.matrixSum) 通过分解矩阵传递到我的目标节点。
我真的不想创建一堆节点来做我的镜像 - 运行 一个 create/connect/disconnect/delete 循环每次都是缓慢而痛苦的......我宁愿只是 "math the crap out of it" 通过我的脚本,但我似乎无法弄清楚如何实际乘以我的两个矩阵...
哦,我正在使用 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????
以下是如何使用 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
-- class 不是线性代数矩阵,它是各种位置、旋转、缩放、剪切和枢轴数据函数的访问器的一个矩阵。如果您想自己在变换节点上进行所有连接数学运算,例如在不更改其比例的情况下设置其旋转,则可以使用它。
您可以使用 asMatrix()
函数从 MTransformationMatrix
中获取底层矩阵。将矩阵应用于对象:
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)