Internet - Generative 3D with Maya and Python
2 Oct, 2011
MDDN311 Project 2: Genesis
For this project you will create a form using generative techniques in Maya with Python scripts.
Results
Development images
My initial idea was to have one cable coming out of a sphere of cables with jacks pointing out, evenly distributed across the surface:
At some point, I changed direction and decided to render wireless/radio waves with the network cables I was already generating:
Finally, I removed one end of the cable and used my existing code to generate smaller cables coming from the end of each main cable:
The python script
The following Python script was written for Autodesk Maya 2011 to generate scenes like the ones at the top of this page. It requires the file JACK_FINAL.ma which contains the RJ45 plug model and materials that the script instances.
# "Internet" v5 by Stephen Holdaway # Source models required: (RJ45 Jack w/ locator - JACK_FINAL.ma) import maya.cmds as cmds import math import random cableObject = "JACK_FINAL:cable_" sourceObject = "JACK_FINAL:RJ45_Locator" recursed = False id = 0 def vAdd(l1,l2): o = [] for i in range(3): o.append(l1[i] + l2[i]) return o def vSub(l1,l2): o = [] for i in range(3): o.append(l1[i] - l2[i]) return o def vDiv(l1,v = 0.0): o = [] for i in range(3): o.append(l1[i] / float(v)) return o def vMult(l1,v): o = [] for i in range(3): o.append(l1[i] * v) return o def vGen(mult=1, XZ = False): o = [] for i in range(3): o.append((random.random()-0.5)*mult) if(XZ): o[1] = 0; return o def drawCable(start, end, objects, radius, child): # Draw Cable: create a curve with noise between two points and extrude a mesh using it # # start - start co-ords as [x,y,z] # end - co-ords as [x,y,z] # objects - list of object names as [start_object,end_object,cable_object] # radius - radius of area of work in # child - boolean: is this cable a child of another cv = cmds.curve( p=(start), d=3) if(child): points = random.randint(4,radius) amp = (random.random()*2) else: points = random.randint(4,radius*2) amp = (random.random()*3)+1 vec = vDiv(vSub(start,end),points) prevCV = start for i in range(points-1): p = vSub(start,vMult(vec,i+1)) p[1] += amp*math.sin(math.radians(i*(90*random.random()))); if(i==1): rx = math.atan2(p[2] - start[2], p[1] - start[1]) * (180/math.pi) cmds.setAttr(objects[0]+".rotateX", rx); prevCV = p; cmds.curve(cv, a=True, p=(p)) cmds.curve(cv, a=True, p=(end)) cmds.polyExtrudeEdge(objects[2]+".e[0:11]",kft=True, d=(points*10), inc=cv, sma=180, lrz=3600, ch=False) cmds.select(cv,r=True) cmds.delete() global recursed if(recursed == False): recursed = True; colours = ["JACK_FINAL:mia_material4SG1","JACK_FINAL:mia_material3SG1","JACK_FINAL:mia_material6SG1","JACK_FINAL:mia_material3SG1","JACK_FINAL:mia_material7SG1","JACK_FINAL:mia_material3SG1"] for i in range(8): rt = generateCables(1, radius, s = end) cmds.select(rt) cmds.sets(rt,fe=colours[random.randint(0,5)]) return objects[2] def generateCables(count, radius, s = 0, shift = 0): # Generate two points within a radius # # count - number of sets (wires) to generate # radius - radius of area of work in # s - start co-ords as [x,y,z]: when provided only one point is generated (relative to the given point) for i in range(count): points = [[],[]] objects = ['','',''] child = False for ii in range(2): if(ii == 0 and s == 0): cmds.select(sourceObject) objects[ii] = cmds.instance()[0] z = -radius + random.randint(round(-radius/4),round(radius/4)) else: objects[ii] = cmds.spaceLocator()[0] if(s == 0): z = -random.randint(round(-radius/4),round(radius/4)) else: z = (random.random() * radius)+1 r = 0 o = objects[ii] if(ii == 0): global id cmds.select(cableObject) cableStub = cmds.duplicate(n="Cable_"+str(id)+"_"+str(shift))[0]; id+=1; objects[2] = cableStub if(s != 0 ): cmds.scale(0.3,0.3,0.3,r=True) cmds.parent(cableStub,o) r = 180 x = shift/2.0 y = random.randint(round(-radius/2),round(radius/2)) if(ii==0 and s != 0): x = s[0] y = s[1] z = s[2] if(ii==1 and s != 0): x = s[0] + (random.random()-0.5)*2 z = s[2] + z child = True points[ii] = [x,y,z] cmds.setAttr(o+".translateX", x) cmds.setAttr(o+".translateY", y) cmds.setAttr(o+".translateZ", z) cmds.setAttr(o+".rotateY", r) return drawCable(points[0], points[1], objects, radius, child) for i in range(3): recursed = False generateCables(1,8,0,i);
This is a backdated post. The publish date reflects when the it would have been posted originally, however the actual publish date was later. This post was last modified 10 Oct, 2012.