#python #matrix #maya
#python #матрица #maya
Вопрос:
Я искал ответ, но, похоже, нигде не смог его найти, поэтому я надеюсь, что смогу получить свой ответ здесь…
Я использую API Maya Python и хочу применить матрицу преобразования к сетке.
Вот как я создал сетку:
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?
Заранее спасибо: Сейрен.
Комментарии:
1. У сеток нет преобразований, а скорее у их родительских узлов есть преобразования. Зачем утруждать себя выполнением этого с помощью команд api? Я имею в виду, что cmds.xform отлично справляется с этой задачей за вас, и вам не нужно реализовывать отмену.
Ответ №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()
метод.
Обратите внимание, что я использовал в своем фрагменте кода набор написанных мной расширений, которые могут быть полезны, если вы используете API Maya Python. Код доступен на GitHub, а также к нему прилагается документация, которая даст вам представление.
Комментарии:
1. Теперь, когда мы здесь, знаете ли вы, как запросить матрицу из определенной вершины с помощью API? Я знаю, как получить точки и перевести каждую из них в мировое пространство, точно так же, как с MMatrix, я знаю, как запрашивать матрицу из и объект, но мне нужно делать это из каждой вершины, заранее спасибо