0

我想沿着由位置列表定义的 nurbs 曲线获取特定参数的世界位置。目前我正在插件中创建一个临时曲线,只是为了沿着这条曲线获得一系列位置:

    # targetXforms = array of MPoints
    # knots = knots list
    # uValue = array of floats (0->1)
    #

    curveFn = om.MFnNurbsCurve()
    curveFn.create(targetXforms, knots, 3, om.MFnNurbsCurve.kOpen, False, False, nullObj)
    for i in range (numRefXforms):
        point = curveFn.getPointAtParam (uValue[i])
        print point

有没有更好的方法来做到这一点(即没有创建曲线的开销)?也许一些数学库?如果不是,我该如何删除这条曲线,这样我就不会在每次评估插件时都创建曲线(MDGModifier 似乎有点崩溃)

此外,有没有办法找到给定参数值沿曲线的长度。Maya 2016 Extension 2 有一个功能:MFnNurbsCurve::findLengthFromParam()

但是,我们还没有这个扩展。:(

提前致谢!

4

1 回答 1

0

如果您将 Nurbs 曲线数据对象提供给 MFnNurbsCurve.create() 作为父对象,而不是将其保留为空,则数据不会在场景图中显示为曲线,因此您不必将其删除。

尝试这个:

import pymel.core as pm

pts = ( [ 0,0,0 ], [  0,10,0 ], [  0,10,10 ], [ 0,0,10 ])
knots = [0,0,0,1,1,1]

curveFn = om.MFnNurbsCurve()

dataCreator = om.MFnNurbsCurveData()
curveDataObject = dataCreator.create()

curveFn.create(pts, knots, 3, om.MFnNurbsCurve.kOpen, False, False, curveDataObject)

for i in range(11):
    point = curveFn.getPointAtParam (i/10.0)
    pm.spaceLocator(p=(point.x, point.y, point.z))

要在没有 API 的情况下获取参数的弧长,您可以创建一个 arcLengthDimension 节点。这意味着您必须在场景中创建一条曲线并将其连接起来。

dimNode = pm.arcLengthDimension( 'curveShape1.u[0]' )
dimNode.uParamValue.set( 0.5 )
print(dimNode.arcLength.get()
于 2016-10-25T20:25:28.093 回答