Maya Python:应用变换矩阵

1 投票
1 回答
4481 浏览
提问于 2025-04-18 12:08

我一直在寻找这个答案,但似乎哪里都找不到,所以我希望能在这里找到答案...

我在使用Maya的Python API,想把一个变换矩阵应用到一个网格上。

这是我创建网格的方式:

    mesh = om.MFnMesh()
    ShapeMesh = cmds.group(em=True)
    parentOwner = get_mobject( ShapeMesh )
    meshMObj = mesh.create(NumVerts, len(FaceCount), VertArray, FaceCount, FaceArray ,parentOwner)
    cmds.sets( ShapeMesh, e=True,forceElement='initialShadingGroup')
    defaultUVSetName = ''
    defaultUVSetName = mesh.currentUVSetName(-1)
    mesh.setUVs ( UArray, VArray, defaultUVSetName )
    mesh.assignUVs ( FaceCount,  FaceArray, defaultUVSetName )

这是我创建变换矩阵(TFM)的方法:

m = struct.unpack("<16f",f.read(64))
mm = om.MMatrix()
om.MScriptUtil.createMatrixFromList(m,mm)
mt = om.MTransformationMatrix(mm)

基本上,我读取了16个浮点数并把它们转换成一个变换矩阵,不过我不知道怎么把这个矩阵应用到我的网格上...

不过,我成功地从中得到了位置、旋转和缩放,也许这对你有帮助,方法如下:

    translate = mt.translation(om.MSpace.kWorld)
    rotate = mt.rotation().asEulerRotation()
    scaleUtil = om.MScriptUtil()
    scaleUtil.createFromList([0,0,0],3)
    scaleVec = scaleUtil.asDoublePtr()
    mt.getScale(scaleVec,om.MSpace.kWorld)
    scale = [om.MScriptUtil.getDoubleArrayItem(scaleVec,i) for i in range(0,3)]

现在我最后一步是把这个矩阵应用到网格上,但我找不到好的方法,有人知道在Maya中怎么做吗?

提前谢谢你们:Seyren。

1 个回答

1

我不太明白你说的“把矩阵应用到你的网格上”是什么意思,但如果你想通过这个矩阵来更新每个点的位置,那我可以给你一个例子,假设你有一个叫 mesh 的 MFnMesh 和一个叫 matrix 的 MMatrix:

import banana.maya
banana.maya.patch()
from maya import OpenMaya

mesh = OpenMaya.MFnMesh.bnn_get('pCubeShape1')
matrix = OpenMaya.MMatrix()

points = OpenMaya.MPointArray()
mesh.getPoints(points)
for i in range(points.length()):
    points.set(points[i] * matrix, i)

mesh.setPoints(points)

如果你不想直接更新网格的点,那么你需要把矩阵应用到变换节点上,这样你就得获取它的父变换,然后使用 MFnTransform::set() 方法。

注意,我在我的代码示例中使用了一些我自己写的扩展,这些扩展可能对你使用 Maya Python API 有帮助。代码可以在 GitHub 上找到,并且还有一个 文档,可以让你了解更多信息。

撰写回答