NurbsCurve 矩阵数学 Maya API Python

0 投票
1 回答
1168 浏览
提问于 2025-04-18 05:20

我正在用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中进行数学运算……

撰写回答