def CutRailPieces(curve="", height=1.0, width=1.0): mc.delete(curve, ch=True) railGeoList = [] tempCurCurve = [curve] mc.rebuildCurve(curve, s=curveLength / trackSegmentLength * 5) finalSegmentCurve = mc.detachCurve( curve + ".ep[" + str(int(curveLength / trackSegmentLength * 5) - 5) + "]", rpo=False, ch=False) finalSegmentGeo = MakeRailPiece(curve=finalSegmentCurve[1], width=width, height=height) railGeoList.append(finalSegmentGeo) mc.delete(finalSegmentCurve[0], finalSegmentCurve[1]) deleteGroup = [] for x in range(int(curveLength / trackSegmentLength)): tempCurCurve = mc.detachCurve(tempCurCurve[0] + ".ep[5]", rpo=True, ch=False) curRail = MakeRailPiece(curve=tempCurCurve[1], width=width, height=height) railGeoList.append(curRail) deleteGroup.append(tempCurCurve[0]) print "iteration" mc.delete(deleteGroup) return railGeoList
def split(crv,param,deleteHistory=True): ''' Split specified curve based on the parameter value(s) provided. @param crv: Curve to split @type crv: str @param param: Split curve at the parameter(s) provided. @type param: float or list @param deleteHistory: Delete construction history @type deleteHistory: bool ''' # Check Curve if not mc.objExists(crv): raise Exception('Curve "'+crv+'" does not exist!') # Split Curve detach = mc.detachCurve(crv,p=param,ch=True,replaceOriginal=True) detachCrv = mc.ls(detach,transforms=True) detachCrv.insert(0, detachCrv.pop(-1)) for i in range(len(detachCrv)): detachCrv[i] = mc.rename(detachCrv[i],crv+'_split'+str(i+1)) # Delete History if deleteHistory: mc.delete(detachCrv,ch=True) # Return Result return detachCrv
def trimHair(curves, min, percent): ''' random.randomly trim hair curves for more variation in length ''' percentOfCurves = int(len(curves) * percent) for i in range(percentOfCurves): activeCurve = curves.pop(int(random.random()*len(curves))) r = (random.random() * (1.0 - min)) + min mc.delete(mc.detachCurve('%s.u[%f]' % (activeCurve, r), ch=False, cos=True, rpo=True)[0])
def fromPoint(curve,pnt=[0.0,0.0,0.0],replaceOrig=False,keepHistory=True): ''' ''' # Get subCurve parameter param = glTools.utils.curve.closestPoint(curve,pnt) # Detach curve subCurve = mc.detachCurve(curve,p=param,replaceOriginal=replaceOrig,ch=keepHistory) # Return result return subCurve
def fromPoint(curve, pnt=[0.0, 0.0, 0.0], replaceOrig=False, keepHistory=True): """ """ # Get subCurve parameter param = glTools.utils.curve.closestPoint(curve, pnt) # Detach curve subCurve = cmds.detachCurve(curve, p=param, replaceOriginal=replaceOrig, ch=keepHistory) # Return result return subCurve
def trimFromBeginning(inputCurves, shortestLength): newCurves = [] for obj in inputCurves: parent = mc.listRelatives(obj, parent=True) r = random.random()*(1-shortestLength) obj = mc.rebuildCurve(obj, ch=0, rpo=1, rt=0, end=1, kr=0, kcp=1, kep=1, kt=0, s = 10, d = 3, tol = 0)[0] curves = mc.detachCurve( '%s.u[%f]' % (obj, r), ch=0, cos=True, rpo=1 ) mc.delete(curves[-1]) mc.rebuildCurve(curves[0], ch=1, rpo=1, rt=0, end=1, kr=0, kcp=0, kep=1, kt= 0, s = 0, d = 3, tol = 0) curves[0] = mc.rename(curves[0], obj) if parent: curves[0] = mc.parent(curves[0], parent)[0] newCurves.append(curves[0]) return newCurves
def fromRefCurve(curve,refCurve,rebuildToRef=True): ''' ''' # Get start and end reference points stRef = mc.pointOnCurve(refCurve,top=True,pr=0.0,p=True) enRef = mc.pointOnCurve(refCurve,top=True,pr=1.0,p=True) # Get boundary parameters stParam = glTools.utils.curve.closestPoint(curve,stRef) enParam = glTools.utils.curve.closestPoint(curve,enRef) # SubCurve subCurve = mc.detachCurve(curve,p=[stParam,enParam],replaceOriginal=False,ch=False) mc.delete(subCurve[0],subCurve[2]) subCurve = mc.rename(subCurve[1],curve+'_subCurve') if rebuildToRef: degree = mc.getAttr(refCurve+'.degree') spans = mc.getAttr(refCurve+'.spans') mc.rebuildCurve(subCurve,ch=0,rpo=1,rt=0,end=1,kr=0,kcp=0,kep=1,kt=0,s=spans,d=degree,tol=0) # Return result return subCurve
def fromRefCurve(curve, refCurve, rebuildToRef=True): """ """ # Get start and end reference points stRef = cmds.pointOnCurve(refCurve, top=True, pr=0.0, p=True) enRef = cmds.pointOnCurve(refCurve, top=True, pr=1.0, p=True) # Get boundary parameters stParam = glTools.utils.curve.closestPoint(curve, stRef) enParam = glTools.utils.curve.closestPoint(curve, enRef) # SubCurve subCurve = cmds.detachCurve(curve, p=[stParam, enParam], replaceOriginal=False, ch=False) cmds.delete(subCurve[0], subCurve[2]) subCurve = cmds.rename(subCurve[1], curve + '_subCurve') if rebuildToRef: degree = cmds.getAttr(refCurve + '.degree') spans = cmds.getAttr(refCurve + '.spans') cmds.rebuildCurve(subCurve, ch=0, rpo=1, rt=0, end=1, kr=0, kcp=0, kep=1, kt=0, s=spans, d=degree, tol=0) # Return result return subCurve
def buildSubCurveDetach(crv): """ """ # Get Prefix prefix = glTools.utils.stringUtils.stripSuffix(crv) # Prep Curve cmds.rebuildCurve(crv, ch=False, rpo=True, rt=0, end=1, kr=0, kcp=1, kep=1, kt=0, s=0, d=3) cmds.delete(crv, ch=True) # Detach Curve detach = cmds.detachCurve(crv, p=(0.001, 0.999), k=(0, 1, 0), rpo=False) detachCrv = detach[1] detachNode = detach[-1] cmds.delete(detach[0], detach[2]) # Connect Detach Min/Max cmds.addAttr(subCrv, ln='min', min=0, max=0.999, dv=0, k=True) cmds.addAttr(subCrv, ln='max', min=0.001, max=1, dv=1, k=True) cmds.addAttr(subCrv, ln='offset', min=-1, max=1, dv=1, k=True) minAdd = cmds.createNode('addDoubleLinear', n=prefix + '_minAdd_addDoubleLinear') maxAdd = cmds.createNode('addDoubleLinear', n=prefix + '_maxAdd_addDoubleLinear') minMaxClamp = cmds.createNode('clamp', n=prefix + '_minMax_clamp') cmds.connectAttr(subCrv + '.min', minAdd + '.input1', f=True) cmds.connectAttr(subCrv + '.offset', minAdd + '.input2', f=True) cmds.connectAttr(subCrv + '.max', maxAdd + '.input1', f=True) cmds.connectAttr(subCrv + '.offset', maxAdd + '.input2', f=True) cmds.connectAttr(minAdd + '.output', minMaxClamp + '.inputR', f=True) cmds.connectAttr(maxAdd + '.output', minMaxClamp + '.inputB', f=True) cmds.setAttr(minMaxClamp + '.min', 0, 0, 0.0001) cmds.setAttr(minMaxClamp + '.max', 0.9999, 0, 0) cmds.connectAttr(minMaxClamp + '.outputR', detachNode + '.parameter[0]', f=True) cmds.connectAttr(minMaxClamp + '.outputB', detachNode + '.parameter[1]', f=True) # Return Result return detachCrv
def split_len_crv(self): """ Create two child curves that are half the primary lenCurve to separate the upper and lower segments for use in arms and legs """ curve = self.lenCurves[0] # Split the curve at the halfway point crvs = mc.detachCurve("{}.u[.5]".format( curve), ch=True, n="{}_base".format(curve)) # Name the new curves and add them to a New Curves list mc.rename(crvs[1], "{}_tip".format(curve)) crvs[1] = "{}_tip".format(curve) newCrvs = crvs[0:2] for crv in newCrvs: mc.setAttr("{}.visibility".format(crv), 0) # Add each curve to lenCurves cless variable... self.lenCurves.append(crv) # ...and parent them to the primary curve mc.parent(crv, curve) return newCrvs
def cutCrvOnIntersection(): ''' Main method. ''' selList = cmds.ls(sl=True) curves = selList[0:-1] surface = selList[-1] # Define input surface type. srfcShp = cmds.listRelatives(surface, s=True)[0] if cmds.objectType(srfcShp) == 'mesh': cpNodeType = 'closestPointOnMesh' elif cmds.objectType(srfcShp) == 'nurbsSurface': cpNodeType = 'closestPointOnSurface' # Create "closestPointOnMesh" or "closestPointOnSurface" node depend on surface type. cpNode = cmds.createNode(cpNodeType, n='temp_cpNode') # Connect surface to cpNode(closet point node). if cpNodeType == 'closestPointOnMesh': cmds.connectAttr('%s.worldMesh[0]' % (srfcShp), '%s.inMesh' % (cpNode), f=True) if cpNodeType == 'closestPointOnSurface': cmds.connectAttr('%s.worldSpace[0]' % (srfcShp), '%s.inputSurface' % (cpNode), f=True) errorCrvList = [] # Show progress window. if cmds.window('progWin', exists=True): cmds.deleteUI('progWin') cmds.window('progWin', title='Working...') cmds.columnLayout() cmds.progressBar('progBar', minValue=0, maxValue=len(curves), width=300, isMainProgressBar=True, beginProgress=True, isInterruptable=True) cmds.window('progWin', e=True, w=300, h=10) cmds.showWindow('progWin') for curve in curves: # Progress window. if cmds.progressBar('progBar', q=True, isCancelled=True): print 'Cutting curve job is cancelled.' break cmds.progressBar('progBar', e=True, step=1) # Initialize variables. tempCrvPos = 0 tempCrvPosList = [tempCrvPos] increment = 0.5 tolerance = 0.005 maxCalNum = 3000 calCount = 1 dist = calDist(curve, tempCrvPos, cpNode) # While distance is greater than tolerance, increse tempCrvPos and calculate again. while dist > tolerance: tempCrvPos += increment # If already calculate temporary curve point, skip it. if tempCrvPos in tempCrvPosList: continue else: # If calulate number reaches to maximun calulate number, break. if calCount == maxCalNum: print '%s is not intersecting curve.' % (curve) errorCrvList.append(curve) break dist = calDist(curve, tempCrvPos, cpNode) tempCrvPosList.append(tempCrvPos) calCount += 1 # If temporary curve position reaches to maxium value at 1, reset the value and decrease increment to more dense searching. if tempCrvPos >= 1: tempCrvPos = 0 increment = increment / 2 if not calCount == maxCalNum: # If distance is less than tolerance, cut curve and go to the next curve. cmds.select('%s.un[%f]' % (curve, tempCrvPos)) cmds.detachCurve(rpo=True) # Remove progress window. cmds.progressBar('progBar', e=True, endProgress=True) cmds.deleteUI('progWin') cmds.delete(cpNode) cmds.select(errorCrvList, r=True)
def detachCurve(*args, **kwargs): res = cmds.detachCurve(*args, **kwargs) if not kwargs.get('query', kwargs.get('q', False)): res = _factories.maybeConvert(res, _general.PyNode) return res
def cutBirailCurves(inCurve, indexCurve) : shell = inCurve bbox = cmds.exactWorldBoundingBox(shell) closestPoint = cmds.createNode('closestPointOnCurve') tmpShape = cmds.listRelatives(shell, children=True) print tmpShape cmds.setAttr(closestPoint + '.inPositionX', bbox[0] - 5) cmds.setAttr(closestPoint + '.inPositionY', bbox[1] - 5) cmds.setAttr(closestPoint + '.inPositionZ', bbox[2]) cmds.connectAttr((tmpShape[0] + '.worldSpace'), (closestPoint + '.inCurve')) Dcorner =cmds.getAttr(closestPoint + '.paramU') print Dcorner ref = cmds.duplicate(shell) #set first cv to first corner spans = cmds.getAttr(tmpShape[0] + '.spans') i = Dcorner print Dcorner for k in xrange(spans+1): IDA = cmds.xform('%s.cv[%s]'%(ref[0], str(int(i))), q = True, translation=True, worldSpace=True) print IDA cmds.move(IDA[0] , IDA[1], IDA[2], '%s.cv[%s]'%(shell, str(int(k))), ws = True) i = i + 1 print i if i > (spans ) : i = i - spans cmds.delete(ref) #get other corners cmds.setAttr(closestPoint + '.inPositionX', bbox[0] - 5) cmds.setAttr(closestPoint + '.inPositionY', bbox[4] + 5) cmds.setAttr(closestPoint + '.inPositionZ', bbox[2]) Acorner =cmds.getAttr(closestPoint + '.paramU') cmds.setAttr(closestPoint + '.inPositionX', bbox[3] + 5) cmds.setAttr(closestPoint + '.inPositionY', bbox[4] + 5) cmds.setAttr(closestPoint + '.inPositionZ', bbox[2]) Bcorner =cmds.getAttr(closestPoint + '.paramU') cmds.setAttr(closestPoint + '.inPositionX', bbox[3] + 5) cmds.setAttr(closestPoint + '.inPositionY', bbox[1] - 5) cmds.setAttr(closestPoint + '.inPositionZ', bbox[2]) Ccorner =cmds.getAttr(closestPoint + '.paramU') cmds.select('%s.ep[%s]'%(shell, str(int(Acorner))), replace = True) cmds.select('%s.ep[%s]'%(shell, str(int(Bcorner))), add = True) cmds.select('%s.ep[%s]'%(shell, str(int(Ccorner))), add = True) #detach curve curvePoints = [ '%s.ep[%s]'%(shell, '0'), '%s.ep[%s]'%(shell, str(int(Acorner))),'%s.ep[%s]'%(shell, str(int(Bcorner))),'%s.ep[%s]'%(shell, str(int(Ccorner))), '%s.ep[%s]'%(shell, '99999999')] patternCurves = cmds.detachCurve(curvePoints, rpo = True, n = 'cuttedCurve', ch = True) print patternCurves print [patternCurves[0], patternCurves[2], shell, patternCurves[2]] #create group grpBaseEx = cmds.ls('BIRAILS_GRP') if len(grpBaseEx)==0 : cmds.group(em=True, w=True, n='BIRAILS_GRP') firstCrvsGrp = cmds.group([patternCurves[0], patternCurves[1], patternCurves[2], patternCurves[3]], n=('birail'+str(indexCurve)+'_GRP'), p='BIRAILS_GRP') firstCrvs = cmds.listRelatives(firstCrvsGrp) #highlight group if doesn't contain 4 curves, or contains a curve with 0 span if len(firstCrvs)!=4 : cmds.setAttr(firstCrvsGrp+'.overrideEnabled', 1) cmds.setAttr(firstCrvsGrp+'.overrideColor', 13) for firstCrv in firstCrvs : firstCrvSpans = cmds.getAttr(firstCrv+'.spans') if firstCrvSpans==0 : cmds.setAttr(firstCrvsGrp+'.overrideEnabled', 1) cmds.setAttr(firstCrvsGrp+'.overrideColor', 13) #delete unused elements cmds.delete(closestPoint) cmds.delete(shell) if len(patternCurves)>4 : if patternCurves[4]!=shell : cmds.delete(patternCurves[4])
def create(piv=[0,0,0],axis=[0,0,-1],rad=1,dilate_ctrl='',prefix='eyeball'): #------------------------ # Generate Profile Curve # sphere eye_sphere = mc.sphere(p=piv,ax=axis,r=rad,n=prefix+'_history') # curve from sphere eye_crv = mc.duplicateCurve(eye_sphere[0]+'.v[0]') eye_crv[0] = mc.rename(eye_crv[0],prefix+'_pfl01_crv') # rebuild curve 0-1 mc.rebuildCurve(eye_crv[0],rpo=1,end=1,kcp=1,kr=0,d=3,tol=0.01) #------------------------ # Extract Curve Segments # detach curve eye_crv_detach = mc.detachCurve(eye_crv[0]+'.u[0.125]',eye_crv[0]+'.u[0.25]',rpo=0,ch=1) eye_crv_detach[0] = mc.rename(eye_crv_detach[0],prefix+'_pl01_crv') eye_crv_detach[1] = mc.rename(eye_crv_detach[1],prefix+'_ir01_crv') eye_crv_detach[2] = mc.rename(eye_crv_detach[2],prefix+'_sc01_crv') eye_crv_detach[3] = mc.rename(eye_crv_detach[3],prefix+'_cr01_dtc') # rebuild curve segments pupil_rebuild = mc.rebuildCurve(eye_crv_detach[0],rpo=1,end=1,kep=1,kt=1,kr=0,s=2,d=3,tol=0.01) iris_rebuild = mc.rebuildCurve(eye_crv_detach[1],rpo=1,end=1,kep=1,kt=1,kr=0,s=2,d=3,tol=0.01) sclera_rebuild = mc.rebuildCurve(eye_crv_detach[2],rpo=1,end=1,kep=1,kt=1,kr=0,s=4,d=3,tol=0.01) pupil_rebuild[1] = mc.rename(pupil_rebuild[1],prefix+'_pl01_rbc') iris_rebuild[1] = mc.rename(iris_rebuild[1],prefix+'_ir01_rbc') sclera_rebuild[1] = mc.rename(sclera_rebuild[1],prefix+'_sc01_rbc') #------------------------ # Generate Eye Surfaces # revolve pupil_revolve = mc.revolve(eye_crv_detach[0],po=0,rn=0,ut=0,tol=0.01,degree=3,s=8,ulp=1,ax=[0,0,1]) iris_revolve = mc.revolve(eye_crv_detach[1],po=0,rn=0,ut=0,tol=0.01,degree=3,s=8,ulp=1,ax=[0,0,1]) sclera_revolve = mc.revolve(eye_crv_detach[2],po=0,rn=0,ut=0,tol=0.01,degree=3,s=8,ulp=1,ax=[0,0,1]) # rename surfaces pupil_revolve[0] = mc.rename(pupil_revolve[0],prefix+'_pl01_srf') pupil_revolve[1] = mc.rename(pupil_revolve[1],prefix+'_pl01_rvl') iris_revolve[0] = mc.rename(iris_revolve[0],prefix+'_ir01_srf') iris_revolve[1] = mc.rename(iris_revolve[1],prefix+'_ir01_rvl') sclera_revolve[0] = mc.rename(sclera_revolve[0],prefix+'_sc01_srf') sclera_revolve[1] = mc.rename(sclera_revolve[1],prefix+'_sc01_rvl') # Connect Revolve Pivot mc.connectAttr(eye_sphere[0]+'.t',pupil_revolve[1]+'.pivot',f=1) mc.connectAttr(eye_sphere[0]+'.t',iris_revolve[1]+'.pivot',f=1) mc.connectAttr(eye_sphere[0]+'.t',sclera_revolve[1]+'.pivot',f=1) #------------------------ # Connect Dilate Control if len(dilate_ctrl): # Verify Control if not mc.objExists(dilate_ctrl): raise UserInputError('Object ' + dilate_ctrl + ' does not exist!') # Check Attributes Exist if not mc.objExists(dilate_ctrl+'.iris'): mc.addAttr(dilate_ctrl,ln='iris',min=0,max=4,dv=1) mc.setAttr(dilate_ctrl+'.iris',k=1) if not mc.objExists(dilate_ctrl+'.pupil'): mc.addAttr(dilate_ctrl,ln='pupil',min=0,max=1,dv=0.5) mc.setAttr(dilate_ctrl+'.pupil',k=1) # Connect Attributes iris_md = mc.createNode('multDoubleLinear',n=prefix+'_irs01_mdl') pupil_md = mc.createNode('multDoubleLinear',n=prefix+'_ppl01_mdl') mc.connectAttr(dilate_ctrl+'.iris',iris_md+'.input1') mc.setAttr(iris_md+'.input2',0.25) mc.connectAttr(iris_md+'.output',eye_crv_detach[3]+'.parameter[1]') mc.connectAttr(dilate_ctrl+'.pupil',pupil_md+'.input1') mc.connectAttr(iris_md+'.output',pupil_md+'.input2') mc.connectAttr(pupil_md+'.output',eye_crv_detach[3]+'.parameter[0]')
def cutCurve(curve, mesh, loopCheck=False): fnMesh = getMFnMesh(mesh) fnCurve = getMFnCurve(curve) meshIntersector = om.MMeshIntersector() meshIntersector.create(fnMesh.object()) meshMtx = fnMesh.dagPath().inclusiveMatrix() curveMtx = fnCurve.dagPath().inclusiveMatrix() toMeshLocalMtx = curveMtx * meshMtx.inverse() numSpans = fnCurve.numSpans() maxParam = fnCurve.findParamFromLength(fnCurve.length()) paramRate = maxParam / (numSpans - 1) point = om.MPoint() pointOnMesh = om.MPointOnMesh() closestParam = 0.0 for i in range(numSpans): fnCurve.getPointAtParam(paramRate * i, point) toMeshPoint = point * toMeshLocalMtx meshIntersector.getClosestPoint(toMeshPoint, pointOnMesh) closePoint = om.MPoint(pointOnMesh.getPoint()) normal = om.MVector(pointOnMesh.getNormal()) closePivVector = om.MVector(toMeshPoint) - om.MVector(closePoint) if closePivVector * normal < 0: closestParam = paramRate * i else: if i == 0: if loopCheck: return None cmds.reverseCurve(curve, ch=0, rpo=1) cutCurve(curve, mesh, True) i = 0 addParam = 1 while i < 100: fnCurve.getPointAtParam(closestParam, point) toMeshPoint = point * toMeshLocalMtx meshIntersector.getClosestPoint(toMeshPoint, pointOnMesh) closePoint = om.MPoint(pointOnMesh.getPoint()) cuDist = closePoint.distanceTo(toMeshPoint) if cuDist < 0.0001: break normal = om.MVector(pointOnMesh.getNormal()) closePivVector = om.MVector(toMeshPoint) - om.MVector(closePoint) if closePivVector * normal > 0: addParam = math.fabs(addParam) * -0.5 else: addParam = math.fabs(addParam) * 0.5 closestParam += addParam i += 1 fnCurve.getPointAtParam(closestParam, point) first, second = cmds.detachCurve("%s.u[%f]" % (curve, closestParam), ch=0, cos=True, rpo=0) curveObj = cmds.listRelatives(curve, p=1)[0] cmds.delete(first, curveObj) second = cmds.rename(second, curveObj) cmds.select(second) cmds.DeleteHistory()
#Start with template curve leftStrand = cmds.curve(p=[(-1,0,-0.125),(-0.9375,-0.0875,-0.1875),(-0.84375,-0.06375,-0.26),(-0.7578125,-0.0053125,-0.275),(-0.6875,0.0425,-0.26),(-0.625,0.06375,-0.234375),(-0.5625,0.0425,-0.1875),(-0.5,0,-0.125),(-0.4375,-0.0875221,-0.0625),(-0.375,-0.06375,-0.015625),(-0.3125,-0.0425,0),(-0.2421875,0.0053125,0),(-0.15625,0.06375,0),(-0.0625,0.0425,-0.0625),(0,0,-0.125),(0.0625,-0.08752214296547417,-0.1875),(0.15625,-0.06375,-0.26),(0.2421875,-0.0053125,-0.275),(0.3125,0.0425,-0.26),(0.375,0.06375,-0.234375),(0.4375,0.0425,-0.1875),(0.5,0,-0.125),(0.5625,-0.0875221,-0.0625),(0.625,-0.06375,-0.015625),(0.6875,-0.0425,0),(0.7578125,0.0053125,0),(0.84375,0.06375,0),(0.9375,0.0425,-0.0625),(1,0,-0.125)], k=[0,0,0,0.5,1,1.5,2,2.5,3,3.5,4,4.5,5,5.5,6,6,6,6.5,7,7.5,8,8.5,9,9.5,10,10.5,11,11.5,12,12,12], name='leftStrand') lsTemplate = cmds.duplicate('leftStrand', name='lsTemplate') #Append length if necessary cutbottom = 12 #Curve point at which to detach curve for i in xrange(0, append): toAppend = cmds.duplicate('lsTemplate', name='leftStrand2') cmds.move(2*(i+1),0,0,'leftStrand2', relative=True) cmds.attachCurve('leftStrand', 'leftStrand2') cmds.delete('leftStrand2') cutbottom = 12*(i+2) - 6*(i+1) #Cut bottom of curve cmds.detachCurve('leftStrand.u['+str(cutbottom)+']', k=(1,0), replaceOriginal=True) cmds.delete('leftStranddetachedCurve2') #Position strand upright, set color to red cmds.rotate(0, 0, -90, leftStrand) cmds.move(-0.0072805614748225056, 0.62530322953737649, 0.12630761389650735, leftStrand, relative=True) cmds.setAttr(leftStrand+'.overrideEnabled', 1) cmds.setAttr(leftStrand+'.overrideColor', 4) #Duplicate curves concentrically around template r = radius while r > 0: theta = 0 while theta <= 360: copyLS = cmds.duplicate('leftStrand', name=leftStrand+'_copy#') copyName = 'leftStrand_copy'+str(counter1)
def create(piv=[0, 0, 0], axis=[0, 0, -1], rad=1, dilate_ctrl='', prefix='eyeball'): # ------------------------ # Generate Profile Curve # sphere eye_sphere = cmds.sphere(p=piv, ax=axis, r=rad, n=prefix + '_history') # curve from sphere eye_crv = cmds.duplicateCurve(eye_sphere[0] + '.v[0]') eye_crv[0] = cmds.rename(eye_crv[0], prefix + '_pfl01_crv') # rebuild curve 0-1 cmds.rebuildCurve(eye_crv[0], rpo=1, end=1, kcp=1, kr=0, d=3, tol=0.01) # ------------------------ # Extract Curve Segments # detach curve eye_crv_detach = cmds.detachCurve(eye_crv[0] + '.u[0.125]', eye_crv[0] + '.u[0.25]', rpo=0, ch=1) eye_crv_detach[0] = cmds.rename(eye_crv_detach[0], prefix + '_pl01_crv') eye_crv_detach[1] = cmds.rename(eye_crv_detach[1], prefix + '_ir01_crv') eye_crv_detach[2] = cmds.rename(eye_crv_detach[2], prefix + '_sc01_crv') eye_crv_detach[3] = cmds.rename(eye_crv_detach[3], prefix + '_cr01_dtc') # rebuild curve segments pupil_rebuild = cmds.rebuildCurve(eye_crv_detach[0], rpo=1, end=1, kep=1, kt=1, kr=0, s=2, d=3, tol=0.01) iris_rebuild = cmds.rebuildCurve(eye_crv_detach[1], rpo=1, end=1, kep=1, kt=1, kr=0, s=2, d=3, tol=0.01) sclera_rebuild = cmds.rebuildCurve(eye_crv_detach[2], rpo=1, end=1, kep=1, kt=1, kr=0, s=4, d=3, tol=0.01) pupil_rebuild[1] = cmds.rename(pupil_rebuild[1], prefix + '_pl01_rbc') iris_rebuild[1] = cmds.rename(iris_rebuild[1], prefix + '_ir01_rbc') sclera_rebuild[1] = cmds.rename(sclera_rebuild[1], prefix + '_sc01_rbc') # ------------------------ # Generate Eye Surfaces # revolve pupil_revolve = cmds.revolve(eye_crv_detach[0], po=0, rn=0, ut=0, tol=0.01, degree=3, s=8, ulp=1, ax=[0, 0, 1]) iris_revolve = cmds.revolve(eye_crv_detach[1], po=0, rn=0, ut=0, tol=0.01, degree=3, s=8, ulp=1, ax=[0, 0, 1]) sclera_revolve = cmds.revolve(eye_crv_detach[2], po=0, rn=0, ut=0, tol=0.01, degree=3, s=8, ulp=1, ax=[0, 0, 1]) # rename surfaces pupil_revolve[0] = cmds.rename(pupil_revolve[0], prefix + '_pl01_srf') pupil_revolve[1] = cmds.rename(pupil_revolve[1], prefix + '_pl01_rvl') iris_revolve[0] = cmds.rename(iris_revolve[0], prefix + '_ir01_srf') iris_revolve[1] = cmds.rename(iris_revolve[1], prefix + '_ir01_rvl') sclera_revolve[0] = cmds.rename(sclera_revolve[0], prefix + '_sc01_srf') sclera_revolve[1] = cmds.rename(sclera_revolve[1], prefix + '_sc01_rvl') # Connect Revolve Pivot cmds.connectAttr(eye_sphere[0] + '.t', pupil_revolve[1] + '.pivot', f=1) cmds.connectAttr(eye_sphere[0] + '.t', iris_revolve[1] + '.pivot', f=1) cmds.connectAttr(eye_sphere[0] + '.t', sclera_revolve[1] + '.pivot', f=1) # ------------------------ # Connect Dilate Control if len(dilate_ctrl): # Verify Control if not cmds.objExists(dilate_ctrl): raise UserInputError('Object ' + dilate_ctrl + ' does not exist!') # Check Attributes Exist if not cmds.objExists(dilate_ctrl + '.iris'): cmds.addAttr(dilate_ctrl, ln='iris', min=0, max=4, dv=1) cmds.setAttr(dilate_ctrl + '.iris', k=1) if not cmds.objExists(dilate_ctrl + '.pupil'): cmds.addAttr(dilate_ctrl, ln='pupil', min=0, max=1, dv=0.5) cmds.setAttr(dilate_ctrl + '.pupil', k=1) # Connect Attributes iris_md = cmds.createNode('multDoubleLinear', n=prefix + '_irs01_mdl') pupil_md = cmds.createNode('multDoubleLinear', n=prefix + '_ppl01_mdl') cmds.connectAttr(dilate_ctrl + '.iris', iris_md + '.input1') cmds.setAttr(iris_md + '.input2', 0.25) cmds.connectAttr(iris_md + '.output', eye_crv_detach[3] + '.parameter[1]') cmds.connectAttr(dilate_ctrl + '.pupil', pupil_md + '.input1') cmds.connectAttr(iris_md + '.output', pupil_md + '.input2') cmds.connectAttr(pupil_md + '.output', eye_crv_detach[3] + '.parameter[0]')
def cutCurve( curve, mesh, loopCheck = False ): fnMesh = getMFnMesh( mesh ) fnCurve = getMFnCurve( curve ) meshIntersector = om.MMeshIntersector() meshIntersector.create( fnMesh.object() ) meshMtx = fnMesh.dagPath().inclusiveMatrix() curveMtx = fnCurve.dagPath().inclusiveMatrix() toMeshLocalMtx = curveMtx*meshMtx.inverse() numSpans = fnCurve.numSpans() maxParam = fnCurve.findParamFromLength( fnCurve.length() ) paramRate = maxParam / ( numSpans-1 ) point = om.MPoint() pointOnMesh = om.MPointOnMesh() closestParam = 0.0 for i in range( numSpans ): fnCurve.getPointAtParam( paramRate*i, point ) toMeshPoint = point*toMeshLocalMtx meshIntersector.getClosestPoint( toMeshPoint, pointOnMesh ) closePoint = om.MPoint( pointOnMesh.getPoint() ) normal = om.MVector( pointOnMesh.getNormal() ) closePivVector = om.MVector( toMeshPoint )-om.MVector( closePoint ) if closePivVector*normal < 0: closestParam = paramRate*i else: if i == 0: if loopCheck: return None cmds.reverseCurve( curve, ch=0, rpo=1 ) cutCurve( curve, mesh, True ) i = 0 addParam = 1 while i < 100: fnCurve.getPointAtParam( closestParam, point ) toMeshPoint = point*toMeshLocalMtx meshIntersector.getClosestPoint( toMeshPoint, pointOnMesh ) closePoint = om.MPoint( pointOnMesh.getPoint() ) cuDist = closePoint.distanceTo( toMeshPoint ) if cuDist < 0.0001: break normal = om.MVector( pointOnMesh.getNormal() ) closePivVector = om.MVector( toMeshPoint ) - om.MVector( closePoint ) if closePivVector*normal > 0: addParam = math.fabs( addParam ) * -0.5 else: addParam = math.fabs( addParam ) * 0.5 closestParam += addParam i+=1 fnCurve.getPointAtParam( closestParam, point ) first, second = cmds.detachCurve( "%s.u[%f]" %( curve, closestParam ), ch=0, cos=True, rpo=0 ) curveObj = cmds.listRelatives( curve, p=1 )[0] cmds.delete( first, curveObj ) second = cmds.rename( second, curveObj ) cmds.select( second ) cmds.DeleteHistory()