NurbsCurve MatrixMath Maya api Python

时间:2014-05-04 17:29:42

标签: python math matrix maya nurbs

我正在创建一个工具集,用于使用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]) )

1 个答案:

答案 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数学中做这个...