123wys 发表于 2016-1-15 20:39:39

环绕曲线生成工具

Maya   Maya技巧   Maya安装

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,nt,nt))locgroup = cmd.group()cmd.select(locgroup)cm("move 0 0 0 "+temploc+".scalePivot "+temploc+".rotatePivot")cm("move -rpr "+str(pos)+" "+str(pos)+" "+str(pos))cmd.select(temploc,obj)aimcon = cmd.aimConstraint(aim=)cmd.delete(aimcon,locgroup)cmd.select(cl=True)def surroundfloowCurveCreateObject(object,curveobject,parameterList):#####环绕曲线创建物体num=parameterList       ###控制最终环绕曲线的精度
uvdis=round(1.0/(num-1),5)degree=parameterList    ####每个点之间绕中心旋转相差的角度offset=parameterList   ####环绕曲线离主曲线的距离startdegree=parameterList   ### 起始旋转时候角度的初始值clampNum=parameterList      ### 沿曲线生长的时候 曲线v方向上的 范围 randdegree=parameterList   ###该参数0-1之间控制 角度随机范围 例如 如果 该数值为0.5 degree为30 则随机后的 范围在15-45之间变化 randoffset=parameterList   ###该参数作用同上 attoffsetCon=parameterListminnum=clampNum*nummaxnum=clampNum*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)cmd.select(obj)cm("move -rpr "+str(pos)+" "+str(pos)+" "+str(pos))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)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,pos,pos,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 def fixSurroundfloowCurveCreateObject(count,object,curveobject,parameterList):#####环绕曲线创建物体num=parameterList       ###控制最终环绕曲线的精度
uvdis=round(1.0/(num-1),5)degree=parameterList    ####每个点之间绕中心旋转相差的角度offset=parameterList   ####环绕曲线离主曲线的距离startdegree=parameterList   ### 起始旋转时候角度的初始值clampNum=parameterList      ### 沿曲线生长的时候 曲线v方向上的 范围offsetdegree=parameterList###多根曲线偏移 角度randdegree=parameterList   ###该参数0-1之间控制 角度随机范围 例如 如果 该数值为0.5 degree为30 则随机后的 范围在 15-45 之间变化 randoffset=parameterList   ###该参数作用同上 attoffsetCon=parameterListminnum=clampNum*nummaxnum=clampNum*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)cmd.select(obj)cm("move -rpr "+str(pos)+" "+str(pos)+" "+str(pos))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))for ch in childobj:cmd.setAttr(ch+".tz",(offset * randoffset *(random.random()-0.5) + offset))cmd.parent(ch,obj)cmd.move(pos,pos,pos,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)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 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,shapes=True)) != "nurbsCurve":cmd.error("Please select One Curve!!!!")else:cube=cmd.polyCube()cmd.select(cube,sel)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=randdegree=0randoffset=0cube=checkSelect()if fixoffsetdegree == True:tempobject = fixSurroundfloowCurveCreateObject(spancurvecount,sel,sel,) ###else:for n in range(spancurvecount):tempobject = surroundfloowCurveCreateObject(sel,sel,[precision*10,degree,spanradius,startdegr
ee,clamp,randdegree,randoffset,attoffset]) ###cmd.select(tempobject)cmd.parent(w=True)cmd.delete(tempobject)startdegree+=offsetdegreeposlist=[]for p in tempobject:cmd.select(p)cmd.CenterPivot()spherenode=cmd.sphere()constraintnode=cmd.pointConstraint(p,spherenode,mo=False)poslist.append(cmd.xform(spherenode,q=True,t=True,ws=True))cmd.delete(spherenode,constraintnode)cmd.curve(p=poslist)cmd.delete(tempobject)cmd.delete(cube)(来源:tiancgVFX)本文为作者分享,翼虎网鼓励从业者分享原创内容,翼虎网不会对原创文章作任何内容编辑修改!如作者有特别标注,请按作者说明转载,如无说明,则转载此文章须经得作者同意,并请附上出处(翼虎网)及本页链接。原文链接:http://blog.sina.com.cn/tiancgweb





zxz2004 发表于 2016-1-15 20:39:39

支持共享,谢谢楼主分享

tiandaowuyu 发表于 2016-1-15 20:39:39

学习了,谢谢分享!
页: [1]
查看完整版本: 环绕曲线生成工具