----------------------------------------------------------------------
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