NurbsCurve 矩阵数学 Maya API Python
我正在用Python为Maya创建一个工具集,用来制作NURBS曲线和曲面。
我有一组字典,里面包含了cv位置、节点、形状等信息,每个字典描述了一种预设的3D形状(比如立方体、圆形、金字塔等)。我还在节点的元数据中存储了一个3D矩阵,这个矩阵用来作为形状的偏移量。这样一来,你就可以在不移动变换的情况下,缩放、移动或旋转这个形状。
不过,我应用这个矩阵的方式非常慢:
首先,我会在包含曲线的原始变换位置创建一个新的(编辑)变换。接着,我会把原始变换中的cv位置从世界空间转移到这个编辑变换中。然后,我会把这个编辑变换移动到矩阵的位置。最后,我会把cv位置再转回到原始变换中。
当我需要创建数百个形状时,这个过程变得非常慢……
有没有人能告诉我一个数学方法,来把矩阵应用到一组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
最简单的方法是使用pymel自带的点和矩阵版本(pymel在Maya 2011及以上版本中自带)。这些数学类型在pymel.datatypes里;下面是一个在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中进行数学运算……