我一直在寻找答案,但是我似乎在任何地方都找不到,所以我希望我能在这里得到答案...

我在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个浮点数并将它们转换为转换矩阵,但是我不知道如何将mt矩阵应用于我的网格...

我设法从中获得了位置,旋转和比例,也许这样可以帮助:

    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)]


现在,我的最后一步是将此Matrix应用于网格,但是我找不到一种很好的方法,有人知道如何在maya上进行此操作吗?

提前致谢:
世仁

最佳答案

不确定将矩阵应用于您的网格意味着什么,但是如果您想通过使用该矩阵对其进行变换来更新每个点的位置,则可以使用给定的MFnMesh mesh和给定的MMatrix matrix

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上使用,并且还附带一个documentation以便给您一个想法。

关于python - Maya Python:应用转换矩阵,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24577540/

10-11 22:24
查看更多