我正在创建一个工具集,用于使用python在maya中创建nurbs曲线/曲面。
我有一组字典,包括cvPositions,knots,form等,每个字典都描述了一个预设的3d形状(立方体,圆形,金字塔形等)。 我还在节点元数据中存储了一个3d矩阵,用作形状的偏移量。这允许您在不移动变换的情况下缩放/移动/旋转形状。
问题在于我应用此矩阵的方式非常慢:
首先,我将在包含曲线的(orig)变换的位置创建一个新的(编辑)变换。 接下来,我将在世界空间中将cv位置从(orig)变换转换为(编辑)变换 接下来,我将(编辑)变换移动到矩阵位置。 最后,我将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]) )
答案 0 :(得分:0)
最简单的方法是使用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数学中做这个...