我一直在寻找答案,但我似乎无法在任何地方找到答案,所以我希望我能在这里得到答案......
我在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)]
现在我的最后一步是将此矩阵应用于网格,但我找不到一个好方法,有人知道如何在maya上执行此操作吗?
提前致谢: Seyren。
答案 0 :(得分:1)
通过将矩阵应用于网格物体不确定您的意思,但是如果您想通过使用该矩阵转换它们来更新每个点的位置,那么您可以在这里找到给定的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以便您了解。