----------------------------------------------------------------------

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



,Maya安装,Maya技巧