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...