NurbsCurve MatrixMath Maya api Python

Я создаю набор инструментов для создания кривых NURBS / поверхностей внутри Maya, используя Python.

У меня есть набор словарей, которые включают cvPositions, узлы, форму и т. Д., Каждый из которых описывает предустановленную 3D-форму (куб, круг, пирамида и т. Д.). У меня также есть трехмерная матрица, хранящаяся в метаданных узлов, которая используется в качестве смещения для фигуры. Это позволяет масштабировать / перемещать / вращать фигуру, не перемещая преобразование.

Проблема в том, что я применяю эту матрицу очень медленно:

Сначала я создам новое (редактировать) преобразование в позиции (ориг) преобразования, содержащего кривые. Далее я перенесу cv позиции в мировом пространстве из преобразования (orig) в (edit) transform. Затем я переместлю (edit) transformation в позицию матрицы. Наконец, я перенесу cvPositions обратно в преобразование (orig)

При создании сотен фигур это становится слишком медленным...

Может кто-нибудь описать математический способ применения матрицы к набору 3d-точек? Возможно, с помощью одного из математических модулей или NumPy?

С другой стороны,

Есть ли способ использовать функции OpenMaya API для этого? Возможно, с MPointArray? Это насколько я получил на этом фронте:

    crv = OpenMaya.MFnNurbsCurve( self.dagPath )
    cvs = OpenMaya.MPointArray()
    space = OpenMaya.MSpace.kWorld
    crv.getCVs(cvs, space)
    positions = []
    for i in range(cvs.length()):
        pt = cvs[i]
        positions.append( (pt[0], pt[1], pt[2]) )

1 ответ

Самый простой способ - использовать встроенные в Pymel версии точек и матриц (Pymel встроен в Maya 2011+). Математические типы находятся в pymel.datatatypes; Вот пример преобразования точки с помощью матрицы в Pymel:

import pymel.core as pm
pt = pm.datatypes.Point(0,0,0)
mt = pm.datatypes.Matrix(1,0,0,0, 0,1,0,0, 0,0,1,0, 5,5,5,1 )
moved = pt * mt
print moved
# [5,5,5]

Точки Pymel и матрицы позволят вам сделать ваш алгоритм. Математика будет выполняться в API, но преобразования Python <> C++ могут все еще заставить его работать с большими данными довольно медленно.

Похоже, вы в основном воссоздаете "стоп-трансформации" с последующими "нулевыми опорными точками". Может быть, вы должны попробовать это в качестве альтернативы делать это в математике Python...

Другие вопросы по тегам