Maya Python:应用变换矩阵
我一直在寻找这个答案,但似乎哪里都找不到,所以我希望能在这里找到答案...
我在使用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 上找到,并且还有一个 文档,可以让你了解更多信息。