0

我正在创建一个工具集,用于使用 python 在 Maya 中创建 nurbs 曲线/曲面。

我有一组字典,其中包括 cvPositions、knots、form 等。每个字典都描述了一个预设的 3d 形状(立方体、圆形、金字塔等)。我还有一个存储在节点元数据中的 3d 矩阵,用作形状的偏移量。这允许您在不移动变换的情况下缩放/移动/旋转形状。

问题在于我应用这个矩阵的方式非常慢:

首先,我将在包含曲线的(原始)变换的位置创建一个新的(编辑)变换。接下来,我将把世界空间中的 cv 位置从 (orig)transform 转移到 (edit)transform 接下来我将把 (edit)transform 移动到矩阵位置。最后,我会将 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]) )
4

1 回答 1

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 数学中执行此操作的替代方法...

于 2014-05-05T01:56:16.257 回答