【问题标题】:how do you multiply a matrix to another with openMaya?如何使用 openMaya 将一个矩阵与另一个矩阵相乘?
【发布时间】:2017-08-01 13:53:56
【问题描述】:

我正在尝试创建一个脚本,用于在 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????

【问题讨论】:

  • 忘了说我不想使用 pymel...

标签: python maya


【解决方案1】:

以下是使用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 相乘——该类不是线性代数矩阵,它是矩阵的各种位置、旋转、缩放、剪切和枢轴数据函数的访问器。如果您想自己在变换节点上完成所有连接数学,您可以使用它,例如在不改变其比例的情况下设置其旋转。

您可以使用MTransformationMatrixasMatrix() 函数从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)

【讨论】:

  • 感谢您的信息!我能够从中得到我需要的东西。我实际上并不了解 openMaya api v2……它对我来说比原来的更有意义 - 你知道它是否具有所有相同的功能吗?
  • 几乎一样。如果您在现有的东西上没有沉没成本,那么绝对值得转换
猜你喜欢
  • 2020-02-24
  • 1970-01-01
  • 1970-01-01
  • 2019-11-15
  • 1970-01-01
  • 1970-01-01
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多