如何在Maya中的两个曲线点之间获得arclen?

时间:2016-11-08 09:21:44

标签: maya maya-api

在Maya 2015中,我可以使用此命令获取曲线的arclen:

$http.get($rootScope.baseurl + 'api/hotels/', {
    params: {
        page_size: $scope.page_size,
        page: $scope.page,
        goingTo: goingTo,
        ordering: $scope.sortBy,
        star: $scope.filter.star,
        min_price: 50
    }
}).then(
    function(data, status, headers, config) {
        $scope.Hotels = data.data.results;
        $scope.Hotels = $scope.Hotels.filter(function(hotel){ return hotel.min_price < 50}); //filter hotels
        $scope.count = data.data.count;
        $scope.loading = false;
        PageService.setContentReady();
    },
    function(data, status, headers, config) {
        $scope.loading = false;
        PageService.contentStatus = 'ready';
    }
);

但现在我想得到曲线中两点的arclen。反正有没有得到这个?

2 个答案:

答案 0 :(得分:1)

使用Maya API,您可以使用MFnNurbsCurve::findLengthFromParam(仅限Maya 2016+)。如果你需要在两点之间,那么用每个参数调用这个函数并减去。

如果您不想使用api,则另一个选项是创建原始曲线的副本并使用&#34; detach&#34;它在需要的点然后在新曲线上使用arclen命令来获得你的长度。这是另一种方式。

请注意,在分离曲线时,它似乎试图使曲率尽可能接近原始曲线,但这并不精确,因此与原始曲线相比,长度可能不同。如果这对你来说很重要,重建曲线以获得更多分数可能会提高准确性。

答案 1 :(得分:0)

使用Maya的API肯定是最好的方法,就像@scottiedoo所说的那样,但这是我在不知道API的时候制作的一个函数,它会给你相同的结果。

from maya import cmds

def computeCrvLength(crv, startParam = None, endParam = None):
    '''
    Compute the length of a curve between the two given UParameters. If the both
    UParameters arguments are set to None (default), will compute the length of
    the whole curve.

    Arguments:
    - crv = string; an existing nurbCurve
    - startParam = 0 <= float <= 1 or None; default = None; point parameter
      value, if not None, will compute the points only between the startPt and
      EndPt values.
    - endParam = 0 <= float <= 1 or None; default = None; point parameter
      value, if not None, will compute the points only between the startPt and
      EndPt values.

    Returns:
    - The length of the curve between the given UParameters
    - The length of the curve from its start to the startParam
    - The length of the curve from its start to the endParam
    '''

    ###### Exceptions
    if cmds.objExists(crv) == False:
        cmds.error ('The curve "%s" does\'nt exists.' % crv)

    if cmds.filterExpand (crv, sm = 9) == None:
        cmds.error ('The object "%s" is not a nurbCurve.' % crv)

    if startParam != None:
        if (0 <= startParam <= 1) == False:
            cmds.error ('The start point parameter value must be between 0 and 1.')

    if endParam != None:
        if (0 <= endParam <= 1) == False:
            cmds.error ('The end point parameter value must be between 0 and 1.')

    if (startParam == None and endParam != None) or (startParam != None and endParam == None):
        cmds.error ('The start and end points parameters must be both None or ' + 
                    'both have values.')

    if startParam != None and endParam != None:
        if endParam < startParam:
            cmds.error ('The end point parameter value cannot be less or ' + 
                        'equal to start point parameter value.')

    ###### Function
    if startParam == None and endParam == None:

        crvLength = cmds.arclen (crv, ch = False)
        distCrvToStartParam = 0
        distCrvToEndParam = crvLength

    else:

        tmpArclenDim = cmds.arcLengthDimension (cmds.listRelatives(crv, s = True)[0]
                                                + '.u[0]')
        cmds.setAttr (cmds.listRelatives(tmpArclenDim, p = True)[0] +
                      '.uParamValue', startParam)
        distCrvToStartParam = cmds.getAttr (tmpArclenDim + '.al')
        cmds.setAttr (cmds.listRelatives(tmpArclenDim, p = True)[0] +
                      '.uParamValue', endParam)
        distCrvToEndParam = cmds.getAttr (tmpArclenDim + '.al')
        cmds.delete (tmpArclenDim)
        crvLength = (distCrvToEndParam - distCrvToStartParam)

    return crvLength, distCrvToStartParam, distCrvToEndParam