import maya.cmds as cmdimport maya.mel as melimport mathimport randomdef cm(fun): ret=mel.eval_r(fun) return ret def setRot(obj,nt,pos):temploc = cmd.spaceLocator(p=(nt[0],nt[1],nt[2]))[0]locgroup = cmd.group()cmd.select(locgroup)cm("move 0 0 0 "+temploc+".scalePivot "+temploc+".rotatePivot")cm("move -rpr "+str(pos[0])+" "+str(pos[1])+" "+str(pos[2]))cmd.select(temploc,obj)aimcon = cmd.aimConstraint(aim=[0,1,0])[0]cmd.delete(aimcon,locgroup)cmd.select(cl=True)def surroundfloowCurveCreateObject(object,curveobject,parameterList): ##环绕曲线创建物体num=parameterList[0] 控制最终环绕曲线的精度
uvdis=round(1.0/(num-1),5) degree=parameterList[1] #每个点之间绕中心旋转相差的角度offset=parameterList[2] #环绕曲线离主曲线的距离startdegree=parameterList[3] 起始旋转时候角度的初始值clampNum=parameterList[4] 沿曲线生长的时候 曲线v方向上的 范围 randdegree=parameterList[5] 该参数0-1之间控制 角度随机范围 例如 如果 该数值为0.5 degree为30 则随机后的 范围在15-45之间变化 randoffset=parameterList[6] 该参数作用同上 attoffsetCon=parameterList[7]minnum=clampNum[0]*nummaxnum=clampNum[1]*numcentobj=[]newobj=[]attoffset=1disoffset=float(1.0/num)for i in range(num):pos=cmd.pointOnCurve(curveobject,pr=i*uvdis)nt=cmd.pointOnCurve(curveobject,pr=i*uvdis,nt=True)obj=cmd.duplicate(object)[0]cmd.select(obj)cm("move -rpr "+str(pos[0])+" "+str(pos[1])+" "+str(pos[2]))cm('makeIdentity -apply true -t 1 -r 1 -s 1 -n 0;')cmd.select(cl=True)if i > minnum and i < maxnum:childobj = cmd.duplicate(obj)[0]cmd.setAttr(childobj+".tz",(offset * randoffset *(random.random()-0.5) + offset)*attoffset)cmd.setAttr(childobj+".sx",0.5)cmd.setAttr(childobj+".sy",0.5)cmd.setAttr(childobj+".sz",0.5)cmd.parent(childobj,obj)cmd.move(pos[0],pos[1],pos[2],childobj+".scalePivot",childobj+".rotatePivot")cmd.rotate(0,i*(degree * randdegree *(random.random()-0.5) + degree)+startdegree,0,r=True,os=True)newobj.append(childobj)setRot(obj,nt,pos)centobj.append(obj)if attoffsetCon == True:attoffset -= disoffsetreturn [centobj,newobj] def fixSurroundfloowCurveCreateObject(count,object,curveobject,parameterList): ##环绕曲线创建物体num=parameterList[0] 控制最终环绕曲线的精度
uvdis=round(1.0/(num-1),5) degree=parameterList[1] #每个点之间绕中心旋转相差的角度offset=parameterList[2] #环绕曲线离主曲线的距离startdegree=parameterList[3] 起始旋转时候角度的初始值clampNum=parameterList[4] 沿曲线生长的时候 曲线v方向上的 范围offsetdegree=parameterList[7] 多根曲线偏移 角度randdegree=parameterList[5] 该参数0-1之间控制 角度随机范围 例如 如果 该数值为0.5 degree为30 则随机后的 范围在 15-45 之间变化 randoffset=parameterList[6] 该参数作用同上 attoffsetCon=parameterList[8] minnum=clampNum[0]*nummaxnum=clampNum[1]*numcentobj=[]newobj=[]attoffset=1disoffset=float(1.0/num)for i in range(num):pos=cmd.pointOnCurve(curveobject,pr=i*uvdis)nt=cmd.pointOnCurve(curveobject,pr=i*uvdis,nt=True)obj=cmd.duplicate(object)[0]cmd.select(obj)cm("move -rpr "+str(pos[0])+" "+str(pos[1])+" "+str(pos[2]))cm('makeIdentity -apply true -t 1 -r 1 -s 1 -n 0;')cmd.select(cl=True)if i > minnum and i < maxnum:tempdegree=0childobj=[]for c in range(count):childobj.append(cmd.duplicate(obj)[0])for ch in childobj:cmd.setAttr(ch+".tz",(offset * randoffset *(random.random()-0.5) + offset))cmd.parent(ch,obj)cmd.move(pos[0],pos[1],pos[2],ch+".scalePivot",ch+".rotatePivot")cmd.rotate(0,i*(degree * randdegree *(random.random()-0.5) + degree)+startdegree+tempdegree,0,r=True,os=True)fullchildobj=cmd.ls(sl=True,l=True)[0]newobj.append(fullchildobj)tempdegree+=offsetdegreesetRot(obj,nt,pos)centobj.append(obj)cmd.setAttr(obj+".sx",attoffset)cmd.setAttr(obj+".sy",attoffset) cmd.setAttr(obj+".sz",attoffset)if attoffsetCon == True:attoffset -= disoffsetreturn [centobj,newobj]def checkSelect():sel = cmd.ls(sl=True,l=True)if len(sel) != 1:cmd.error("Please select One Curve!!")else:if cmd.objectType(cmd.listRelatives(sel[0],shapes=True)[0]) != "nurbsCurve":cmd.error("Please select One Curve!!!!")else:cube=cmd.polyCube()[0]cmd.select(cube,sel[0])return cube def createSurroundObjcetOnCurve(spancurvecount,spandeg,spanradius,precision,offsetdegree,attoffset):'''spancurvecount=3 ##控制生成多少根环绕的曲线spandeg= 1 #控制环绕的密度spanradius=1 #控制环绕的半径precision=3 控制生成弧形曲线的精度offsetdegree=120 控制多根曲线旋转偏移量'''fixoffsetdegree=True ##如果需要做旋转类设定 该属性可以打开 需要继续补代码##attoffset=True ##是否需要顶部边尖 True的时候开启顶部变尖状态degree=360 / ( precision*10 / spandeg )startdegree=0clamp=[0,1]randdegree=0randoffset=0cube=checkSelect()if fixoffsetdegree == True:tempobject = fixSurroundfloowCurveCreateObject(spancurvecount,sel[0],sel[1],[precision*10,degree,spanradius,startdegree,clamp,randdegree,randoffset,offsetdegree,attoffset]) [num,degree,offset,startdegree,clamp,randdegree,randoffset]else:for n in range(spancurvecount):tempobject = surroundfloowCurveCreateObject(sel[0],sel[1],[precision*10,degree,spanradius,startdegr
ee,clamp,randdegree,randoffset,attoffset]) [num,degree,offset,startdegree,clamp,randdegree,randoffset]cmd.select(tempobject[1])cmd.parent(w=True)cmd.delete(tempobject[0])startdegree+=offsetdegreeposlist=[]for p in tempobject[1]:cmd.select(p)cmd.CenterPivot()spherenode=cmd.sphere()constraintnode=cmd.pointConstraint(p,spherenode[0],mo=False)poslist.append(cmd.xform(spherenode[0],q=True,t=True,ws=True))cmd.delete(spherenode,constraintnode)cmd.curve(p=poslist)cmd.delete(tempobject[1])cmd.delete(cube)(来源:tiancgVFX) 本文为作者分享,翼虎网鼓励从业者分享原创内容,翼虎网不会对原创文章作任何内容编辑修改!如作者有特别标注,请按作者说明转载,如无说明,则转载此文章须经得作者同意,并请附上出处(翼虎网)及本页链接。原文链接:http://blog.sina.com.cn/tiancgweb
|