Maya Python: применить матрицу преобразования

#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, я знаю, как запрашивать матрицу из и объект, но мне нужно делать это из каждой вершины, заранее спасибо