在Maya 2015年,我可以使用这个命令来获得曲线的ARCLEN:如何获取Maya中两个曲线点之间的arclen?
cmds.arclen('bezier1')
但现在我想要得到的两点ARCLEN在我的曲线。无论如何得到这个?
在Maya 2015年,我可以使用这个命令来获得曲线的ARCLEN:如何获取Maya中两个曲线点之间的arclen?
cmds.arclen('bezier1')
但现在我想要得到的两点ARCLEN在我的曲线。无论如何得到这个?
使用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
使用Maya API,您可以使用MFnNurbsCurve::findLengthFromParam(仅适用于Maya 2016+)。如果两点之间需要它,则用每个参数调用该函数并减去。
如果您不想使用api,那么另一个选项是创建您的原始曲线的副本,并在需要的点使用“分离”它,然后在该新曲线上使用arclen命令来获得您的长度。那是另一种方式。
请注意,分离曲线时,似乎尝试尽量保持曲率尽可能接近原始值,但这并不准确,所以与原始曲线相比,长度可能不同。也许重建曲线以获得更多点可能会提高精度,如果这对您而言是一个重要因素。
感谢您的回答,所以在Maya2015中没有这样的api? –
看着文档,它并不是如此。你可以自己写一个,但如果研究近似b样条的长度,则会更复杂一些 – scottiedoo