---------------------------------------------------------------------- import maya.cmds as cmd import maya.mel as mel import math import random def 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]*num maxnum=clampNum[1]*num centobj=[] newobj=[] attoffset=1 disoffset=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 -= disoffset return [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]*num maxnum=clampNum[1]*num centobj=[] newobj=[] attoffset=1 disoffset=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=0 childobj=[] 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+=offsetdegree setRot(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 -= disoffset return [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=0 clamp=[0,1] randdegree=0 randoffset=0 cube=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,startdegree,clamp,randdegree,randoffset,attoffset]) ###[num,degree,offset,startdegree,clamp,randdegree,randoffset] cmd.select(tempobject[1]) cmd.parent(w=True) cmd.delete(tempobject[0]) startdegree+=offsetdegree poslist=[] 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 |
|
来自: 浅c8onyxntue39 > 《教程》