2016-11-08 3 views

Antwort

0

Die Verwendung der Maya-API ist sicherlich der beste Weg, um es zu tun, wie @ Scotttiedoo sagte, aber hier ist eine Funktion, die ich gemacht habe, wenn ich API nicht kannte und die Ihnen die gleichen Ergebnisse liefert.

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 
1

Mit der Maya-API können Sie die MFnNurbsCurve::findLengthFromParam (nur Maya 2016+) verwenden. Wenn Sie es zwischen zwei Punkten benötigen, dann rufen Sie diese Funktion mit jedem Parameter auf und subtrahieren Sie.

Wenn Sie nicht die API verwenden möchten, dann ist die andere Option ein Duplikat Ihrer ursprünglichen Kurve erstellen und verwenden Sie "detach" es an den erforderlichen Punkten und dann den Befehl ARClen auf dieser neuen Kurve zu erhalten Länge. Das ist ein anderer Weg.

Beachten Sie, dass beim Abnehmen einer Kurve versucht wird, die Krümmung so nahe wie möglich am Original zu halten, aber dies ist nicht exakt, so dass die Länge im Vergleich zur ursprünglichen Kurve möglicherweise nicht identisch ist. Vielleicht kann die Wiederherstellung der Kurve, um mehr Punkte zu erhalten, die Genauigkeit erhöhen, wenn dies ein wichtiger Faktor für Sie ist.

+0

Danke für die Antwort, so gibt es keine solche API in Maya2015? –

+0

Mit Blick auf die Dokumente scheint es nicht so. Du könntest selbst einen schreiben, aber es ist etwas komplexer, wenn du nach Annäherungslängen von b-Splines forschst – scottiedoo

Verwandte Themen