<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-81833950942798134</id><updated>2012-02-17T02:38:55.202+01:00</updated><category term='Shi'/><category term='Andreea Nica'/><category term='Liu'/><category term='Alec'/><category term='A+M'/><category term='Alice'/><category term='Tudor'/><category term='Anastasia'/><category term='Liu and Shi'/><category term='Grisha'/><category term='Alexander'/><category term='assignments'/><category term='announcements'/><title type='text'>Generative Scripting II</title><subtitle type='html'>collection of class notes, resources and student work</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>danrocha</name><uri>http://www.blogger.com/profile/04468836977853242830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>76</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-8322799697333413522</id><published>2009-08-11T14:46:00.005+02:00</published><updated>2009-08-11T15:09:30.589+02:00</updated><title type='text'>columbarium_growth_by_grisha</title><content type='html'>this is my studio project "a multireligious columbarium"&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;embed src="http://static.issuu.com/webembed/viewers/style1/v1/IssuuViewer.swf" type="application/x-shockwave-flash" allowfullscreen="true" menu="false" quality="high" scale="noscale" salign="l" flashvars="mode=embed&amp;amp;layout=http%3A%2F%2Fskin.issuu.com%2Fv%2Fcolor%2Flayout.xml&amp;amp;backgroundColor=000000&amp;amp;showFlipBtn=true&amp;amp;documentId=090727125639-519d613aadeb46bc8adbee4c16aa8048&amp;amp;docName=a_murtireligious_columbarium&amp;amp;username=gkps&amp;amp;loadingInfoText=A_MURTIRELIGIOUS_COLUMBARIUM&amp;amp;et=1248704334190&amp;amp;er=58" style="width: 420px; height: 148px;" name="flashticker" align="middle"&gt;&lt;/embed&gt;&lt;div style="width: 420px; text-align: left;"&gt;&lt;a href="http://issuu.com/gkps/docs/a_murtireligious_columbarium?mode=embed&amp;amp;layout=http%3A%2F%2Fskin.issuu.com%2Fv%2Fcolor%2Flayout.xml&amp;amp;backgroundColor=000000&amp;amp;showFlipBtn=true" target="_blank"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a href="http://issuu.com/" target="_blank"&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="400" height="300"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=5784271&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1"&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=5784271&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;p&gt;and this is the script for it&lt;/p&gt;&lt;pre class="python" name="code"&gt;import maya.cmds as cmds&lt;br /&gt;import maya.cmds as cmds&lt;br /&gt;import maya.mel as mm&lt;br /&gt;import math&lt;br /&gt;import sys&lt;br /&gt;from random import*&lt;br /&gt;from setColor import*&lt;br /&gt;&lt;br /&gt;# increasing recursion limit to 8000 loops&lt;br /&gt;sys.setrecursionlimit(8000)&lt;br /&gt;&lt;br /&gt;#######################&lt;br /&gt;### HELPING SCRIPTS ###&lt;br /&gt;#######################&lt;br /&gt;&lt;br /&gt;# getting center of the Face&lt;br /&gt;def centerOfFace(facet):&lt;br /&gt;#find the vertices that define that face.&lt;br /&gt;vertex = cmds.polyListComponentConversion(facet, ff=1, tv=1)&lt;br /&gt;cmds.select(vertex, r=1)&lt;br /&gt;vertexFlat = cmds.ls(sl=1, fl=1)&lt;br /&gt;&lt;br /&gt;#find out how many vertices define that face&lt;br /&gt;vertCount = len(vertexFlat)&lt;br /&gt;#print vertexFlat&lt;br /&gt;&lt;br /&gt;#for each vertex go through and find it's world space position.&lt;br /&gt;vertPositionSumX = 0.&lt;br /&gt;vertPositionSumY = 0.&lt;br /&gt;vertPositionSumZ = 0.&lt;br /&gt;for a in range(0, vertCount, 1):&lt;br /&gt;coordinate = cmds.pointPosition(vertexFlat[a], w=1)&lt;br /&gt;vertPositionSumX += coordinate[0]&lt;br /&gt;vertPositionSumY += coordinate[1]&lt;br /&gt;vertPositionSumZ += coordinate[2]&lt;br /&gt;&lt;br /&gt;centroidX = vertPositionSumX/float(vertCount)&lt;br /&gt;centroidY = vertPositionSumY/float(vertCount)&lt;br /&gt;centroidZ = vertPositionSumZ/float(vertCount)&lt;br /&gt;&lt;br /&gt;return [centroidX, centroidY, centroidZ]&lt;br /&gt;&lt;br /&gt;# distance between two points&lt;br /&gt;def getDistance(start, end):&lt;br /&gt;#start and end must be lists xyz&lt;br /&gt;v = [start[0]-end[0], start[1]-end[1], start[2]-end[2]] #list format x,y,z&lt;br /&gt;vector = "&lt;&lt;" + str(v[0]) + "," + str(v[1]) + "," + str(v[2]) + "&gt;&gt;"&lt;br /&gt;mag = mm.eval("mag " + vector + ";")&lt;br /&gt;&lt;br /&gt;return mag&lt;br /&gt;&lt;br /&gt;# looking for closest locator through the list with locators to the LOCATOR&lt;br /&gt;def closestLocator (locator, netOfLocs):&lt;br /&gt;locatorPos = cmds.pointPosition(locator)&lt;br /&gt;distance = 1000000000&lt;br /&gt;closLocData = []&lt;br /&gt;closestLocator = ""&lt;br /&gt;for i in netOfLocs:&lt;br /&gt;locPos = cmds.pointPosition(i)&lt;br /&gt;currDist = getDistance(locatorPos, locPos)&lt;br /&gt;if currDist &lt; distance =" currDist" closlocator =" i" closlocpos =" locPos" closlocdist =" currDist" locatorpos =" Point" distance =" 1000000000" closlocdata =" []" closestlocator = "" locpos =" i[1]" currdist =" getDistance(locatorPos," distance =" currDist" closlocator =" i[0]" closlocpos =" locPos" closlocdist =" currDist" locatorpos =" Point" distance =" 1000000000" closlocdata =" []" closestlocator = "" locpos =" i" currdist =" getDistance(locatorPos," distance =" currDist" closlocator =" i[0]" closlocpos =" locPos" closlocdist =" currDist" locatorpos =" Point" distance =" 1000000000" closlocdata =" []" closestlocator = "" locpos =" i[2]" currdist =" getDistance(locatorPos," distance =" currDist" closlocator =" i[0]" grow =" i[1]" closlocpos =" locPos" closlocdist =" currDist" locatorpos =" Point" distance =" 1000000000" closlocdata =" []" closestlocator = "" locpos =" i[1]" currdist =" getDistance(locatorPos," distance =" currDist" closlocator =" i[0]" closlocpos =" locPos" closlocdist =" currDist" locatorpos =" center" distance =" 1000000000" closlocdata =" []" closestlocator = "" locpos =" i" currdist =" getDistance(locatorPos," distance =" currDist" closlocator =" i" closlocpos =" i" closlocdist =" currDist" x="0" y="0" z="0" n="0" ptpos =" cmds.pointPosition(i)" x="x+ptPos[0]" y="y+ptPos[1]" z="z+ptPos[2]" n="n+1" ptpos =" cmds.pointPosition(i)" x="x+ptPos[0]" y="y+ptPos[1]" z="z+ptPos[2]" n="n+1" midx =" x/n" midy =" y/n" midz =" z/n" midpt="[]" x="0" y="0" z="0" n="0" ptpos =" cmds.pointPosition(listLoc1[i])" x="x+ptPos[0]" y="y+ptPos[1]" z="z+ptPos[2]" n="n+1" ptpos =" listPt2" x="x+(ptPos[0]*len(listLoc1))" y="y+(ptPos[1]*len(listLoc1))" z="z+(ptPos[2]*len(listLoc1))" n="n+len(listLoc1)" midx =" x/n" midy =" y/n" midz =" z/n" midpt="[]" dire =" [" center =" center" loc2 =" loc2[0]" loc3 =" loc3[0]" loc4 =" loc4[0]" clpt1 =" closestPointToPoints" clpt2 =" closestPointToPoints" clpt1 =" clPt1[0]" clpt2 =" clPt2[0]" centerclosrelig =" centerClosRelig[0]" x =" (3*loc2[0]" y =" (3*loc2[1]" point =" [x,y,0]" x =" center[0]" y =" center[1]" new =" [x,y,0]" va =" (locPos[0]" vb =" (0,1,0)" angle =" cmds.angleBetween(v1=" v2="vb)" angle =" angle[3]" graves =" []" mitrary =" []" buddhism =" []" catholic=" []" orthodox =" []" hindu =" []" judaism =" []" protest =" []" islam =" []" allrelig =" []" otherr =" []" amitrary =" []" abuddhism =" []" acatholic=" []" aorthodox =" []" ahindu =" []" ajudaism =" []" aprotest =" []" aislam =" []" aallrelig =" []" ceremony =" []" entrance =" []" otherw =" []" otherm =" []" allrepuls =" []" trees =" []" treessrf=" []" cubes =" []" ff =" []" mitrary =" ff" ff =" []" buddhism =" ff" ff =" []" catholic =" ff" ff =" []" orthodox =" ff" ff =" []" hindu =" ff" ff =" []" judaism =" ff" ff =" []" protest =" ff" ff =" []" islam =" ff" ff =" []" amitrary =" ff" ff =" []" abuddhism =" ff" ff =" []" acatholic =" ff" ff =" []" aorthodox =" ff" ff =" []" ahindu =" ff" ff =" []" ajudaism =" ff" ff =" []" aprotest =" ff" ff =" []" aislam =" ff" otherrr =" []" otherr =" otherRR" allrelig =" self.mitrary" mmm="[]" mmmm="[]" ceremony =" mmm" entrance =" mmmm" otherw =" [centerOfFace('polySurface7766.f[0]'),centerOfFace('polySurface7770.f[0]'),centerOfFace('polySurface7767.f[0]'),centerOfFace('polySurface7769.f[0]'),centerOfFace('polySurface7771.f[0]')]" otherm =" [centerOfFace('polySurface7762.f[0]'),centerOfFace('polySurface7763.f[0]'),centerOfFace('polySurface7764.f[0]'),centerOfFace('polySurface7765.f[0]')]" allrepuls =" self.entrance" mm=" []" mmm =" []" m =" 'polySurface%d.f[0]'" n =" 'polySurface%d'" treessrf =" mmm" trees =" mm" r="True)" faces =" cmds.filterExpand(sm=" faces =" []" all="True)" cface =" centerOfFace(i)" loc =" cmds.spaceLocator(" p="(Cface[0],Cface[1],Cface[2])" graves =" FACES" all =" True)" locs =" cmds.filterExpand(sm=" pp =" []" loc =" i" lpos =" cmds.pointPosition(i)" oo =" []" graves =" PP" cubes =" []" position =" cmds.pointPosition(i)" cube =" cmds.polyCube" w ="size" h="size" d="size" repsize="10," pointsamount =" 4," n="0):" repulsivelocs =" self.allRepuls" locs =" self.graves" l="(repSize/5)*(i+1)" kpos =" k" closloc =" closestLocatorToPoint(Kpos," locpos =" closLoc[1]" clloc =" closLoc[0]" direc =" direction(LOCpos," newx =" ((direc[0]*6)/((i+1)*(i+1)))" newy =" ((direc[1]*6)/((i+1)*(i+1)))" newz =" ((direc[2]*6)/((i+1)*(i+1)))" cll =" [clLoc,LOCpos]" n="0," mn="0," bn="0," cn="0," on="0," hn="0," jn="0," pn="0," in="0," cubes =" []," max =" 150.0," cofcenmove="10" m =" [1]" b =" [2]" c =" [3]" o =" [4]" h =" [5]" j =" [6]" p =" [7]" i =" [8]" way ="=" way ="=" xxx =" randint" way ="=" xxx =" randint" n ="=" n ="=" n ="=" n="=" allrelig =" [M]+[B]+[C]+[O]+[H]+[J]+[P]+[I]" n="N+1" trees =" self.trees" closreligion =" closestPointToPoints1"&gt;= closReligion[1]:&lt;br /&gt; M.append (midPtWater (self.otherW, self.otherM, M[2], self.ceremony, self.entrance, self.Amitrary, closReligion[2])) # midPt [3]&lt;br /&gt;else:&lt;br /&gt; closPT = closReligion[2]&lt;br /&gt; g = M[2]&lt;br /&gt; xx = g[0] - (closPT[0] - g[0])&lt;br /&gt; yy = g[1] - (closPT[1] - g[1])&lt;br /&gt; ptt = [xx, yy, 0]&lt;br /&gt; M.append (midPtWater (self.otherW, self.otherM, M[2], self.ceremony, self.entrance, self.Amitrary, ptt)) # midPt [3]&lt;br /&gt;#setting the center of growing&lt;br /&gt;newCen = newCenter (M[2], M[3], cofCenMove)&lt;br /&gt;M[2] = newCen&lt;br /&gt;prevousPt = newCen&lt;br /&gt;&lt;br /&gt;if M[1]/10 == 0:&lt;br /&gt; GG = randint (0,1)&lt;br /&gt;else:&lt;br /&gt; GG = M[1]/10&lt;br /&gt;#trees growth&lt;br /&gt;for i in range (GG):&lt;br /&gt; #looking for closest tree&lt;br /&gt; closTree = closestTreeToPoint (M[2], Trees)&lt;br /&gt; closTree = closTree[0]&lt;br /&gt; #making a circle in new tree position&lt;br /&gt; cmds.circle (c=(closTree[0], closTree[1], closTree[2]), r=1.5)&lt;br /&gt; cmds.planarSrf (d=1)&lt;br /&gt; #1 tree == 2 graves... so... looking for closest two graves to the tree and removing the from the list&lt;br /&gt; for i in range (2):&lt;br /&gt;  closGrave = closestPointToPoints2 (closTree, allGraves)&lt;br /&gt;  closGraveName = [closGrave[0],closGrave[1]]&lt;br /&gt;  allGraves.remove (closGraveName)&lt;br /&gt; # stop recursion because allGraves list is empty&lt;br /&gt; if len(allGraves)==1:&lt;br /&gt;  return "Done."&lt;br /&gt; # stop the loop if Trees list is empty&lt;br /&gt; if len(Trees) &lt; closgrave =" closestPointToPoints2" closgravepos =" closGrave[1]" closgravename =" [closGrave[0],closGrave[1]]"&gt;= MAX:&lt;br /&gt;  MN = 0&lt;br /&gt;  M2 = closGrave[1]&lt;br /&gt;  allGraves.remove (closGraveName)&lt;br /&gt;  break&lt;br /&gt; else:&lt;br /&gt;  M2 = M[2]&lt;br /&gt;  #looking for angle rotate the box according it to face the center&lt;br /&gt;  angle = angleBetweenVectors (M[2], closGravePos)&lt;br /&gt;  #making the cube with size which is changing depends on counter&lt;br /&gt;  cube = cmds.polyCube (w =size*(MN/MAX) ,h=size*(MN/MAX) ,d=size*(MN/MAX))&lt;br /&gt;  CUBES.append (cube[0])&lt;br /&gt;  #move the cube to the locator position&lt;br /&gt;  cmds.move (closGravePos[0], closGravePos[1], closGravePos[2], cube)&lt;br /&gt;  #rotate the cube to face the center of the religion&lt;br /&gt;  cmds.rotate ( angle[0], angle[1], angle[2], cube, pivot=closGravePos )&lt;br /&gt;  #remove the locator from the list with locators according to not to loop through it next time&lt;br /&gt;  allGraves.remove (closGraveName)&lt;br /&gt;  # draw a curve between center of the religion and the locator&lt;br /&gt;  cmds.curve( p=[(M2[0],M2[1], M2[2]), (closGravePos[0], closGravePos[1], closGravePos[2])] )&lt;br /&gt;  prevousPt = closGravePos&lt;br /&gt; # stop recursion because allGraves list is empty&lt;br /&gt; if len(allGraves)==1:&lt;br /&gt;  return "Done."&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#return "Done."&lt;br /&gt; cmds.refresh()&lt;br /&gt;&lt;br /&gt;####### ALL THE RELIGIONS HAVE SIMILAR LOGIC BUT DIFFERENT NUMBERS&lt;br /&gt;  &lt;br /&gt;######BUDDISM######&lt;br /&gt;closReligion = closestPointToPoints1 (B[2], ALLRELIG) #dist - [3]&lt;br /&gt;if B[1] &gt;= closReligion[1]:&lt;br /&gt; B.append (midPtWater (self.otherW, self.otherM, B[2], self.ceremony, self.entrance, self.Abuddhism, closReligion[2])) # midPt [3]&lt;br /&gt;else:&lt;br /&gt; closPT = closReligion[2]&lt;br /&gt; g = B[2]&lt;br /&gt; xx = g[0] - (closPT[0] - g[0])&lt;br /&gt; yy = g[1] - (closPT[1] - g[1])&lt;br /&gt; ptt = [xx, yy, 0]&lt;br /&gt; B.append (midPtWater (self.otherW, self.otherM, B[2], self.ceremony, self.entrance, self.Abuddhism, ptt)) # midPt [3]&lt;br /&gt;newCen = newCenter (B[2], B[3], cofCenMove)&lt;br /&gt;B[2] = newCen&lt;br /&gt;prevousPt = newCen&lt;br /&gt;&lt;br /&gt;if B[1]/10 == 0:&lt;br /&gt; GG = randint (0,1)&lt;br /&gt;else:&lt;br /&gt; GG = B[1]/10&lt;br /&gt;for i in range (GG):&lt;br /&gt; closTree = closestTreeToPoint (B[2], Trees)&lt;br /&gt; closTree = closTree[0]&lt;br /&gt; cmds.circle (c=(closTree[0], closTree[1], closTree[2]), r=1.5)&lt;br /&gt; cmds.planarSrf (d=1)&lt;br /&gt; #print "closTree"&lt;br /&gt; #print closTree&lt;br /&gt; for i in range (2):&lt;br /&gt;  closGrave = closestPointToPoints2 (closTree, allGraves)&lt;br /&gt;  closGraveName = [closGrave[0],closGrave[1]]&lt;br /&gt;  allGraves.remove (closGraveName)&lt;br /&gt; if len(allGraves)==1:&lt;br /&gt;  return "Done."&lt;br /&gt; if len(Trees) &lt; closgrave =" closestPointToPoints2" closgravepos =" closGrave[1]" closgravename =" [closGrave[0],closGrave[1]]"&gt;= MAX:&lt;br /&gt;  BN = 0&lt;br /&gt;  B2 = closGrave[1]&lt;br /&gt;  allGraves.remove (closGraveName)&lt;br /&gt;  break&lt;br /&gt; else:&lt;br /&gt;  B2 = B[2]&lt;br /&gt;  cube = cmds.polyCube (w =size*(BN/MAX) ,h=size*(BN/MAX) ,d=size*(BN/MAX))&lt;br /&gt;  CUBES.append (cube[0])&lt;br /&gt;  cmds.move (closGravePos[0], closGravePos[1], closGravePos[2], cube)&lt;br /&gt;  allGraves.remove (closGraveName)&lt;br /&gt;  cmds.curve( p=[(B2[0],B2[1], B2[2]), (closGravePos[0], closGravePos[1], closGravePos[2])] )&lt;br /&gt;  prevousPt = closGravePos&lt;br /&gt; if len(allGraves)==1:&lt;br /&gt;  return "Done."&lt;br /&gt;&lt;br /&gt; cmds.refresh()&lt;br /&gt;&lt;br /&gt;######Catholics######&lt;br /&gt;closReligion = closestPointToPoints1 (C[2], ALLRELIG) #dist - [3]&lt;br /&gt;if C[1] &gt;= closReligion[1]:&lt;br /&gt; C.append (midPtWater (self.otherW, self.otherM, C[2], self.ceremony, self.entrance, self.Acatholic, closReligion[2])) # midPt [3]&lt;br /&gt;else:&lt;br /&gt; closPT = closReligion[2]&lt;br /&gt; g = C[2]&lt;br /&gt; xx = g[0] - (closPT[0] - g[0])&lt;br /&gt; yy = g[1] - (closPT[1] - g[1])&lt;br /&gt; ptt = [xx, yy, 0]&lt;br /&gt; C.append (midPtWater (self.otherW, self.otherM, C[2], self.ceremony, self.entrance, self.Acatholic, ptt)) # midPt [3]&lt;br /&gt;newCen = newCenter (C[2], C[3], cofCenMove)&lt;br /&gt;C[2] = newCen&lt;br /&gt;prevousPt = newCen&lt;br /&gt;&lt;br /&gt;if C[1]/10 == 0:&lt;br /&gt; GG = randint (0,1)&lt;br /&gt;else:&lt;br /&gt; GG = C[1]/10&lt;br /&gt;for i in range (GG):&lt;br /&gt; closTree = closestTreeToPoint (C[2], Trees)&lt;br /&gt; closTree = closTree[0]&lt;br /&gt; cmds.circle (c=(closTree[0], closTree[1], closTree[2]), r=1.5)&lt;br /&gt; cmds.planarSrf (d=1)&lt;br /&gt; #print "closTree"&lt;br /&gt; #print closTree&lt;br /&gt; for i in range (2):&lt;br /&gt;  closGrave = closestPointToPoints2 (closTree, allGraves)&lt;br /&gt;  closGraveName = [closGrave[0],closGrave[1]]&lt;br /&gt;  allGraves.remove (closGraveName)&lt;br /&gt; if len(allGraves)==1:&lt;br /&gt;  return "Done."&lt;br /&gt; if len(Trees) &lt; closgrave =" closestPointToPoints2" closgravepos =" closGrave[1]" closgravename =" [closGrave[0],closGrave[1]]"&gt;= MAX:&lt;br /&gt;  CN = 0&lt;br /&gt;  C2 = closGrave[1]&lt;br /&gt;  allGraves.remove (closGraveName)&lt;br /&gt;  break&lt;br /&gt; else:&lt;br /&gt;  C2 = C[2]&lt;br /&gt;  cube = cmds.polyCube (w =size*(CN/MAX) ,h=size*(CN/MAX) ,d=size*(CN/MAX))&lt;br /&gt;  CUBES.append (cube[0])&lt;br /&gt;  cmds.move (closGravePos[0], closGravePos[1], closGravePos[2], cube)&lt;br /&gt;  allGraves.remove (closGraveName)&lt;br /&gt;  cmds.curve( p=[(C2[0],C2[1], C2[2]), (closGravePos[0], closGravePos[1], closGravePos[2])] )&lt;br /&gt;  prevousPt = closGravePos&lt;br /&gt; if len(allGraves)==1:&lt;br /&gt;  return "Done."&lt;br /&gt;&lt;br /&gt; cmds.refresh()&lt;br /&gt;&lt;br /&gt;######Orthodox######&lt;br /&gt;closReligion = closestPointToPoints1 (O[2], ALLRELIG) #dist - [3]&lt;br /&gt;if O[1] &gt;= closReligion[1]:&lt;br /&gt; O.append (midPtWater (self.otherW, self.otherM, O[2], self.ceremony, self.entrance, self.Aorthodox, closReligion[2])) # midPt [3]&lt;br /&gt;else:&lt;br /&gt; closPT = closReligion[2]&lt;br /&gt; g = O[2]&lt;br /&gt; xx = g[0] - (closPT[0] - g[0])&lt;br /&gt; yy = g[1] - (closPT[1] - g[1])&lt;br /&gt; ptt = [xx, yy, 0]&lt;br /&gt; O.append (midPtWater (self.otherW, self.otherM, O[2], self.ceremony, self.entrance, self.Aorthodox, ptt)) # midPt [3]&lt;br /&gt;newCen = newCenter (O[2], O[3], cofCenMove)&lt;br /&gt;O[2] = newCen&lt;br /&gt;prevousPt = newCen&lt;br /&gt;&lt;br /&gt;if O[1]/10 == 0:&lt;br /&gt; GG = randint (0,1)&lt;br /&gt;else:&lt;br /&gt; GG = O[1]/10&lt;br /&gt;for i in range (GG):&lt;br /&gt; closTree = closestTreeToPoint (O[2], Trees)&lt;br /&gt; closTree = closTree[0]&lt;br /&gt; cmds.circle (c=(closTree[0], closTree[1], closTree[2]), r=1.5)&lt;br /&gt; cmds.planarSrf (d=1)&lt;br /&gt; #print "closTree"&lt;br /&gt; #print closTree&lt;br /&gt; for i in range (2):&lt;br /&gt;  closGrave = closestPointToPoints2 (closTree, allGraves)&lt;br /&gt;  closGraveName = [closGrave[0],closGrave[1]]&lt;br /&gt;  allGraves.remove (closGraveName)&lt;br /&gt; if len(allGraves)==1:&lt;br /&gt;  return "Done."&lt;br /&gt; if len(Trees) &lt; closgrave =" closestPointToPoints2" closgravepos =" closGrave[1]" closgravename =" [closGrave[0],closGrave[1]]"&gt;= MAX:&lt;br /&gt;  ON = 0&lt;br /&gt;  O2 = closGrave[1]&lt;br /&gt;  allGraves.remove (closGraveName)&lt;br /&gt;  break&lt;br /&gt; else:&lt;br /&gt;  O2 = O[2]&lt;br /&gt;  cube = cmds.polyCube (w =size*(ON/MAX) ,h=size*(ON/MAX) ,d=size*(ON/MAX))&lt;br /&gt;  CUBES.append (cube[0])&lt;br /&gt;  cmds.move (closGravePos[0], closGravePos[1], closGravePos[2], cube)&lt;br /&gt;  allGraves.remove (closGraveName)&lt;br /&gt;  cmds.curve( p=[(O2[0],O2[1], O2[2]), (closGravePos[0], closGravePos[1], closGravePos[2])] )&lt;br /&gt;  prevousPt = closGravePos&lt;br /&gt; if len(allGraves)==1:&lt;br /&gt;  return "Done."&lt;br /&gt;&lt;br /&gt; cmds.refresh()&lt;br /&gt;&lt;br /&gt;######HINDU######&lt;br /&gt;closReligion = closestPointToPoints1 (H[2], ALLRELIG) #dist - [3]&lt;br /&gt;if H[1] &gt;= closReligion[1]:&lt;br /&gt; H.append (midPtWater (self.otherW, self.otherM, H[2], self.ceremony, self.entrance, self.Aprotest, closReligion[2])) # midPt [3]&lt;br /&gt;else:&lt;br /&gt; closPT = closReligion[2]&lt;br /&gt; g = H[2]&lt;br /&gt; xx = g[0] - (closPT[0] - g[0])&lt;br /&gt; yy = g[1] - (closPT[1] - g[1])&lt;br /&gt; ptt = [xx, yy, 0]&lt;br /&gt; H.append (midPtWater (self.otherW, self.otherM, H[2], self.ceremony, self.entrance, self.Aprotest, ptt)) # midPt [3]&lt;br /&gt;newCen = newCenter (H[2], H[3], cofCenMove)&lt;br /&gt;H[2] = newCen&lt;br /&gt;prevousPt = newCen&lt;br /&gt;&lt;br /&gt;if H[1]/10 == 0:&lt;br /&gt; GG = randint (0,1)&lt;br /&gt;else:&lt;br /&gt; GG = H[1]/10&lt;br /&gt;for i in range (GG):&lt;br /&gt; closTree = closestTreeToPoint (H[2], Trees)&lt;br /&gt; closTree = closTree[0]&lt;br /&gt; cmds.circle (c=(closTree[0], closTree[1], closTree[2]), r=1.5)&lt;br /&gt; cmds.planarSrf (d=1)&lt;br /&gt; #print "closTree"&lt;br /&gt; #print closTree&lt;br /&gt; for i in range (2):&lt;br /&gt;  closGrave = closestPointToPoints2 (closTree, allGraves)&lt;br /&gt;  closGraveName = [closGrave[0],closGrave[1]]&lt;br /&gt;  allGraves.remove (closGraveName)&lt;br /&gt; if len(allGraves)==1:&lt;br /&gt;  return "Done."&lt;br /&gt; if len(Trees) &lt; closgrave =" closestPointToPoints2" closgravepos =" closGrave[1]" closgravename =" [closGrave[0],closGrave[1]]"&gt;= MAX:&lt;br /&gt;  HN = 0&lt;br /&gt;  H2 = closGrave[1]&lt;br /&gt;  allGraves.remove (closGraveName)&lt;br /&gt;  break&lt;br /&gt; else:&lt;br /&gt;  H2 = H[2]&lt;br /&gt;  cube = cmds.polyCube (w =size*(HN/MAX) ,h=size*(HN/MAX) ,d=size*(HN/MAX))&lt;br /&gt;  CUBES.append (cube[0])&lt;br /&gt;  cmds.move (closGravePos[0], closGravePos[1], closGravePos[2], cube)&lt;br /&gt;  allGraves.remove (closGraveName)&lt;br /&gt;  cmds.curve( p=[(H2[0],H2[1], H2[2]), (closGravePos[0], closGravePos[1], closGravePos[2])] )&lt;br /&gt;  prevousPt = closGravePos&lt;br /&gt; if len(allGraves)==1:&lt;br /&gt;  return "Done."&lt;br /&gt;&lt;br /&gt; cmds.refresh()&lt;br /&gt;&lt;br /&gt;######JUDAISM######&lt;br /&gt;closReligion = closestPointToPoints1 (J[2], ALLRELIG) #dist - [3]&lt;br /&gt;if J[1] &gt;= closReligion[1]:&lt;br /&gt; J.append (midPtWater (self.otherW, self.otherM, J[2], self.ceremony, self.entrance, self.Ajudaism, closReligion[2])) # midPt [3]&lt;br /&gt;else:&lt;br /&gt; closPT = closReligion[2]&lt;br /&gt; g = J[2]&lt;br /&gt; xx = g[0] - (closPT[0] - g[0])&lt;br /&gt; yy = g[1] - (closPT[1] - g[1])&lt;br /&gt; ptt = [xx, yy, 0]&lt;br /&gt; J.append (midPtWater (self.otherW, self.otherM, J[2], self.ceremony, self.entrance, self.Ajudaism, ptt)) # midPt [3]&lt;br /&gt;newCen = newCenter (J[2], J[3], cofCenMove)&lt;br /&gt;J[2] = newCen&lt;br /&gt;prevousPt = newCen&lt;br /&gt;&lt;br /&gt;if J[1]/10 == 0:&lt;br /&gt; GG = randint (0,1)&lt;br /&gt;else:&lt;br /&gt; GG = J[1]/10&lt;br /&gt;for i in range (GG):&lt;br /&gt; closTree = closestTreeToPoint (J[2], Trees)&lt;br /&gt; closTree = closTree[0]&lt;br /&gt; cmds.circle (c=(closTree[0], closTree[1], closTree[2]), r=1.5)&lt;br /&gt; cmds.planarSrf (d=1)&lt;br /&gt; #print "closTree"&lt;br /&gt; #print closTree&lt;br /&gt; for i in range (2):&lt;br /&gt;  closGrave = closestPointToPoints2 (closTree, allGraves)&lt;br /&gt;  closGraveName = [closGrave[0],closGrave[1]]&lt;br /&gt;  allGraves.remove (closGraveName)&lt;br /&gt; if len(allGraves)==1:&lt;br /&gt;  return "Done."&lt;br /&gt; if len(Trees) &lt; closgrave =" closestPointToPoints2" closgravepos =" closGrave[1]" closgravename =" [closGrave[0],closGrave[1]]"&gt;= MAX:&lt;br /&gt;  JN = 0&lt;br /&gt;  J2 = closGrave[1]&lt;br /&gt;  allGraves.remove (closGraveName)&lt;br /&gt;  break&lt;br /&gt; else:&lt;br /&gt;  J2 = J[2]&lt;br /&gt;  cube = cmds.polyCube (w =size*(JN/MAX) ,h=size*(JN/MAX) ,d=size*(JN/MAX))&lt;br /&gt;  CUBES.append (cube[0])&lt;br /&gt;  cmds.move (closGravePos[0], closGravePos[1], closGravePos[2], cube)&lt;br /&gt;  allGraves.remove (closGraveName)&lt;br /&gt;  cmds.curve( p=[(J2[0],J2[1], J2[2]), (closGravePos[0], closGravePos[1], closGravePos[2])] )&lt;br /&gt;  prevousPt = closGravePos&lt;br /&gt; if len(allGraves)==1:&lt;br /&gt;  return "Done."&lt;br /&gt;&lt;br /&gt; cmds.refresh()&lt;br /&gt;&lt;br /&gt;######PROTESTANTISM######&lt;br /&gt;closReligion = closestPointToPoints1 (P[2], ALLRELIG) #dist - [3]&lt;br /&gt;if P[1] &gt;= closReligion[1]:&lt;br /&gt; P.append (midPtWater (self.otherW, self.otherM, P[2], self.ceremony, self.entrance, self.Ahindu, closReligion[2])) # midPt [3]&lt;br /&gt;else:&lt;br /&gt; closPT = closReligion[2]&lt;br /&gt; g = P[2]&lt;br /&gt; xx = g[0] - (closPT[0] - g[0])&lt;br /&gt; yy = g[1] - (closPT[1] - g[1])&lt;br /&gt; ptt = [xx, yy, 0]&lt;br /&gt; P.append (midPtWater (self.otherW, self.otherM, P[2], self.ceremony, self.entrance, self.Ahindu, ptt)) # midPt [3]&lt;br /&gt;newCen = newCenter (P[2], P[3], cofCenMove)&lt;br /&gt;P[2] = newCen&lt;br /&gt;prevousPt = newCen&lt;br /&gt;&lt;br /&gt;if P[1]/10 == 0:&lt;br /&gt; GG = randint (0,1)&lt;br /&gt;else:&lt;br /&gt; GG = P[1]/10&lt;br /&gt;for i in range (GG):&lt;br /&gt; closTree = closestTreeToPoint (P[2], Trees)&lt;br /&gt; closTree = closTree[0]&lt;br /&gt; cmds.circle (c=(closTree[0], closTree[1], closTree[2]), r=1.5)&lt;br /&gt; cmds.planarSrf (d=1)&lt;br /&gt; #print "closTree"&lt;br /&gt; #print closTree&lt;br /&gt; for i in range (2):&lt;br /&gt;  closGrave = closestPointToPoints2 (closTree, allGraves)&lt;br /&gt;  closGraveName = [closGrave[0],closGrave[1]]&lt;br /&gt;  allGraves.remove (closGraveName)&lt;br /&gt; if len(allGraves)==1:&lt;br /&gt;  return "Done."&lt;br /&gt; if len(Trees) &lt; closgrave =" closestPointToPoints2" closgravepos =" closGrave[1]" closgravename =" [closGrave[0],closGrave[1]]"&gt;= MAX:&lt;br /&gt;  PN = 0&lt;br /&gt;  P2 = closGrave[1]&lt;br /&gt;  allGraves.remove (closGraveName)&lt;br /&gt;  break&lt;br /&gt; else:&lt;br /&gt;  P2 = P[2]&lt;br /&gt;  cube = cmds.polyCube (w =size*(PN/MAX) ,h=size*(PN/MAX) ,d=size*(PN/MAX))&lt;br /&gt;  CUBES.append (cube[0])&lt;br /&gt;  cmds.move (closGravePos[0], closGravePos[1], closGravePos[2], cube)&lt;br /&gt;  allGraves.remove (closGraveName)&lt;br /&gt;  cmds.curve( p=[(P2[0],P2[1], P2[2]), (closGravePos[0], closGravePos[1], closGravePos[2])] )&lt;br /&gt;  prevousPt = closGravePos&lt;br /&gt; if len(allGraves)==1:&lt;br /&gt;  return "Done."&lt;br /&gt;&lt;br /&gt; cmds.refresh()&lt;br /&gt;&lt;br /&gt;######ISLAM######&lt;br /&gt;closReligion = closestPointToPoints1 (I[2], ALLRELIG) #dist - [3]&lt;br /&gt;if I[1] &gt;= closReligion[1]:&lt;br /&gt; I.append (midPtWater (self.otherW, self.otherM, I[2], self.ceremony, self.entrance, self.Aislam, closReligion[2])) # midPt [3]&lt;br /&gt;else:&lt;br /&gt; closPT = closReligion[2]&lt;br /&gt; g = I[2]&lt;br /&gt; xx = g[0] - (closPT[0] - g[0])&lt;br /&gt; yy = g[1] - (closPT[1] - g[1])&lt;br /&gt; ptt = [xx, yy, 0]&lt;br /&gt; I.append (midPtWater (self.otherW, self.otherM, I[2], self.ceremony, self.entrance, self.Aislam, ptt)) # midPt [3]&lt;br /&gt;newCen = newCenter (I[2], I[3], cofCenMove)&lt;br /&gt;I[2] = newCen&lt;br /&gt;prevousPt = newCen&lt;br /&gt;&lt;br /&gt;if I[1]/10 == 0:&lt;br /&gt; GG = randint (0,1)&lt;br /&gt;else:&lt;br /&gt; GG = I[1]/10&lt;br /&gt;for i in range (GG):&lt;br /&gt; closTree = closestTreeToPoint (I[2], Trees)&lt;br /&gt; closTree = closTree[0]&lt;br /&gt; cmds.circle (c=(closTree[0], closTree[1], closTree[2]), r=1.5)&lt;br /&gt; cmds.planarSrf (d=1)&lt;br /&gt; #print "closTree"&lt;br /&gt; #print closTree&lt;br /&gt; for i in range (2):&lt;br /&gt;  closGrave = closestPointToPoints2 (closTree, allGraves)&lt;br /&gt;  closGraveName = [closGrave[0],closGrave[1]]&lt;br /&gt;  allGraves.remove (closGraveName)&lt;br /&gt; if len(allGraves)==1:&lt;br /&gt;  return "Done."&lt;br /&gt; if len(Trees) &lt; closgrave =" closestPointToPoints2" closgravepos =" closGrave[1]" closgravename =" [closGrave[0],closGrave[1]]"&gt;= MAX:&lt;br /&gt;  IN = 0&lt;br /&gt;  I2 = closGrave[1]&lt;br /&gt;  allGraves.remove (closGraveName)&lt;br /&gt;  break&lt;br /&gt; else:&lt;br /&gt;  I2 = I[2]&lt;br /&gt;  cube = cmds.polyCube (w =size*(IN/MAX) ,h=size*(IN/MAX) ,d=size*(IN/MAX))&lt;br /&gt;  CUBES.append (cube[0])&lt;br /&gt;  cmds.move (closGravePos[0], closGravePos[1], closGravePos[2], cube)&lt;br /&gt;  allGraves.remove (closGraveName)&lt;br /&gt;  cmds.curve( p=[(I2[0],I2[1], I2[2]), (closGravePos[0], closGravePos[1], closGravePos[2])] )&lt;br /&gt;  prevousPt = closGravePos&lt;br /&gt; if len(allGraves)==1:&lt;br /&gt;  return "Done."&lt;br /&gt;&lt;br /&gt; cmds.refresh()&lt;br /&gt;&lt;br /&gt;#duplicate and move all the cubes to see the growth progress after running the script&lt;br /&gt;sss = cmds.duplicate( CUBES )&lt;br /&gt;gr = cmds.group( sss )&lt;br /&gt;cmds.select (gr, r=True)&lt;br /&gt;cmds.move( 0, 300*N, 0 )&lt;br /&gt;&lt;br /&gt;#run the recursion again if there are more elements in the locators list then 0&lt;br /&gt;if len(allGraves)&gt;0:  &lt;br /&gt; self.GROWTH (Way, minGrow, maxGrow, size, allGraves, M2, B2, C2, O2, H2, J2, P2, I2, N, MN, BN, CN, ON, HN, JN, PN, IN, CUBES, MAX = 150.0, cofCenMove=10)&lt;br /&gt;else:&lt;br /&gt; return "Done."&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;to run the script&lt;/p&gt;&lt;pre class="python" name="code"&gt;&lt;br /&gt;g= graves()&lt;br /&gt;allGraves=g.allLocs()&lt;br /&gt;g.getAll()&lt;br /&gt;g.changeNetBecauseRepulsive()&lt;br /&gt;allGraves = g.allLocs1()&lt;br /&gt;g.deleteTrees ()&lt;br /&gt;#'Random'-1 'Normal'-2 'War'-3&lt;br /&gt;g.GROWTH (1,3,80,1.5,allGraves,0,0,0,0,0,0,0,0)&lt;br /&gt;&lt;/pre&gt;&lt;a href="http://www.4shared.com/file/124349074/33c45e07/newLOCSforAnimation.html"&gt;maya file&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-8322799697333413522?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/8322799697333413522/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/08/columbariumgrowthbygrisha.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/8322799697333413522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/8322799697333413522'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/08/columbariumgrowthbygrisha.html' title='columbarium_growth_by_grisha'/><author><name>Grisha Zotov</name><uri>http://www.blogger.com/profile/05521528786515011570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='14' height='32' src='http://2.bp.blogspot.com/_HXZLYcrSPRg/Ss9Gxcu_CXI/AAAAAAAAAV8/W-6Ebb2f7vA/S220/meeee.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-2178472518304088070</id><published>2009-08-07T13:05:00.002+02:00</published><updated>2009-08-07T13:09:06.854+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Andreea Nica'/><title type='text'>Crowd system - first attempt</title><content type='html'>It doesn't always consider the obstacles as it should. Sometimes the objects are rejected (although they should be deleted) and sometimes they just ignore the obstacles.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#######################################################################################################&lt;br /&gt;##&lt;br /&gt;## Crowd System&lt;br /&gt;## student Andreea Nica&lt;br /&gt;##&lt;br /&gt;## Active agents: predacious &amp;amp; small fishes&lt;br /&gt;## Passive agents: edge &amp;amp; fishing line&lt;br /&gt;##&lt;br /&gt;## Rules:&lt;br /&gt;## - fishes meet the edge - delete fishes&lt;br /&gt;## - fishes meet the fishing line - delete fishes&lt;br /&gt;## - small fish meets predacious - delete small fish&lt;br /&gt;## - small fish meets small fish - scale 0.5&lt;br /&gt;## - predacious meets predacious - duplicate predacious&lt;br /&gt;##&lt;br /&gt;#######################################################################################################&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;import maya.cmds as cmds&lt;br /&gt;from random import *&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def hit(hit, agent):&lt;br /&gt;    ### define what to do when it some collision is detected&lt;br /&gt;    #all transformations are made only on the agent, as the hit object will perform the same queries on this agent&lt;br /&gt;    #if it hit the cube, ignore&lt;br /&gt;    if hit == "wall_rigid":&lt;br /&gt;        return&lt;br /&gt;    agentRole = cmds.getAttr(agent + ".role")&lt;br /&gt;    hitRole = cmds.getAttr(hit + ".role")&lt;br /&gt;    if hitRole == agentRole:&lt;br /&gt;        #check if both are bad&lt;br /&gt;        if hitRole == "bad":&lt;br /&gt;            #then delete - edge rule&lt;br /&gt;            cmds.delete('agent')&lt;br /&gt;        else:&lt;br /&gt;            #if good, increase size&lt;br /&gt;            cmds.delete( 'agent')&lt;br /&gt;    elif hitRole != agentRole:&lt;br /&gt;        if hitRole == "bad":&lt;br /&gt;            #means agent role is good (small fish)&lt;br /&gt;            cmds.scale(.5,.5,.5, agent, r=1)&lt;br /&gt;        elif hitRole == "good":&lt;br /&gt;            #means agent was bad (predacious - duplicate)&lt;br /&gt;            cmds.duplicate( 'agent')&lt;br /&gt;           &lt;br /&gt;&lt;br /&gt;class Agent:&lt;br /&gt;    def __init__(self, solver, role, position=(0,0,0), size=(3,3,3), color=(0,0,0), objType="cube", rigidType="active", bounciness=.6, collide=1):&lt;br /&gt;        #set agent atributes&lt;br /&gt;        self.bounciness = bounciness&lt;br /&gt;        self.collide = collide&lt;br /&gt;        self.rigidType = rigidType&lt;br /&gt;        self.solver=solver&lt;br /&gt;        self.role = role&lt;br /&gt;        self.initialScale = size&lt;br /&gt;        #create the agent and scale it&lt;br /&gt;        self.object = cmds.polyCube(ax=(0,0,1))&lt;br /&gt;        cmds.scale(size[0], size[1], size[2])&lt;br /&gt;        #apply a color to the agent&lt;br /&gt;        #set the object color&lt;br /&gt;        #sh = createShader(color, transparency=0, type="lambert")&lt;br /&gt;        #applyShaderOnObject(self.object[0], sh)&lt;br /&gt;       &lt;br /&gt;        #create the rigid body&lt;br /&gt;        self.rigid = cmds.rigidBody(self.object,&lt;br /&gt;                                    name=self.object[0] + "_rigid",&lt;br /&gt;                                    p=position,&lt;br /&gt;                                    b=self.bounciness,&lt;br /&gt;                                    impulse=(0,0,0),&lt;br /&gt;                                    sio=objType, #stand in object&lt;br /&gt;                                    cc = 1, #contact count&lt;br /&gt;                                    cp = 1, #contact position&lt;br /&gt;                                    cn = 1, #contact name&lt;br /&gt;                                    solver=self.solver)&lt;br /&gt;                                   &lt;br /&gt;        #add attribute to the rigid body to store the type of agent&lt;br /&gt;        cmds.select(self.rigid, r=1)&lt;br /&gt;        cmds.addAttr(ln="role", dt="string", keyable=1)&lt;br /&gt;        cmds.setAttr(self.rigid + ".role", "good", type="string")&lt;br /&gt;&lt;br /&gt;        if self.rigidType == "active":&lt;br /&gt;            cmds.setAttr(self.rigid + ".active", 1)&lt;br /&gt;        else:&lt;br /&gt;            cmds.setAttr(self.rigid + ".active", 0)&lt;br /&gt;           &lt;br /&gt;        #apply the expression&lt;br /&gt;        self.applyExpression()&lt;br /&gt;   &lt;br /&gt;    def applyExpression(self):&lt;br /&gt;        "Function to apply the expression to the agent"&lt;br /&gt;        #first disconnect the rotation attributes because we want to controll it via expressions&lt;br /&gt;        cmds.disconnectAttr (self.rigid + "ry.output", self.object[0] + ".rotateY")&lt;br /&gt;        cmds.disconnectAttr (self.rigid + "rx.output", self.object[0] +  ".rotateX")&lt;br /&gt;        cmds.disconnectAttr (self.rigid + "rz.output", self.object[0] + ".rotateZ")&lt;br /&gt;        # Create expression for VehicleF with a random multiplier added to the expression.&lt;br /&gt;        randX = random.uniform(-3,3)&lt;br /&gt;        randY = random.uniform(3,-3)&lt;br /&gt;        ####COMPOSE THE EXPRESSION STRING&lt;br /&gt;&lt;br /&gt;        #now put the text above in a python string&lt;br /&gt;        #the first lines define how the agent will wander&lt;br /&gt;        expString = "// Set wander motion of vehicle and add random multipliers.\n"&lt;br /&gt;        expString += "%s.impulseX" % self.rigid&lt;br /&gt;        expString += " = sin(time * %f);\n" % randX&lt;br /&gt;        expString += "%s.impulseY" % self.rigid&lt;br /&gt;        expString += " = (noise(time) * %f);\n\n" % randY&lt;br /&gt;        #the second part, how it rotates according to the direction it is going (velocity vector)&lt;br /&gt;        expString += "// Set orientation of Vehicle according to the velocity direction.\n"&lt;br /&gt;        expString += "float $fVel[];\n"&lt;br /&gt;        expString += "$fVel  = `getAttr %s.velocity`;\n\n" % (self.rigid)&lt;br /&gt;        expString += "%s.rotateX = 0;\n" % self.object[0]&lt;br /&gt;        expString += "%s.rotateZ = atan2d( $fVel[0], $fVel[1] );\n" % (self.object[0])&lt;br /&gt;        expString += "%s.rotateY = 0;\n\n" % self.object[0]&lt;br /&gt;        #the third part, checking bumps on other agents&lt;br /&gt;        expString += "//checking bumps on other agents\n"&lt;br /&gt;        expString += "string $lastHit;\n"&lt;br /&gt;        expString += "if (%s.contactCount &gt; 0){\n" % self.rigid&lt;br /&gt;        expString += "  int $contactCount = `getAttr %s.contactCount`;\n" % self.rigid&lt;br /&gt;        expString += "  $lastHit = `getAttr %s.contactName[0]`;\n" %self.rigid&lt;br /&gt;        expString += '  string $rigid = "%s";\n' % self.rigid&lt;br /&gt;        expString += '  python("hit(\'"+$lastHit+"\', \'"+ $rigid +"\')");\n'&lt;br /&gt;        expString += "};//endif\n"&lt;br /&gt;       &lt;br /&gt;        self.expString = expString&lt;br /&gt;        cmds.expression(s=expString)       &lt;br /&gt;       &lt;br /&gt;                   &lt;br /&gt;&lt;br /&gt;class Crowd:&lt;br /&gt;    def __init__(self):&lt;br /&gt;        "Initialize attributes"&lt;br /&gt;        #objects for obstacles&lt;br /&gt;        self.collectObjects = []&lt;br /&gt;        #number of vehicles&lt;br /&gt;        self.vNumber = 0&lt;br /&gt;        #boolean for obstacles&lt;br /&gt;        self.obst = 0&lt;br /&gt;        #boolean for global forces&lt;br /&gt;        self.gforces = 0&lt;br /&gt;        #dictionary for UI elements&lt;br /&gt;        self.UIelements = {}&lt;br /&gt;        #set timeline&lt;br /&gt;        cmds.playbackOptions(min= 1, max=1000)&lt;br /&gt;        #get selected objects&lt;br /&gt;        self.collectObjects = cmds.ls(sl=1)&lt;br /&gt;        #start UI&lt;br /&gt;        self.crowdSystemUI()&lt;br /&gt;&lt;br /&gt;    def crowdSystemUI(self):&lt;br /&gt;        "Assembles and displays the UI for the Crowd System"&lt;br /&gt;        self.UIelements["window"] = cmds.window(title="Crowd System",&lt;br /&gt;                                                widthHeight=(300, 200)&lt;br /&gt;                                                )&lt;br /&gt;       &lt;br /&gt;        self.UIelements["form"] = cmds.formLayout()&lt;br /&gt;        txt = cmds.text(label="Number of Vehicles")&lt;br /&gt;        collection = cmds.radioCollection()&lt;br /&gt;        radiob1 = cmds.radioButton(label="10", data=1, changeCommand=self.changeVnumber)&lt;br /&gt;        radiob2 = cmds.radioButton(label="20", onCommand="vNumber = 20")&lt;br /&gt;        cmds.setParent(upLevel=1)&lt;br /&gt;        cmds.setParent(upLevel=1)&lt;br /&gt;&lt;br /&gt;        txtOB = cmds.text(label="Obstacles")&lt;br /&gt;        collection2 = cmds.radioCollection()&lt;br /&gt;        radiob3 = cmds.radioButton(label="On", changeCommand=self.changeObst)&lt;br /&gt;        radiob4 = cmds.radioButton(label="Off")&lt;br /&gt;        cmds.setParent(upLevel=1)&lt;br /&gt;        cmds.setParent(upLevel=1)&lt;br /&gt;&lt;br /&gt;        txtGF = cmds.text( label = "Global Forces")&lt;br /&gt;        collection3 = cmds.radioCollection()&lt;br /&gt;        radiob5 = cmds.radioButton(label= "On" ,changeCommand =self.changeGforces)&lt;br /&gt;        radiob6 = cmds.radioButton(label="Off")&lt;br /&gt;        cmds.setParent(upLevel=1)&lt;br /&gt;        cmds.setParent(upLevel=1)&lt;br /&gt;&lt;br /&gt;        cmds.radioCollection(collection, edit=1, select=radiob1)&lt;br /&gt;        cmds.radioCollection(collection2, edit=1, select=radiob4)&lt;br /&gt;        cmds.radioCollection(collection3, edit=1, select=radiob6)&lt;br /&gt;&lt;br /&gt;        # Place Vehicle options&lt;br /&gt;        form = self.UIelements["form"]&lt;br /&gt;        cmds.formLayout(form,&lt;br /&gt;                        edit=1,&lt;br /&gt;                        attachForm= [&lt;br /&gt;                                    ( txt, "top", 20),&lt;br /&gt;                                    (txt ,"left", 70),&lt;br /&gt;                                    (radiob1,"top", 10),&lt;br /&gt;                                    (radiob1,"left", 20),&lt;br /&gt;                                    (radiob2,"top", 30),&lt;br /&gt;                                    (radiob2,"left", 20)&lt;br /&gt;                                    ]&lt;br /&gt;                        )&lt;br /&gt;        # Place environment options&lt;br /&gt;        cmds.formLayout(form,&lt;br /&gt;                        edit=1,&lt;br /&gt;                        attachForm= [&lt;br /&gt;                                    (txtOB, "top", 80),&lt;br /&gt;                                    (txtOB, "left", 80),&lt;br /&gt;                                    (radiob3, "top", 80),&lt;br /&gt;                                    (radiob3, "left", 150),&lt;br /&gt;                                    (radiob4 ,"top", 80),&lt;br /&gt;                                    (radiob4, "left", 190),&lt;br /&gt;                                    (txtGF, "top", 110),&lt;br /&gt;                                    (txtGF, "left", 63),&lt;br /&gt;                                    (radiob5, "top", 110),&lt;br /&gt;                                    (radiob5, "left", 150),&lt;br /&gt;                                    (radiob6, "top", 110),&lt;br /&gt;                                    (radiob6, "left", 190)&lt;br /&gt;                                    ]&lt;br /&gt;                        )&lt;br /&gt;        # Create buttons&lt;br /&gt;        button1 = cmds.button(label = "Create")&lt;br /&gt;        button2 = cmds.button(label = "Cancel")&lt;br /&gt;&lt;br /&gt;        # Place buttons in the window&lt;br /&gt;        cmds.formLayout(form,&lt;br /&gt;                        edit=1,&lt;br /&gt;                        attachForm =[&lt;br /&gt;                                    (button1, "bottom", 10),&lt;br /&gt;                                    (button1, "left", 185),&lt;br /&gt;                                    (button2, "bottom", 10),&lt;br /&gt;                                    (button2, "right", 10)&lt;br /&gt;                                    ]&lt;br /&gt;                        )&lt;br /&gt;        # Add the commands to the buttons.&lt;br /&gt;        cmds.button(button1, edit=1, command=self.createCrowd )&lt;br /&gt;        cmds.button(button2, edit=1, command=self.deleteUI )&lt;br /&gt;       &lt;br /&gt;        cmds.showWindow(self.UIelements["window"])&lt;br /&gt;    ## UI help functions&lt;br /&gt;    def changeVnumber(self, *args):&lt;br /&gt;        if args[0] == "true":&lt;br /&gt;            self.vNumber = 10&lt;br /&gt;        else:&lt;br /&gt;            self.vNumber = 20&lt;br /&gt;        print "vNumber:",self.vNumber   &lt;br /&gt;    def changeObst(self, *args):&lt;br /&gt;        if args[0] == "true":&lt;br /&gt;            self.obst = 1&lt;br /&gt;        else:&lt;br /&gt;            self.obst = 0&lt;br /&gt;        print "Obst:", self.obst&lt;br /&gt;    def changeGforces(self, *args):&lt;br /&gt;        if args[0] == "true":&lt;br /&gt;            self.gforces = 1&lt;br /&gt;        else:&lt;br /&gt;            self.gforces = 0&lt;br /&gt;        print "gforces:", self.gforces&lt;br /&gt;    def deleteUI(self, *args):&lt;br /&gt;        cmds.deleteUI(self.UIelements["window"])&lt;br /&gt;        self.UIelements["window"] = ""&lt;br /&gt;&lt;br /&gt;    ## MAIN METHODS&lt;br /&gt;    def createCrowdSolver(self):&lt;br /&gt;        "Creates the main rigidSolver for the elements in the Crowd System"&lt;br /&gt;        self.crowdSolver = cmds.rigidSolver(    create=1,&lt;br /&gt;                                                current=1,&lt;br /&gt;                                                name="crowdSolver",&lt;br /&gt;                                                velocityVectorScale=0.5,&lt;br /&gt;                                                displayVelocity=1&lt;br /&gt;                                                )&lt;br /&gt;        cmds.setAttr(self.crowdSolver + ".allowDisconnection", 1)&lt;br /&gt;       &lt;br /&gt;    def createVehicle(self, vType, N):&lt;br /&gt;        "Creates one vehicle and add fields and expressions to it."&lt;br /&gt;        #first verify if the vehicle is of type follower (F) or leader (L)&lt;br /&gt;        #and set the size of the cube according to the type (leaders are bigger! :)&lt;br /&gt;        if vType == "F":&lt;br /&gt;            w = 1     #width&lt;br /&gt;            h = .5 #height&lt;br /&gt;            d = 1     #depth&lt;br /&gt;        else:&lt;br /&gt;            w = 5&lt;br /&gt;            h = 3&lt;br /&gt;            d = 5&lt;br /&gt;       &lt;br /&gt;        #creates the basic cube&lt;br /&gt;        vehicle = cmds.polyCube(w=w,d=d,h=h)&lt;br /&gt;       &lt;br /&gt;        #create a vehicle force to the agent&lt;br /&gt;        field = cmds.radial(position = [0,0,0],&lt;br /&gt;                            magnitude = 50, #positive magnitude means repoulsion, negative magnitude means atraction&lt;br /&gt;                            attenuation = 0.3,&lt;br /&gt;                            maxDistance = 8.0&lt;br /&gt;                            )&lt;br /&gt;                           &lt;br /&gt;        cmds.parent(field[0],vehicle[0])&lt;br /&gt;        cmds.hide(field)&lt;br /&gt;       &lt;br /&gt;        if vType == "L":&lt;br /&gt;            Lfield = cmds.radial(position = [0,0,0],&lt;br /&gt;                                magnitude =-1,&lt;br /&gt;                                attenuation = .2,&lt;br /&gt;                                maxDistance = 50&lt;br /&gt;                                )&lt;br /&gt;            cmds.parent(Lfield[0],vehicle[0])&lt;br /&gt;            cmds.hide(Lfield)&lt;br /&gt;       &lt;br /&gt;           &lt;br /&gt;        #convert it to a rigid body with random placement&lt;br /&gt;        rigid = cmds.rigidBody(&lt;br /&gt;                    vehicle[0],&lt;br /&gt;                    n="rigidVeh1%s%d" % (vType, N),&lt;br /&gt;                    active=1,&lt;br /&gt;                    mass=1,&lt;br /&gt;                    bounciness=0,&lt;br /&gt;                    damping=1.5,&lt;br /&gt;                    position=(uniform(-70,70),uniform(-70,70),0),&lt;br /&gt;                    impulse=(0,0,0),&lt;br /&gt;                    standInObject="cube",&lt;br /&gt;                    solver=self.crowdSolver&lt;br /&gt;                    )&lt;br /&gt;                   &lt;br /&gt;        #disconnect the rotation attributes of the vehicle&lt;br /&gt;        cmds.disconnectAttr(rigid + "rx.output", vehicle[0]+".rx")&lt;br /&gt;        cmds.disconnectAttr(rigid + "ry.output", vehicle[0]+".ry")&lt;br /&gt;        cmds.disconnectAttr(rigid + "rz.output", vehicle[0]+".rz")&lt;br /&gt;       &lt;br /&gt;        #add expression for movement&lt;br /&gt;        randX = uniform(-3,3)&lt;br /&gt;        randY = uniform(-3,3)&lt;br /&gt;       &lt;br /&gt;        expString = "%s.impulseX = sin(time * %f);" % (rigid, randX)&lt;br /&gt;        expString += "%s.impulseY = (noise(time)*%f);" % (rigid, randY)&lt;br /&gt;        expString += "float $Vel[] = `getAttr %s.velocity`;" % rigid&lt;br /&gt;        expString += "%s.rotateX = 0;" % vehicle[0]&lt;br /&gt;        expString += "%s.rotateY = 0;" % vehicle[0]&lt;br /&gt;        expString += "%s.rotateZ = atan2d( $Vel[0], $Vel[2] );" % vehicle[0]&lt;br /&gt;       &lt;br /&gt;        cmds.expression(s=expString)&lt;br /&gt;       &lt;br /&gt;        if vType== "F":&lt;br /&gt;            return [rigid,field]&lt;br /&gt;        else:&lt;br /&gt;            return [rigid, field, Lfield]&lt;br /&gt;       &lt;br /&gt;       &lt;br /&gt;       &lt;br /&gt;    def createCrowd(self, *args):&lt;br /&gt;        "Method to assemble the whole system"&lt;br /&gt;        #creates a rigidSolver to add the vehicle to&lt;br /&gt;        self.createCrowdSolver()&lt;br /&gt;        #turn on the velocity arrow           &lt;br /&gt;        cmds.setAttr(self.crowdSolver + ".displayVelocity", 1)&lt;br /&gt;        cmds.setAttr(self.crowdSolver + ".scaleVelocity", .5)&lt;br /&gt;       &lt;br /&gt;        #allow disconnections on the rigidSolver&lt;br /&gt;        cmds.setAttr(self.crowdSolver + ".allowDisconnection", 1)&lt;br /&gt;&lt;br /&gt;       &lt;br /&gt;       &lt;br /&gt;        ##create amount of agents&lt;br /&gt;        if self.vNumber == 10: #vNumber = number of vehicles&lt;br /&gt;            FNumber = 8 #followers&lt;br /&gt;            LNumber = 2 #leaders&lt;br /&gt;        elif self.vNumber ==20:&lt;br /&gt;            FNumber =18&lt;br /&gt;            LNumber =2&lt;br /&gt;           &lt;br /&gt;        #create empty lists to store followers and leaders&lt;br /&gt;        followers = []&lt;br /&gt;        leaders = []&lt;br /&gt;   &lt;br /&gt;       &lt;br /&gt;        #creating the followrs&lt;br /&gt;        for i in range(FNumber):&lt;br /&gt;            v = self.createVehicle("F",i)&lt;br /&gt;            followers.append(v)&lt;br /&gt;        #creating the leaders&lt;br /&gt;        for i in range(LNumber):&lt;br /&gt;            v = self.createVehicle("L",i)&lt;br /&gt;            leaders.append(v)&lt;br /&gt;           &lt;br /&gt;        #CONNECT THE FIELDS TO THE RIGID BODIES (AGENTS)&lt;br /&gt;        #1) connect the leaders (predacious fishes) to the followers (small fishes)&lt;br /&gt;        for i in range (LNumber):&lt;br /&gt;            Lfield = leaders[i][2]&lt;br /&gt;            lfield = leaders[i][1]&lt;br /&gt;            for j in range(FNumber):&lt;br /&gt;                Frigid = followers[j][0]&lt;br /&gt;                #connect the fields&lt;br /&gt;                cmds.connectDynamic(Frigid, fields=Lfield)&lt;br /&gt;                cmds.connectDynamic(Frigid, fields=lfield)&lt;br /&gt;               &lt;br /&gt;        #2) connect followers (small fishes) to leaders (predacious fishes)&lt;br /&gt;        for i in range(FNumber):&lt;br /&gt;            Ffield = followers[i][1]&lt;br /&gt;            for j in range(LNumber):&lt;br /&gt;                Lrigid = leaders[j][0]&lt;br /&gt;                cmds.connectDynamic(Lrigid, fields=Ffield)&lt;br /&gt;               &lt;br /&gt;        #3) connect leaders (predacious fishes) to leaders ((predacious fishes))&lt;br /&gt;        for i in range(LNumber):   &lt;br /&gt;            Lfield = leaders[i][1]&lt;br /&gt;            for j in range(LNumber):&lt;br /&gt;                if i==j: continue&lt;br /&gt;                L1rigid = leaders[j][0]&lt;br /&gt;                cmds.connectDynamic(L1rigid, fields=Lfield)&lt;br /&gt;               &lt;br /&gt;        #4) connect followers (small fishes) to followes (small fishes)&lt;br /&gt;        for i in range(FNumber):&lt;br /&gt;            Ffield = followers[i][1]&lt;br /&gt;            for j in range(FNumber):&lt;br /&gt;                if i==j: continue&lt;br /&gt;                F1rigid = followers[j][0]&lt;br /&gt;               &lt;br /&gt;                cmds.connectDynamic(F1rigid, fields=Ffield)   &lt;br /&gt;               &lt;br /&gt;       &lt;br /&gt;       &lt;br /&gt;       &lt;br /&gt;       &lt;br /&gt;        #create obstacles if I want&lt;br /&gt;        if self.obst: self.collectObstacles()&lt;br /&gt;                       &lt;br /&gt;        #disable solver warnings&lt;br /&gt;        cmds.cycleCheck(e=0)&lt;br /&gt;       &lt;br /&gt;    def collectObstacles(self):&lt;br /&gt;        "Collects all obstacles"&lt;br /&gt;        if len(self.collectObjects) == 0:&lt;br /&gt;            #there is nothing selected&lt;br /&gt;            return "There is nothing selected!"&lt;br /&gt;           &lt;br /&gt;        for o in self.collectObjects:&lt;br /&gt;            cmds.rigidBody( o,&lt;br /&gt;                            passive=1,&lt;br /&gt;                            name=o+"_rb",&lt;br /&gt;                            bounciness=2.0 )&lt;br /&gt;       &lt;br /&gt;       &lt;br /&gt;       &lt;br /&gt;       &lt;br /&gt;           &lt;br /&gt;       &lt;br /&gt;### create an instance of this class&lt;br /&gt;c = Crowd()&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-2178472518304088070?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/2178472518304088070/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/08/crowd-system-first-attempt.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/2178472518304088070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/2178472518304088070'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/08/crowd-system-first-attempt.html' title='Crowd system - first attempt'/><author><name>Andreea Nica</name><uri>http://www.blogger.com/profile/13606639439049414718</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-7839363104532224487</id><published>2009-08-06T17:28:00.001+02:00</published><updated>2009-08-06T17:28:51.486+02:00</updated><title type='text'></title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_L1fa5GiSSL4/Snr2pgodSpI/AAAAAAAAAqM/8a9zMpEe9tw/s1600-h/Untitled-1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 224px;" src="http://4.bp.blogspot.com/_L1fa5GiSSL4/Snr2pgodSpI/AAAAAAAAAqM/8a9zMpEe9tw/s320/Untitled-1.jpg" alt="" id="BLOGGER_PHOTO_ID_5366873098960063122" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-7839363104532224487?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/7839363104532224487/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/08/blog-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/7839363104532224487'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/7839363104532224487'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/08/blog-post.html' title=''/><author><name>Andreea Nica</name><uri>http://www.blogger.com/profile/13606639439049414718</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_L1fa5GiSSL4/Snr2pgodSpI/AAAAAAAAAqM/8a9zMpEe9tw/s72-c/Untitled-1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-4032075364847091065</id><published>2009-08-06T17:08:00.002+02:00</published><updated>2009-08-06T17:11:32.853+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Andreea Nica'/><title type='text'>Assignment01B</title><content type='html'>I managed to make the part with the rotation and the scale of the square but when i tried to make it recursive i could not manage to select all the time the last square created. I tried to make a list where to store all of them and always refer to it from the list but it doesn't work as well.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;###########################&lt;br /&gt;###assignment01B&lt;br /&gt;###student Andreea Nica&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;import maya.cmds as cmds&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def squares (it,i):&lt;br /&gt;   &lt;br /&gt;    ##select the needed sides of the square&lt;br /&gt;    t=i-1&lt;br /&gt;    cmds.select('nurbsSquare%d'%t)&lt;br /&gt;    isSides = cmds.filterExpand(sm=9)&lt;br /&gt;   &lt;br /&gt;    line1 = isSides[0]&lt;br /&gt;    line2 = isSides[1]&lt;br /&gt;   &lt;br /&gt;    ##get the point on the side of the square at the specific proportion&lt;br /&gt;    poc1 = cmds.pointOnCurve(  line1, pr=perc1, top=True, p=True  )  #rightnurbsSquare&lt;br /&gt;    poc2 = cmds.pointOnCurve(  line2, pr=perc2, top=True, p=True  )&lt;br /&gt;&lt;br /&gt;    ##find the corner of the square in order to find the exact position where the second square will be moved&lt;br /&gt;    perc3 =1&lt;br /&gt;    corner = cmds.pointOnCurve(  line2, pr=perc3, top=True, p=True  )&lt;br /&gt;&lt;br /&gt;    ##create the second square&lt;br /&gt;   &lt;br /&gt;    cmds.duplicate('nurbsSquare%d'%t)&lt;br /&gt;    if t &lt;&gt; 1:&lt;br /&gt;        SquaresList.append('nurbsSquare%d'%t)&lt;br /&gt;   &lt;br /&gt;    ##find the position where the last square will be placed&lt;br /&gt;    x = corner[0]-poc1[0]&lt;br /&gt;    xx=float(x/3)&lt;br /&gt;    y= corner[0]&lt;br /&gt;    yy=float(y/3)&lt;br /&gt;   &lt;br /&gt;    ##move the square&lt;br /&gt;    cmds.move (xx,yy,0, 'nurbsSquare%d'%i)&lt;br /&gt;    cmds.select('nurbsSquare%d'%i)&lt;br /&gt;   &lt;br /&gt;    ##find the pivot for scale and rotation&lt;br /&gt;    x1=float(poc2[0])&lt;br /&gt;    y1=float(poc2[1])&lt;br /&gt;       &lt;br /&gt;    ##scale and rotate&lt;br /&gt;    cmds.scale( .8, .8, .8, 'nurbsSquare%d'%i, pivot=(x1, y1, 0), absolute=True )&lt;br /&gt;    cmds.rotate(0,0,'20deg',pivot=(x1, y1, 0),absolute=True)&lt;br /&gt;   &lt;br /&gt;    ##select only the last square created&lt;br /&gt;    cmds.select( clear=True )&lt;br /&gt;    cmds.select('nurbsSquare%d'%i)&lt;br /&gt;   &lt;br /&gt;    cmds.hide('nurbsSquare%d'%t)&lt;br /&gt;   &lt;br /&gt;    ##check if the last iteration was reached or not&lt;br /&gt;    if it == 0 :&lt;br /&gt;        #stop&lt;br /&gt;        cmds.showHidden( all=True )&lt;br /&gt;        print 'gataaaaaaaaaaaaaaaa'&lt;br /&gt;        return "Done."&lt;br /&gt;    else:&lt;br /&gt;        #did not finish yet&lt;br /&gt;        #remove one unit (count down)&lt;br /&gt;        it -= 1&lt;br /&gt;        i += 1&lt;br /&gt;       &lt;br /&gt;        squares(it,i)&lt;br /&gt;       &lt;br /&gt;##create the initial square       &lt;br /&gt;initialSquare = cmds.nurbsSquare( sl1=10, sl2=10 )&lt;br /&gt;isSides = cmds.filterExpand(sm=9) &lt;br /&gt;print isSides&lt;br /&gt;perc1 = 1./3&lt;br /&gt;perc2 = 2./3&lt;br /&gt;&lt;br /&gt;SquaresList = []&lt;br /&gt;SquaresList.append('nurbsSquare1')&lt;br /&gt;print SquaresList&lt;br /&gt;##call the recursive function   &lt;br /&gt;&lt;br /&gt;squares(4,2)&lt;br /&gt;&lt;br /&gt;print 'Final List'&lt;br /&gt;print SquaresList&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-4032075364847091065?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/4032075364847091065/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/08/assignment01b.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/4032075364847091065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/4032075364847091065'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/08/assignment01b.html' title='Assignment01B'/><author><name>Andreea Nica</name><uri>http://www.blogger.com/profile/13606639439049414718</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-1903236908565059463</id><published>2009-07-30T14:36:00.003+02:00</published><updated>2009-07-30T14:44:57.089+02:00</updated><title type='text'>Alice_Assignment01+03</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_k6vtLLcz3OQ/SnGVTPKStsI/AAAAAAAAAhE/MKjudx4aDOE/s1600-h/Final+Assignments_scripting_alice_Page_1.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 176px;" src="http://2.bp.blogspot.com/_k6vtLLcz3OQ/SnGVTPKStsI/AAAAAAAAAhE/MKjudx4aDOE/s320/Final+Assignments_scripting_alice_Page_1.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5364232788894725826" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_k6vtLLcz3OQ/SnGUkBxAIKI/AAAAAAAAAg0/g1ucZTAqegg/s1600-h/Final+Assignments_scripting_alice_Page_1.jpg"&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_k6vtLLcz3OQ/SnGUj-IDQTI/AAAAAAAAAgs/P9vBpKC7oKg/s1600-h/Final+Assignments_scripting_alice_Page_2.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 176px;" src="http://2.bp.blogspot.com/_k6vtLLcz3OQ/SnGUj-IDQTI/AAAAAAAAAgs/P9vBpKC7oKg/s320/Final+Assignments_scripting_alice_Page_2.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5364231976868069682" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To see the animation :&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.vimeo.com/5838178"&gt;http://www.vimeo.com/5838178&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-1903236908565059463?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/1903236908565059463/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/07/aliceassignment0103.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/1903236908565059463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/1903236908565059463'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/07/aliceassignment0103.html' title='Alice_Assignment01+03'/><author><name>alice</name><uri>http://www.blogger.com/profile/13826062750165810811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_k6vtLLcz3OQ/SnGVTPKStsI/AAAAAAAAAhE/MKjudx4aDOE/s72-c/Final+Assignments_scripting_alice_Page_1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-650233453089032843</id><published>2009-07-28T00:37:00.002+02:00</published><updated>2009-07-28T00:42:22.742+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Liu'/><category scheme='http://www.blogger.com/atom/ns#' term='assignments'/><title type='text'>Assignment 01B, fianl, Liu</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_2gY_HsWGQR4/Sm4sw9zVdFI/AAAAAAAAAj8/1GqRq2YBg8E/s1600-h/ASSIGNMENT01B.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_2gY_HsWGQR4/Sm4sw9zVdFI/AAAAAAAAAj8/1GqRq2YBg8E/s400/ASSIGNMENT01B.JPG" alt="" id="BLOGGER_PHOTO_ID_5363273425980060754" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;img src="file:///C:/DOCUME%7E1/%E5%8A%89%E7%A7%91%E6%88%90/LOCALS%7E1/Temp/moz-screenshot-3.jpg" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="python" name="code"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#######################################################&lt;br /&gt;# Assignment 01B Recursion&lt;br /&gt;# Editted by Liu, Ko-cheng&lt;br /&gt;# Logic:&lt;br /&gt;#  Step1: Set up initial conditions&lt;br /&gt;#	 setup01): Create Biggest and smallest circles&lt;br /&gt;#    setup02): Make these two circles tangent&lt;br /&gt;#  Step2: Define the principles of how to get the next cirlce tangent with previous two&lt;br /&gt;#  Step3: Start the recursion by the loop&lt;br /&gt;###########################################################&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;import maya.cmds as cmds&lt;br /&gt;&lt;br /&gt;#Step1:Define the biggest and smallest circles&lt;br /&gt;BigRadius=30&lt;br /&gt;SmallRadius=2&lt;br /&gt;Minus= BigRadius-SmallRadius&lt;br /&gt;&lt;br /&gt;# Create these two circles which are tangent to each other&lt;br /&gt;cmds.circle(c=(0,0,0),r=30)&lt;br /&gt;cmds.circle(c=(0,-28,0),r=2)&lt;br /&gt;&lt;br /&gt;#Step2:Generate two circles which follow the tangent princples&lt;br /&gt;#2.1)r1+r2=D&lt;br /&gt;NextRadius=SmallRadius+1&lt;br /&gt;D= NextRadius+SmallRadius&lt;br /&gt;cmds.circle(n="Mcircle",c=(0,-28,0),r=D)&lt;br /&gt;&lt;br /&gt;#2.2)offset the outmost circle based on the radius of next circle &lt;br /&gt;cmds.circle(n="Moffset",c=(0,0,0), r=BigRadius-NextRadius)&lt;br /&gt;#2.3)Get the intersection point at the right side and as the center point of the new circle&lt;br /&gt;#  which is tangent with previous two circles&lt;br /&gt;&lt;br /&gt;inters = cmds.curveIntersect('Mcircle','Moffset')&lt;br /&gt;inters = inters.split()&lt;br /&gt;print inters&lt;br /&gt;inters1 = inters[1:2]&lt;br /&gt;for i in inters1:&lt;br /&gt;	u = float(i)&lt;br /&gt;	pos1=cmds.pointOnCurve("Mcircle", p=1, pr=u)&lt;br /&gt;	myCircle=cmds.circle(c=pos1,r=3)&lt;br /&gt;cmds.delete('Mcircle','Moffset')&lt;br /&gt;&lt;br /&gt;#Step3: Loop through it based on previous steps&lt;br /&gt;for i in range(1,BigRadius-3,1):&lt;br /&gt;	cmds.circle(n="myOffset"+str(i),c=(0,0,0),r=Minus-i-1)&lt;br /&gt;	cmds.rotate&lt;br /&gt;	radius=2+i&lt;br /&gt;	r1= radius&lt;br /&gt;	r2= radius+1&lt;br /&gt;	D=r1+r2&lt;br /&gt;	&lt;br /&gt;	cmds.circle(n="mycircle"+str(i),c=pos1,r=D)&lt;br /&gt;	cmds.rotate(0,0,20*i,cp=u)&lt;br /&gt;	myInters= cmds.curveIntersect('mycircle'+str(i),'myOffset'+str(i))&lt;br /&gt;	myInters= myInters.split()&lt;br /&gt;	print myInters&lt;br /&gt;	&lt;br /&gt;	myInters= myInters[0:2]&lt;br /&gt;	for j in myInters:&lt;br /&gt;		u=float(j)&lt;br /&gt;		if 4 &lt; pos2="cmds.pointOnCurve(" p="1,pr="u)" mycircle="cmds.circle(c="pos2,r="i+3)" pos1="pos2"&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-650233453089032843?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/650233453089032843/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/07/assignment-01b-fianl-liu.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/650233453089032843'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/650233453089032843'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/07/assignment-01b-fianl-liu.html' title='Assignment 01B, fianl, Liu'/><author><name>Liu, Kocheng</name><uri>http://www.blogger.com/profile/06568145659726503765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_2gY_HsWGQR4/S2lJxVY9V0I/AAAAAAAAArI/ahtB3H3aRyc/S220/me1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_2gY_HsWGQR4/Sm4sw9zVdFI/AAAAAAAAAj8/1GqRq2YBg8E/s72-c/ASSIGNMENT01B.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-8764489402782506890</id><published>2009-07-28T00:21:00.002+02:00</published><updated>2009-07-28T00:29:43.440+02:00</updated><title type='text'>Assignment 03   Shi xinyu &amp; Liu</title><content type='html'>There are still some problems among the scripting, we would like to ask how to solve the problems.&lt;br /&gt;1) Since our initial idea is to show the good and bad objects in certain time, and the agent will be attracted. But we couldn't find out how to show the object in some specific times. (Which command we need to use in the scripting?)&lt;br /&gt;2) We can make it work when the agent hits the good angel, but not working in Bad Evil. We still don't know why it doesn't work. We know the "hit" part is among the mel scripting and we couldn't understand the mel code so well.&lt;br /&gt;&lt;br /&gt;These are the two main problems we have met so far. We have done our best, and thank you for your teaching in whole semester!&lt;br /&gt;&lt;br /&gt;Liu &amp;amp; Shi&lt;br /&gt;&lt;object width="320" height="266" class="BLOG_video_class" id="BLOG_video-69783bb7c74f20f7" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://v20.nonxt1.googlevideo.com/videoplayback?id%3D69783bb7c74f20f7%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1331726397%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D2E5288BE447DABA8C7FB52EA2AEF9FC9C9F67E59.720102D7EAA14FD3AF5640EEC6D5451E6FADA09D%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D69783bb7c74f20f7%26offsetms%3D5000%26itag%3Dw160%26sigh%3DiyoOzKNCJfJBx0QvVsmR9GC9FzI&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash"width="320" height="266" bgcolor="#FFFFFF"flashvars="flvurl=http://v20.nonxt1.googlevideo.com/videoplayback?id%3D69783bb7c74f20f7%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1331726397%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D2E5288BE447DABA8C7FB52EA2AEF9FC9C9F67E59.720102D7EAA14FD3AF5640EEC6D5451E6FADA09D%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D69783bb7c74f20f7%26offsetms%3D5000%26itag%3Dw160%26sigh%3DiyoOzKNCJfJBx0QvVsmR9GC9FzI&amp;autoplay=0&amp;ps=blogger"allowFullScreen="true" /&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-8764489402782506890?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='enclosure' type='video/mp4' href='http://www.blogger.com/video-play.mp4?contentId=69783bb7c74f20f7&amp;type=video%2Fmp4' length='0'/><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/8764489402782506890/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/07/assignment-03-shi-xinyu-liu_28.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/8764489402782506890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/8764489402782506890'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/07/assignment-03-shi-xinyu-liu_28.html' title='Assignment 03   Shi xinyu &amp; Liu'/><author><name>Liu, Kocheng</name><uri>http://www.blogger.com/profile/06568145659726503765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_2gY_HsWGQR4/S2lJxVY9V0I/AAAAAAAAArI/ahtB3H3aRyc/S220/me1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-7585570500790088704</id><published>2009-07-28T00:01:00.001+02:00</published><updated>2009-07-28T00:03:44.094+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Liu and Shi'/><category scheme='http://www.blogger.com/atom/ns#' term='assignments'/><title type='text'>Assignment 03   Shi xinyu &amp; Liu</title><content type='html'>&lt;pre class="python" name="code"&gt;&lt;br /&gt;################################################################&lt;br /&gt;## Assignment03 Crowd System&lt;br /&gt;## Professor: Daniel da Rocha&lt;br /&gt;## Students: Liu, ko-cheng &amp;amp; Shi, xinyu&lt;br /&gt;##&lt;br /&gt;## Logic&lt;br /&gt;##   Create 3 kinds of objs&lt;br /&gt;##     1. agent&lt;br /&gt;##       a) active movement&lt;br /&gt;##     2. Good Angel (helps increase the size of agent)&lt;br /&gt;##       a) passive movement&lt;br /&gt;##     3. Bad Evil (shrink the size of agent)&lt;br /&gt;##   a) non-movable&lt;br /&gt;##   When the agents hit the Good Angel, they increase the size.&lt;br /&gt;##   On ther other hand, they shrink when they hit the Bad Evil&lt;br /&gt;##&lt;br /&gt;## Initial Set up:&lt;br /&gt;##   1. Create a cyclinder as wall that holds all the objs inside &lt;br /&gt;###################################################################&lt;br /&gt;&lt;br /&gt;import maya.cmds as cmds&lt;br /&gt;import maya.mel as mel&lt;br /&gt;import random&lt;br /&gt;import math&lt;br /&gt;&lt;br /&gt;def hit(hit, agent, GoodAngel, BadEvil):&lt;br /&gt; ### define what to do when it some collision is detected&lt;br /&gt; #all transformations are made only on the agent, as the hit object will perform the same queries on this agent&lt;br /&gt; #if it hit the cube, ignore&lt;br /&gt; if hit == "wall_rigid":&lt;br /&gt;  return&lt;br /&gt; agentRole = cmds.getAttr(agent + ".role")&lt;br /&gt; hitRole = cmds.getAttr(hit + ".role")&lt;br /&gt; GoodAngelRole= cmds.getAttr(GoodAngel+".role")&lt;br /&gt; BadEvilRole= cmds.getAttr(BadEvil+".role")&lt;br /&gt; if hitRole == GoodAngelRole:&lt;br /&gt;  if hitRole== "good":&lt;br /&gt;   cmds.scale(1.1,1.1,1.1, agent, r=1)&lt;br /&gt; elif hitRole == GoodAngelRole:&lt;br /&gt;  if hitRole == "bad":&lt;br /&gt;   cmds.scale(.1,.1,.1, agent, r=1)&lt;br /&gt; elif hitRole == agentRole:&lt;br /&gt;  #check if both are bad&lt;br /&gt;  if hitRole == "bad":&lt;br /&gt;   #then shrink&lt;br /&gt;   cmds.scale(.9,.9,.9, agent, r=1)&lt;br /&gt;  else:&lt;br /&gt;   #if good, increase size&lt;br /&gt;   cmds.scale(1.1,1.1,1.1, agent, r=1)&lt;br /&gt; elif hitRole != agentRole:&lt;br /&gt;  if hitRole == "bad":&lt;br /&gt;   #means agent role is good&lt;br /&gt;   cmds.scale(.90,.90,.90, agent, r=1)&lt;br /&gt;  elif hitRole == "good":&lt;br /&gt;   #means agent was bad&lt;br /&gt;   cmds.scale(1.1,1.1,1.1, agent, r=1)&lt;br /&gt;&lt;br /&gt;   &lt;br /&gt;#function to create shader&lt;br /&gt;def createShader(color, transparency=0, type="lambert"):&lt;br /&gt; #steps to create a new material&lt;br /&gt; shadingNode1 = cmds.shadingNode(type, asShader=1)&lt;br /&gt; shadingNode2 = cmds.sets(renderable=1, noSurfaceShader = 1, empty=1, name=shadingNode1+"SG")&lt;br /&gt; cmds.connectAttr(shadingNode1+".outColor", shadingNode2 + ".surfaceShader", force=1)&lt;br /&gt; #steps to modify material attributes&lt;br /&gt; cmds.setAttr(shadingNode1 + ".color", color[0],color[1], color[2]) #color in r g b values&lt;br /&gt; cmds.setAttr(shadingNode1 + ".transparency", transparency, transparency, transparency)&lt;br /&gt; &lt;br /&gt; return shadingNode2&lt;br /&gt; &lt;br /&gt;def applyShaderOnObject(obj, shader):&lt;br /&gt; cmds.sets(obj, e=1, forceElement=shader)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class Agent:&lt;br /&gt; def __init__(self, solver, role, position=(0,0,0), size=(3,3,3), color=(0,0,0), objType="cube", rigidType="active", bounciness=.6, collide=1):&lt;br /&gt;  #set agent atributes&lt;br /&gt;  self.bounciness = bounciness&lt;br /&gt;  self.collide = collide&lt;br /&gt;  self.rigidType = rigidType&lt;br /&gt;  self.solver=solver&lt;br /&gt;  self.role = role&lt;br /&gt;  self.initialScale = size&lt;br /&gt;  #create the agent and scale it&lt;br /&gt;  self.object = cmds.polyCube(ax=(0,0,1))&lt;br /&gt;  cmds.scale(size[0], size[1], size[2])&lt;br /&gt;  #apply a color to the agent&lt;br /&gt;  #set the object color&lt;br /&gt;  sh = createShader(color, transparency=0, type="lambert")&lt;br /&gt;  applyShaderOnObject(self.object[0], sh)&lt;br /&gt;  &lt;br /&gt;  #create the rigid body&lt;br /&gt;  self.rigid = cmds.rigidBody(self.object,&lt;br /&gt;         name=self.object[0] + "_rigid",&lt;br /&gt;         p=position,&lt;br /&gt;         b=self.bounciness,&lt;br /&gt;         impulse=(0,0,0),&lt;br /&gt;         sio=objType, #stand in object&lt;br /&gt;         cc = 1, #contact count&lt;br /&gt;         cp = 1, #contact position&lt;br /&gt;         cn = 1, #contact name&lt;br /&gt;         solver=self.solver)&lt;br /&gt;         &lt;br /&gt;  #add attribute to the rigid body to store the type of agent&lt;br /&gt;  cmds.select(self.rigid, r=1)&lt;br /&gt;  cmds.addAttr(ln="role", dt="string", keyable=1)&lt;br /&gt;  cmds.setAttr(self.rigid + ".role", "good", type="string")&lt;br /&gt;&lt;br /&gt;  if self.rigidType == "active":&lt;br /&gt;   cmds.setAttr(self.rigid + ".active", 1)&lt;br /&gt;  else:&lt;br /&gt;   cmds.setAttr(self.rigid + ".active", 0)&lt;br /&gt;   &lt;br /&gt;  #apply the expression&lt;br /&gt;  self.applyExpression()&lt;br /&gt; &lt;br /&gt; def applyExpression(self):&lt;br /&gt;  "Function to apply the expression to the agent"&lt;br /&gt;  #first disconnect the rotation attributes because we want to controll it via expressions&lt;br /&gt;  cmds.disconnectAttr (self.rigid + "ry.output", self.object[0] + ".rotateY")&lt;br /&gt;  cmds.disconnectAttr (self.rigid + "rx.output", self.object[0] +  ".rotateX")&lt;br /&gt;  cmds.disconnectAttr (self.rigid + "rz.output", self.object[0] + ".rotateZ")&lt;br /&gt;  # Create expression for VehicleF with a random multiplier added to the expression.&lt;br /&gt;  randX = random.uniform(-3,3)&lt;br /&gt;  randY = random.uniform(3,-3)&lt;br /&gt;  ####COMPOSE THE EXPRESSION STRING&lt;br /&gt;  #this is how it should look like (in MEL)&lt;br /&gt;  '''&lt;br /&gt;  // Set wander motion of vehicle and add random multipliers.&lt;br /&gt;  pCube1_rigid_0.impulseX = sin(time * -2.808801);&lt;br /&gt;  pCube1_rigid_0.impulseY = (noise(time) * -1.041035);&lt;br /&gt;&lt;br /&gt;  // Set orientation of Vehicle according to the velocity direction.&lt;br /&gt;  float $fVel[];&lt;br /&gt;  $fVel  = `getAttr pCube1_rigid_0.velocity`;&lt;br /&gt;&lt;br /&gt;  pCube1.rotateX = 0;&lt;br /&gt;  pCube1.rotateZ = atan2d( $fVel[0], $fVel[1] );&lt;br /&gt;  pCube1.rotateY = 0;&lt;br /&gt;  &lt;br /&gt;  //checking bumps on other agents&lt;br /&gt;  string $lastHit;&lt;br /&gt;  if (pCube1_rigid_0.contactCount &gt; 0){&lt;br /&gt;   int $contactCount = `getAttr pCube1_rigid_0.contactCount`;&lt;br /&gt;   $lastHit = `getAttr pCube1_rigid_0.contactName[0]`;&lt;br /&gt;   string $rigid = "pCube1_rigid_0";&lt;br /&gt;   string $rigid01 = "pSphere1_rigid_0";&lt;br /&gt;   python("hit('"+$lastHit+"', '"+ $rigid +"','"+rigid01+"')");&lt;br /&gt;  };//endif&lt;br /&gt;  '''&lt;br /&gt;  #now put the text above in a python string&lt;br /&gt;  #the first lines define how the agent will wander&lt;br /&gt;  expString = "// Set wander motion of vehicle and add random multipliers.\n"&lt;br /&gt;  expString += "%s.impulseX" % self.rigid&lt;br /&gt;  expString += " = sin(time * %f);\n" % randX&lt;br /&gt;  expString += "%s.impulseY" % self.rigid&lt;br /&gt;  expString += " = (noise(time) * %f);\n\n" % randY&lt;br /&gt;  #the second part, how it rotates according to the direction it is going (velocity vector)&lt;br /&gt;  expString += "// Set orientation of Vehicle according to the velocity direction.\n"&lt;br /&gt;  expString += "float $fVel[];\n"&lt;br /&gt;  expString += "$fVel  = `getAttr %s.velocity`;\n\n" % (self.rigid)&lt;br /&gt;  expString += "%s.rotateX = 0;\n" % self.object[0]&lt;br /&gt;  expString += "%s.rotateZ = atan2d( $fVel[0], $fVel[1] );\n" % (self.object[0])&lt;br /&gt;  expString += "%s.rotateY = 0;\n\n" % self.object[0]&lt;br /&gt;  #the third part, checking bumps on other agents&lt;br /&gt;  expString += "//checking bumps on other agents\n"&lt;br /&gt;  expString += "string $lastHit;\n"&lt;br /&gt;  expString += "if (%s.contactCount &gt; 0){\n" % self.rigid&lt;br /&gt;  expString += "  int $contactCount = `getAttr %s.contactCount`;\n" % self.rigid&lt;br /&gt;  expString += "  $lastHit = `getAttr %s.contactName[0]`;\n" %self.rigid&lt;br /&gt;  expString += '  string $rigid = "%s";\n' % self.rigid&lt;br /&gt;  expString += '  string $rigid01 = "%s";\n' % self.rigid&lt;br /&gt;  expString += '  string $rigid02 = "%s";\n' % self.rigid&lt;br /&gt;  expString += '  python("hit(\'"+$lastHit+"\', \'"+ $rigid +"\',\'"+ $rigid01 +"\',\'"+ $rigid02 +"\')");\n'&lt;br /&gt;  expString += "};//endif\n"&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;  self.expString = expString&lt;br /&gt;  cmds.expression(s=expString)  &lt;br /&gt;  &lt;br /&gt;class Goodobj:&lt;br /&gt; def __init__(self, solver, role, position=(0,0,0), size=(3,3,3), color=(0,0,0), objType="cube", rigidType="active", bounciness=.6, collide=1):&lt;br /&gt;  #set Goodobj atributes&lt;br /&gt;  self.bounciness = bounciness&lt;br /&gt;  self.collide = collide&lt;br /&gt;  self.rigidType = rigidType&lt;br /&gt;  self.solver=solver&lt;br /&gt;  self.role = role&lt;br /&gt;  self.initialScale = size&lt;br /&gt;  #create the agent and scale it&lt;br /&gt;  self.object = cmds.polySphere(ax=(0,0,1))&lt;br /&gt;  cmds.scale(size[0], size[1], size[2])&lt;br /&gt;  #apply a color to the agent&lt;br /&gt;  #set the object color&lt;br /&gt;  sh = createShader(color, transparency=0, type="lambert")&lt;br /&gt;  applyShaderOnObject(self.object[0], sh)&lt;br /&gt;  &lt;br /&gt;  #create the rigid body&lt;br /&gt;  self.rigid01 = cmds.rigidBody(self.object,&lt;br /&gt;         name=self.object[0] + "_rigid",&lt;br /&gt;         p=position,&lt;br /&gt;         b=self.bounciness,&lt;br /&gt;         impulse=(0,0,0),&lt;br /&gt;         sio=objType, #stand in object&lt;br /&gt;         cc = 1, #contact count&lt;br /&gt;         cp = 1, #contact position&lt;br /&gt;         cn = 1, #contact name&lt;br /&gt;         solver=self.solver)&lt;br /&gt;         &lt;br /&gt;  #add attribute to the rigid body to store the type of agent&lt;br /&gt;  cmds.select(self.rigid01, r=1)&lt;br /&gt;  cmds.addAttr(ln="role", dt="string", keyable=1)&lt;br /&gt;  cmds.setAttr(self.rigid01 + ".role", "good", type="string")&lt;br /&gt;&lt;br /&gt;  if self.rigidType == "active":&lt;br /&gt;   cmds.setAttr(self.rigid01 + ".active", 1)&lt;br /&gt;  else:&lt;br /&gt;   cmds.setAttr(self.rigid01 + ".active", 0)&lt;br /&gt;&lt;br /&gt;   &lt;br /&gt;class Badobj:&lt;br /&gt; def __init__(self, solver, role, position=(0,0,0), size=(3,3,3), color=(0,0,0), objType="cube", rigidType="active", bounciness=.6, collide=1):&lt;br /&gt;  #set Goodobj atributes&lt;br /&gt;  self.bounciness = bounciness&lt;br /&gt;  self.collide = collide&lt;br /&gt;  self.rigidType = rigidType&lt;br /&gt;  self.solver=solver&lt;br /&gt;  self.role = role&lt;br /&gt;  self.initialScale = size&lt;br /&gt;  #create the agent and scale it&lt;br /&gt;  self.object = cmds.polyCone(ax=(0,0,1))&lt;br /&gt;  cmds.scale(size[0], size[1], size[2])&lt;br /&gt;  #apply a color to the agent&lt;br /&gt;  #set the object color&lt;br /&gt;  sh = createShader(color, transparency=0, type="lambert")&lt;br /&gt;  applyShaderOnObject(self.object[0], sh)&lt;br /&gt;  &lt;br /&gt;  #create the rigid body&lt;br /&gt;  self.rigid02 = cmds.rigidBody(self.object,&lt;br /&gt;         name=self.object[0] + "_rigid",&lt;br /&gt;         p=position,&lt;br /&gt;         b=self.bounciness,&lt;br /&gt;         impulse=(0,0,0),&lt;br /&gt;         sio=objType, #stand in object&lt;br /&gt;         cc = 1, #contact count&lt;br /&gt;         cp = 1, #contact position&lt;br /&gt;         cn = 1, #contact name&lt;br /&gt;         solver=self.solver)&lt;br /&gt;         &lt;br /&gt;  #add attribute to the rigid body to store the type of agent&lt;br /&gt;  cmds.select(self.rigid02, r=1)&lt;br /&gt;  cmds.addAttr(ln="role", dt="string", keyable=1)&lt;br /&gt;  cmds.setAttr(self.rigid02 + ".role", "good", type="string")&lt;br /&gt;&lt;br /&gt;  if self.rigidType == "active":&lt;br /&gt;   cmds.setAttr(self.rigid02 + ".active", 0)&lt;br /&gt;  else:&lt;br /&gt;   cmds.setAttr(self.rigid02 + ".active", 0)&lt;br /&gt;&lt;br /&gt;##############################################&lt;br /&gt;class Crowd:&lt;br /&gt; def __init__(self, numAgents=20, numGoodobjs=20, numBadobjs=20,minPosition=-70, maxPosition=70, walls=0):&lt;br /&gt;  #set the playback options to increase the time range&lt;br /&gt;  cmds.playbackOptions(min= 1, max=5000)&lt;br /&gt;  self.numAgents = numAgents&lt;br /&gt;  self.numGoodobjs= numGoodobjs&lt;br /&gt;  self.numBadobjs= numBadobjs&lt;br /&gt;  self.minPosition = minPosition&lt;br /&gt;  self.maxPosition = maxPosition&lt;br /&gt;  #get any selected objects&lt;br /&gt;  self.wallObjs = cmds.ls(sl=1)&lt;br /&gt;  #create the rigid solver&lt;br /&gt;  self.solver = self.createSolver()&lt;br /&gt;  #create the agents&lt;br /&gt;  self.createAgents()&lt;br /&gt;  #create the goodobjs&lt;br /&gt;  self.createGoodobj()&lt;br /&gt;  #create the badobjs&lt;br /&gt;  self.createBadobj()&lt;br /&gt;  #create the walls&lt;br /&gt;  if walls: self.makeWalls()&lt;br /&gt;  &lt;br /&gt; def createSolver(self):&lt;br /&gt;  solver = cmds.rigidSolver( create=1,&lt;br /&gt;            current=1,&lt;br /&gt;            name="crowdSolver",&lt;br /&gt;            velocityVectorScale=0.5,&lt;br /&gt;            displayVelocity=1,&lt;br /&gt;            sc=1, #showcollision&lt;br /&gt;            ctd=1 #contact data&lt;br /&gt;            )&lt;br /&gt;  cmds.setAttr(solver + ".allowDisconnection", 1)&lt;br /&gt;  return solver&lt;br /&gt;  &lt;br /&gt; def createAgents(self):&lt;br /&gt;  type = ["good", (3,3,3), (1,1,0)] #name, scale, color&lt;br /&gt;  self.goodAgents = []&lt;br /&gt;  for i in range(self.numAgents):&lt;br /&gt;   #get the agent type randomly&lt;br /&gt;   #get random x and y&lt;br /&gt;   x = random.uniform(self.minPosition,self.maxPosition)&lt;br /&gt;   y = random.uniform(self.minPosition,self.maxPosition)&lt;br /&gt;   #create the agents&lt;br /&gt;   a = Agent(self.solver, type[0], color=type[2], size=type[1], position=(x,y,0))&lt;br /&gt;&lt;br /&gt;   self.goodAgents.append(a)&lt;br /&gt; def createGoodobj(self):&lt;br /&gt;   type = ["good", (3,3,3), (1,0,0)] #name, scale, color&lt;br /&gt;   self.goodobjs = []&lt;br /&gt;   for i in range(self.numGoodobjs):&lt;br /&gt;    #get the agent type randomly&lt;br /&gt;    #get random x and y&lt;br /&gt;    x = random.uniform(self.minPosition,self.maxPosition)&lt;br /&gt;    y = random.uniform(self.minPosition,self.maxPosition)&lt;br /&gt;    #create the agents&lt;br /&gt;    a = Goodobj(self.solver, type[0], color=type[2], size=type[1], position=(x,y,0))&lt;br /&gt; &lt;br /&gt;    self.goodobjs.append(a)&lt;br /&gt;&lt;br /&gt; def createBadobj(self):&lt;br /&gt;   type = ["bad", (2,2,2), (0,0,0)] #name, scale, color&lt;br /&gt;   self.Badobjs = []&lt;br /&gt;   for i in range(self.numBadobjs):&lt;br /&gt;    #get the agent type randomly&lt;br /&gt;    #get random x and y&lt;br /&gt;    x = random.uniform(self.minPosition,self.maxPosition)&lt;br /&gt;    y = random.uniform(self.minPosition,self.maxPosition)&lt;br /&gt;    #create the agents&lt;br /&gt;    a = Badobj(self.solver, type[0], color=type[2], size=type[1], position=(x,y,0))&lt;br /&gt;    self.Badobjs.append(a)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; def makeWalls(self):&lt;br /&gt;  #get selected object,&lt;br /&gt;  #which should be already with its normals facing to the right directions,&lt;br /&gt;  #and convert it to passive rigid bodies&lt;br /&gt;  if len(self.wallObjs) == 0:&lt;br /&gt;   return "No wall objects were selected."&lt;br /&gt;  else:&lt;br /&gt;   for w in self.wallObjs:&lt;br /&gt;    self.wallRigid = cmds.rigidBody(w, passive=1, name= "wall_rigid", bounciness=.8)&lt;br /&gt;########################################&lt;br /&gt;c=Crowd(numAgents=2,numGoodobjs=10,numBadobjs=20,walls=1)&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-7585570500790088704?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/7585570500790088704/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/07/assignment-03-shi-xinyu-liu.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/7585570500790088704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/7585570500790088704'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/07/assignment-03-shi-xinyu-liu.html' title='Assignment 03   Shi xinyu &amp; Liu'/><author><name>Liu, Kocheng</name><uri>http://www.blogger.com/profile/06568145659726503765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_2gY_HsWGQR4/S2lJxVY9V0I/AAAAAAAAArI/ahtB3H3aRyc/S220/me1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-5365844242449932861</id><published>2009-07-27T23:45:00.005+02:00</published><updated>2009-07-27T23:57:25.651+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Shi'/><category scheme='http://www.blogger.com/atom/ns#' term='assignments'/><title type='text'>assignment 01B-Shi Xinyu</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/_rnqzRpyl1j4/Sm4gQtPqNBI/AAAAAAAAALs/atRWVftYlYQ/s1600-h/assignment+01c.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 400px; height: 339px;" src="http://1.bp.blogspot.com/_rnqzRpyl1j4/Sm4gQtPqNBI/AAAAAAAAALs/atRWVftYlYQ/s400/assignment+01c.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5363259677640111122" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre class="python" name="code"&gt;&lt;br /&gt;       ###############################################################&lt;br /&gt;## Assignment 01&lt;br /&gt;## Pof.Daniel da Rocha &lt;br /&gt;## Student.SHI Xinyu&lt;br /&gt;###############################################################&lt;br /&gt;&lt;br /&gt;# logic&lt;br /&gt;# 1) creste an initial square&lt;br /&gt;# 2) find these two points (pocA &amp; pocB) for rotate the square:&lt;br /&gt;#   1) get current line&lt;br /&gt;#  2) use pointOnCurve find the four points of the square&lt;br /&gt;#  3) use the formula to find the pocA or pocB&lt;br /&gt;#   1) if this is even number times, find pocA as rotation piont&lt;br /&gt;#   2) if this is odd number times, find pocB as rotation piont&lt;br /&gt;# 3) select the initail square&lt;br /&gt;# 4) copy &amp; rotate the square by pocA or pocB&lt;br /&gt;# 5) select the last square and run this again&lt;br /&gt;&lt;br /&gt;import maya.cmds as cmds&lt;br /&gt;&lt;br /&gt;# creating initial square&lt;br /&gt;mySquare = cmds.nurbsSquare(sl1=6,sl2=20)&lt;br /&gt;&lt;br /&gt;def realRecursionOpt2(iterations):&lt;br /&gt; #select mySquare  &lt;br /&gt; cmds.select( cl=1 ) &lt;br /&gt; cmds.select( mySquare )   &lt;br /&gt; mySquareNew = cmds.duplicate( mySquare )  &lt;br /&gt; &lt;br /&gt; sides = cmds.filterExpand( sm=9 )  &lt;br /&gt;   &lt;br /&gt; #create a list to store the positions  &lt;br /&gt; positions = []  &lt;br /&gt; for i in range( len(sides)  ):  &lt;br /&gt;     pos = cmds.pointPosition( sides[i] +".cv[0]" )  &lt;br /&gt;     positions.append(pos)  &lt;br /&gt; print positions&lt;br /&gt; &lt;br /&gt; Xa = ((positions[1][0] + positions[2][0])/2 + positions[0][0])/2&lt;br /&gt; Ya = ((positions[1][1] + positions[2][1])/2 + positions[0][1])/2&lt;br /&gt; Za = ((positions[1][2] + positions[2][2])/2 + positions[0][2])/2&lt;br /&gt; &lt;br /&gt; Xb = ((positions[1][0] + positions[2][0])/2 + positions[3][0])/2&lt;br /&gt; Yb = ((positions[1][1] + positions[2][1])/2 + positions[3][1])/2&lt;br /&gt; Zb = ((positions[1][2] + positions[2][2])/2 + positions[3][2])/2&lt;br /&gt; &lt;br /&gt; if iterations/2 ==0:&lt;br /&gt;  cmds.rotate( 0,0,30, pivot=(Xa, Ya, Za) )&lt;br /&gt; else:&lt;br /&gt;  cmds.rotate( 0,0,30, pivot=(Xb, Yb, Zb) )&lt;br /&gt;  &lt;br /&gt; mySquare = mySquareNew&lt;br /&gt;&lt;br /&gt; #recursion part&lt;br /&gt; if iterations ==0:&lt;br /&gt;  return "Done"&lt;br /&gt; else:&lt;br /&gt;  iterations -=1&lt;br /&gt;  realRecursionOpt2(iterations)&lt;br /&gt;&lt;br /&gt;realRecursionOpt2(1)&lt;br /&gt;    &lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-5365844242449932861?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/5365844242449932861/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/07/assignment-01b-shi-xinyu.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/5365844242449932861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/5365844242449932861'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/07/assignment-01b-shi-xinyu.html' title='assignment 01B-Shi Xinyu'/><author><name>SHI</name><uri>http://www.blogger.com/profile/15369141728731220921</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='22' src='http://1.bp.blogspot.com/_rnqzRpyl1j4/STJsXKRUqLI/AAAAAAAAAGw/OUiufM2sYXI/S220/1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_rnqzRpyl1j4/Sm4gQtPqNBI/AAAAAAAAALs/atRWVftYlYQ/s72-c/assignment+01c.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-6107846917383213100</id><published>2009-07-21T01:53:00.002+02:00</published><updated>2009-07-21T01:56:20.884+02:00</updated><title type='text'>Assignment 03 B - second try</title><content type='html'>This is what should be our assignment. The error is the same like in the previous script. Here we added more pavilions and a field for each pavilion and we connected the elements.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="python" name="code"&gt;&lt;br /&gt;&lt;br /&gt;###############crowd system&lt;br /&gt;###Assignment 03B&lt;br /&gt;&lt;br /&gt;#generate random static attractors&lt;br /&gt;#generate random static repulsors&lt;br /&gt;#generate random dynamic principle attractors&lt;br /&gt;#generate random dynamic followers&lt;br /&gt;&lt;br /&gt;#&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;import maya.cmds as cmds&lt;br /&gt;from random import *&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class Crowd:&lt;br /&gt; def __init__(self):&lt;br /&gt;  "Initialize attributes"&lt;br /&gt;  #objects for obstacles&lt;br /&gt;  self.collectObjects = []&lt;br /&gt;  #number of vehicles&lt;br /&gt;  self.vNumber = 0&lt;br /&gt;  #boolean for obstacles&lt;br /&gt;  self.obst = 0&lt;br /&gt;  #boolean for global forces&lt;br /&gt;  self.gforces = 0&lt;br /&gt;  #dictionary for UI elements&lt;br /&gt;  self.UIelements = {}&lt;br /&gt;  #set timeline&lt;br /&gt;  cmds.playbackOptions(min= 1, max=1000)&lt;br /&gt;  #get selected objects&lt;br /&gt;  self.collectObjects = cmds.ls(sl=1)&lt;br /&gt;  #start UI&lt;br /&gt;  self.crowdSystemUI()&lt;br /&gt;&lt;br /&gt; def crowdSystemUI(self):&lt;br /&gt;  "Assembles and displays the UI for the Crowd System"&lt;br /&gt;  self.UIelements["window"] = cmds.window(title="Crowd System",&lt;br /&gt;            widthHeight=(300, 200)&lt;br /&gt;            )&lt;br /&gt;  &lt;br /&gt;  self.UIelements["form"] = cmds.formLayout()&lt;br /&gt;  txt = cmds.text(label="Number of Vehicles")&lt;br /&gt;  collection = cmds.radioCollection()&lt;br /&gt;  radiob1 = cmds.radioButton(label="10", data=1, changeCommand=self.changeVnumber)&lt;br /&gt;  radiob2 = cmds.radioButton(label="20", onCommand="vNumber = 20")&lt;br /&gt;  cmds.setParent(upLevel=1)&lt;br /&gt;  cmds.setParent(upLevel=1)&lt;br /&gt;&lt;br /&gt;  txtOB = cmds.text(label="Obstacles")&lt;br /&gt;  collection2 = cmds.radioCollection()&lt;br /&gt;  radiob3 = cmds.radioButton(label="On", changeCommand=self.changeObst)&lt;br /&gt;  radiob4 = cmds.radioButton(label="Off")&lt;br /&gt;  cmds.setParent(upLevel=1)&lt;br /&gt;  cmds.setParent(upLevel=1)&lt;br /&gt;&lt;br /&gt;  txtGF = cmds.text( label = "Global Forces")&lt;br /&gt;  collection3 = cmds.radioCollection()&lt;br /&gt;  radiob5 = cmds.radioButton(label= "On" ,changeCommand =self.changeGforces)&lt;br /&gt;  radiob6 = cmds.radioButton(label="Off")&lt;br /&gt;  cmds.setParent(upLevel=1)&lt;br /&gt;  cmds.setParent(upLevel=1)&lt;br /&gt;&lt;br /&gt;  cmds.radioCollection(collection, edit=1, select=radiob1)&lt;br /&gt;  cmds.radioCollection(collection2, edit=1, select=radiob4)&lt;br /&gt;  cmds.radioCollection(collection3, edit=1, select=radiob6)&lt;br /&gt;&lt;br /&gt;  # Place Vehicle options&lt;br /&gt;  form = self.UIelements["form"]&lt;br /&gt;  cmds.formLayout(form,&lt;br /&gt;      edit=1,&lt;br /&gt;      attachForm= [&lt;br /&gt;         ( txt, "top", 20),&lt;br /&gt;         (txt ,"left", 70),&lt;br /&gt;         (radiob1,"top", 10),&lt;br /&gt;         (radiob1,"left", 20),&lt;br /&gt;         (radiob2,"top", 30),&lt;br /&gt;         (radiob2,"left", 20)&lt;br /&gt;         ]&lt;br /&gt;      )&lt;br /&gt;  # Place environment options&lt;br /&gt;  cmds.formLayout(form,&lt;br /&gt;      edit=1,&lt;br /&gt;      attachForm= [&lt;br /&gt;         (txtOB, "top", 80),&lt;br /&gt;         (txtOB, "left", 80),&lt;br /&gt;         (radiob3, "top", 80),&lt;br /&gt;         (radiob3, "left", 150),&lt;br /&gt;         (radiob4 ,"top", 80),&lt;br /&gt;         (radiob4, "left", 190),&lt;br /&gt;         (txtGF, "top", 110),&lt;br /&gt;         (txtGF, "left", 63),&lt;br /&gt;         (radiob5, "top", 110),&lt;br /&gt;         (radiob5, "left", 150),&lt;br /&gt;         (radiob6, "top", 110),&lt;br /&gt;         (radiob6, "left", 190)&lt;br /&gt;         ]&lt;br /&gt;      )&lt;br /&gt;  # Create buttons&lt;br /&gt;  button1 = cmds.button(label = "Create")&lt;br /&gt;  button2 = cmds.button(label = "Cancel")&lt;br /&gt;&lt;br /&gt;  # Place buttons in the window&lt;br /&gt;  cmds.formLayout(form,&lt;br /&gt;      edit=1,&lt;br /&gt;      attachForm =[&lt;br /&gt;         (button1, "bottom", 10),&lt;br /&gt;         (button1, "left", 185),&lt;br /&gt;         (button2, "bottom", 10),&lt;br /&gt;         (button2, "right", 10)&lt;br /&gt;         ]&lt;br /&gt;      )&lt;br /&gt;  # Add the commands to the buttons.&lt;br /&gt;  cmds.button(button1, edit=1, command=self.createCrowd )&lt;br /&gt;  cmds.button(button2, edit=1, command=self.deleteUI )&lt;br /&gt;  &lt;br /&gt;  cmds.showWindow(self.UIelements["window"])&lt;br /&gt; ## UI help functions&lt;br /&gt; def changeVnumber(self, *args):&lt;br /&gt;  if args[0] == "true":&lt;br /&gt;   self.vNumber = 10&lt;br /&gt;  else:&lt;br /&gt;   self.vNumber = 20&lt;br /&gt;  print "vNumber:",self.vNumber &lt;br /&gt; def changeObst(self, *args):&lt;br /&gt;  if args[0] == "true":&lt;br /&gt;   self.obst = 1&lt;br /&gt;  else:&lt;br /&gt;   self.obst = 0&lt;br /&gt;  print "Obst:", self.obst&lt;br /&gt; def changeGforces(self, *args):&lt;br /&gt;  if args[0] == "true":&lt;br /&gt;   self.gforces = 1&lt;br /&gt;  else:&lt;br /&gt;   self.gforces = 0&lt;br /&gt;  print "gforces:", self.gforces&lt;br /&gt; def deleteUI(self, *args):&lt;br /&gt;  cmds.deleteUI(self.UIelements["window"])&lt;br /&gt;  self.UIelements["window"] = ""&lt;br /&gt;&lt;br /&gt; ## MAIN METHODS&lt;br /&gt; def createCrowdSolver(self):&lt;br /&gt;  "Creates the main rigidSolver for the elements in the Crowd System"&lt;br /&gt;  self.crowdSolver = cmds.rigidSolver( create=1, &lt;br /&gt;            current=1,&lt;br /&gt;            name="crowdSolver",&lt;br /&gt;            velocityVectorScale=0.5,&lt;br /&gt;            displayVelocity=1&lt;br /&gt;            )&lt;br /&gt;  cmds.setAttr(self.crowdSolver + ".allowDisconnection", 1)&lt;br /&gt;  &lt;br /&gt; def createVehicle(self, vType, N):&lt;br /&gt;  "Creates one vehicle and add fields and expressions to it."&lt;br /&gt;  #first verify if the vehicle is of type follower (F) or leader (L)&lt;br /&gt;  #and set the size of the cube according to the type (leaders are bigger! :)&lt;br /&gt;  if vType == "P1":&lt;br /&gt;   w = 70  #width&lt;br /&gt;   h = 70#height&lt;br /&gt;   d = 70  #depth&lt;br /&gt;  if vType == "P2":&lt;br /&gt;   w = 100 #width&lt;br /&gt;   h = 100 #height&lt;br /&gt;   d = 100 #depth&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;  if vType == "F1":&lt;br /&gt;   w = 2  #width&lt;br /&gt;   h = 2 #height&lt;br /&gt;   d = 2  #depth&lt;br /&gt;  if vType == "F2":&lt;br /&gt;   w = 2  #width&lt;br /&gt;   h = 4   #height&lt;br /&gt;   d = 2  #depth&lt;br /&gt;  if vType == "F3":&lt;br /&gt;   w = 2  #width&lt;br /&gt;   h = 6   #height&lt;br /&gt;   d = 2  #depth&lt;br /&gt;   &lt;br /&gt;  if vType == "L1":&lt;br /&gt;   w = 5  #width&lt;br /&gt;   h = 3  #height&lt;br /&gt;   d = 5  #depth&lt;br /&gt;  if vType == "L2":&lt;br /&gt;   w = 5  #width&lt;br /&gt;   h = 5   #height&lt;br /&gt;   d = 5  #depth  &lt;br /&gt;  else:&lt;br /&gt;   w = 5&lt;br /&gt;   h = 7&lt;br /&gt;   d = 5&lt;br /&gt;  &lt;br /&gt;  #creates the basic cube&lt;br /&gt;  vehicle = cmds.polyCube(w=w,d=d,h=h)&lt;br /&gt;  &lt;br /&gt;  #creates the pavilion&lt;br /&gt;  pavilion1 = cmds.polyCube(w=w,d=d,h=h)&lt;br /&gt;  pavilion2 = cmds.polyCube(w=w,d=d,h=h)&lt;br /&gt;  &lt;br /&gt;  #create a vehicule force to the agent - force 1&lt;br /&gt;  field1=cmds.radial(position=[0,0,0], &lt;br /&gt;         magnitude=50,&lt;br /&gt;         attenuation = 0.3,&lt;br /&gt;         maxDistance = 8.0&lt;br /&gt;         )&lt;br /&gt;         &lt;br /&gt;  cmds.parent(field1[0], vehicle[0])&lt;br /&gt;  cmds.hide(field1)&lt;br /&gt;  &lt;br /&gt;  if vType=="L1":&lt;br /&gt;   Lfield1 = cmds.radial(position=[0,0,0],&lt;br /&gt;         magnitude=-1,&lt;br /&gt;         attenuation=.2,&lt;br /&gt;         maxDistance=50&lt;br /&gt;         )&lt;br /&gt;         &lt;br /&gt;   cmds.parent(Lfield1[0], vehicle[0])&lt;br /&gt;   cmds.hide(Lfield1)&lt;br /&gt;   &lt;br /&gt;  #create a vehicule force to the agent - force 2&lt;br /&gt;  field2=cmds.radial(position=[0,0,0], &lt;br /&gt;         magnitude=50,&lt;br /&gt;         attenuation = 0.3,&lt;br /&gt;         maxDistance = 8.0&lt;br /&gt;         )&lt;br /&gt;         &lt;br /&gt;  cmds.parent(field2[0], vehicle[0])&lt;br /&gt;  cmds.hide(field2)&lt;br /&gt;  &lt;br /&gt;  if vType=="L2":&lt;br /&gt;   Lfield2 = cmds.radial(position=[0,0,0],&lt;br /&gt;         magnitude=-1,&lt;br /&gt;         attenuation=.2,&lt;br /&gt;         maxDistance=50&lt;br /&gt;         )&lt;br /&gt;         &lt;br /&gt;   cmds.parent(Lfield2[0], vehicle[0])&lt;br /&gt;   cmds.hide(Lfield2)&lt;br /&gt;   &lt;br /&gt;  #create a vehicule force to the agent - force 3&lt;br /&gt;  field3=cmds.radial(position=[0,0,0], &lt;br /&gt;         magnitude=50,&lt;br /&gt;         attenuation = 0.3,&lt;br /&gt;         maxDistance = 8.0&lt;br /&gt;         )&lt;br /&gt;         &lt;br /&gt;  cmds.parent(field3[0], vehicle[0])&lt;br /&gt;  cmds.hide(field3)&lt;br /&gt;  &lt;br /&gt;  if vType=="L3":&lt;br /&gt;   Lfield3 = cmds.radial(position=[0,0,0],&lt;br /&gt;         magnitude=-1,&lt;br /&gt;         attenuation=.2,&lt;br /&gt;         maxDistance=50&lt;br /&gt;         )&lt;br /&gt;         &lt;br /&gt;   cmds.parent(Lfield3[0], vehicle[0])&lt;br /&gt;   cmds.hide(Lfield3)&lt;br /&gt;  &lt;br /&gt;  #create a static force to the agent - force 4&lt;br /&gt;  field4=cmds.radial(position=[0,0,0], &lt;br /&gt;         magnitude=50,&lt;br /&gt;         attenuation = 0.3,&lt;br /&gt;         maxDistance = 8.0&lt;br /&gt;         )&lt;br /&gt;         &lt;br /&gt;  cmds.parent(field4[0], pavilion1[0])&lt;br /&gt;  cmds.hide(field4)&lt;br /&gt;  &lt;br /&gt;  if vType=="P1":&lt;br /&gt;   Lfield4 = cmds.radial(position=[0,0,0],&lt;br /&gt;         magnitude=-1,&lt;br /&gt;         attenuation=.2,&lt;br /&gt;         maxDistance=70&lt;br /&gt;         )&lt;br /&gt;         &lt;br /&gt;   cmds.parent(Lfield4[0], pavilion1[0])&lt;br /&gt;   cmds.hide(Lfield4)&lt;br /&gt; &lt;br /&gt;  #create a static force to the agent - force 5&lt;br /&gt;  field5=cmds.radial(position=[0,0,0], &lt;br /&gt;         magnitude=50,&lt;br /&gt;         attenuation = 0.3,&lt;br /&gt;         maxDistance = 8.0&lt;br /&gt;         )&lt;br /&gt;         &lt;br /&gt;  cmds.parent(field5[0], pavilion2[0])&lt;br /&gt;  cmds.hide(field5)&lt;br /&gt;  &lt;br /&gt;  if vType=="P2":&lt;br /&gt;   Lfield5 = cmds.radial(position=[0,0,0],&lt;br /&gt;         magnitude=-1,&lt;br /&gt;         attenuation=.2,&lt;br /&gt;         maxDistance=100&lt;br /&gt;         )&lt;br /&gt;         &lt;br /&gt;   cmds.parent(Lfield5[0], pavilion2[0])&lt;br /&gt;   cmds.hide(Lfield5)&lt;br /&gt; &lt;br /&gt;   &lt;br /&gt;  #convert vehicle to a rigid body with random placement &lt;br /&gt;  rigid = cmds.rigidBody(&lt;br /&gt;     vehicle[0],&lt;br /&gt;     n="rigidVeh1%s%d" %(vType, N),&lt;br /&gt;     active=1,&lt;br /&gt;     mass=1,&lt;br /&gt;     bounciness=0,&lt;br /&gt;     damping=1.5,&lt;br /&gt;     position=(uniform(-70,70),uniform(-70,70),0),&lt;br /&gt;     impulse=(0,0,0),&lt;br /&gt;     standInObject="cube",&lt;br /&gt;     solver=self.crowdSolver&lt;br /&gt;     )&lt;br /&gt;     &lt;br /&gt;  #convert pavillion1 to a passive rigid body with random placement&lt;br /&gt;  rigid = cmds.rigidBody(&lt;br /&gt;     pavilion1[0],&lt;br /&gt;     n="rigidVeh1%s%d" %(vType, N),&lt;br /&gt;     active=0,&lt;br /&gt;     mass=1,&lt;br /&gt;     bounciness=0,&lt;br /&gt;     damping=1.5,&lt;br /&gt;     position=(uniform(-70,70),uniform(-70,70),0),&lt;br /&gt;     impulse=(0,0,0),&lt;br /&gt;     standInObject="cube",&lt;br /&gt;     solver=self.crowdSolver&lt;br /&gt;     )&lt;br /&gt;     &lt;br /&gt;  #convert pavillion2 to a passive rigid body with random placement&lt;br /&gt;  rigid = cmds.rigidBody(&lt;br /&gt;     pavilion2[0],&lt;br /&gt;     n="rigidVeh1%s%d" %(vType, N),&lt;br /&gt;     active=0,&lt;br /&gt;     mass=1,&lt;br /&gt;     bounciness=0,&lt;br /&gt;     damping=1.5,&lt;br /&gt;     position=(uniform(-70,70),uniform(-70,70),0),&lt;br /&gt;     impulse=(0,0,0),&lt;br /&gt;     standInObject="cube",&lt;br /&gt;     solver=self.crowdSolver&lt;br /&gt;     )&lt;br /&gt;     &lt;br /&gt;  #disconnect the rotation attributes of the vehicle&lt;br /&gt;  cmds.disconnectAttr(rigid + "rx.output", vehicle[0]+".rx")&lt;br /&gt;  cmds.disconnectAttr(rigid + "ry.output", vehicle[0]+".ry")&lt;br /&gt;  cmds.disconnectAttr(rigid + "rz.output", vehicle[0]+".rz")&lt;br /&gt;  &lt;br /&gt;  #add expression for movement&lt;br /&gt;  randX = uniform(-3,3)&lt;br /&gt;  randY = uniform(-3,3)&lt;br /&gt;  &lt;br /&gt;  expString = "%s.impulseX = sin(time * %f);" % (rigid, randX)&lt;br /&gt;  expString += "%s.impulseY = (noise(time)*%f);" % (rigid, randY)&lt;br /&gt;  expString += "float $Vel[] = `getAttr %s.velocity`;" % rigid&lt;br /&gt;  expString += "%s.rotateX = 0;" % vehicle[0]&lt;br /&gt;  expString += "%s.rotateY = 0;" % vehicle[0]&lt;br /&gt;  expString += "%s.rotateZ = atan2d( $Vel[0], $Vel[2] );" % vehicle[0]&lt;br /&gt;  &lt;br /&gt;  cmds.expression(s=expString)&lt;br /&gt;  &lt;br /&gt;  if vType == "F1":&lt;br /&gt;   return [rigid, field] #returns the name of the function&lt;br /&gt;   &lt;br /&gt;  else:&lt;br /&gt;   return[rigid, field, Lfield1]&lt;br /&gt;  &lt;br /&gt;  if vType == "F2":&lt;br /&gt;   return [rigid, field] #returns the name of the function&lt;br /&gt;   &lt;br /&gt;  else:&lt;br /&gt;   return[rigid, field, Lfield2] &lt;br /&gt;   &lt;br /&gt;  if vType == "F3":&lt;br /&gt;   return [rigid, field] #returns the name of the function&lt;br /&gt;   &lt;br /&gt;  else:&lt;br /&gt;   return[rigid, field, Lfield3]&lt;br /&gt;   &lt;br /&gt; def createCrowd(self, *args):&lt;br /&gt;  "Method to assemble the whole system"&lt;br /&gt;  #creates a rigidSolver to add the vehicle to&lt;br /&gt;  self.createCrowdSolver()&lt;br /&gt;  #turn on the velocity arrow   &lt;br /&gt;  cmds.setAttr(self.crowdSolver + ".displayVelocity", 1)&lt;br /&gt;  cmds.setAttr(self.crowdSolver + ".scaleVelocity", .5)&lt;br /&gt;  &lt;br /&gt;  #allow disconnections on the rigidSolver&lt;br /&gt;  cmds.setAttr(self.crowdSolver + ".allowDisconnection", 1)&lt;br /&gt;  &lt;br /&gt;  ###create amount of agents&lt;br /&gt;  if self.vNumber == 10:&lt;br /&gt;   FNumber = 8&lt;br /&gt;   LNumber = 2&lt;br /&gt;  elif self.vNumber == 20:&lt;br /&gt;   FNumber=18&lt;br /&gt;   Lnumber=2&lt;br /&gt;   &lt;br /&gt;  &lt;br /&gt;  #create empty lists to store followers and leaders&lt;br /&gt;  followers1=[]&lt;br /&gt;  leaders1=[]&lt;br /&gt;  followers2=[]&lt;br /&gt;  leaders2=[]&lt;br /&gt;  followers3=[]&lt;br /&gt;  leaders3=[]&lt;br /&gt;  pavilions1=[]&lt;br /&gt;  pavilions2=[]&lt;br /&gt;  &lt;br /&gt;  #create the followers&lt;br /&gt;  for i in range(FNumber):&lt;br /&gt;   if i%3 == 0:&lt;br /&gt;    v=self.createVehicle("F1",i)&lt;br /&gt;    followers1.append(v)&lt;br /&gt;&lt;br /&gt;   if i%3 == 1:&lt;br /&gt;    v=self.createVehicle("F2",i)&lt;br /&gt;    followers2.append(v)&lt;br /&gt;&lt;br /&gt;   if i%3 == 2:&lt;br /&gt;    v=self.createVehicle("F3",i)&lt;br /&gt;    followers3.append(v)&lt;br /&gt;    &lt;br /&gt;  #create the leaders&lt;br /&gt;  for i in range(LNumber):&lt;br /&gt;   if i%3 == 0:&lt;br /&gt;    v=self.createVehicle("L1",i)&lt;br /&gt;    leaders1.append(v)&lt;br /&gt;&lt;br /&gt;   if i%3 == 1:&lt;br /&gt;    v=self.createVehicle("L2",i)&lt;br /&gt;    leaders2.append(v)&lt;br /&gt;&lt;br /&gt;   if i%3 == 2:&lt;br /&gt;    v=self.createVehicle("L3",i)&lt;br /&gt;    leaders3.append(v)&lt;br /&gt;&lt;br /&gt;  #create static attractor&lt;br /&gt;  for i in range(2):&lt;br /&gt;   if i%2 == 0:&lt;br /&gt;    v=self.createVehicle("P1",i)&lt;br /&gt;    pavilions1.append(v)&lt;br /&gt;&lt;br /&gt;   if i%2 == 1:&lt;br /&gt;    v=self.createVehicle("P2",i)&lt;br /&gt;    pavilions2.append(v)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;  cmds.polyCube( sx=10, sy=15, sz=5, h=20 )&lt;br /&gt;  #result is a 20 units height rectangular box&lt;br /&gt;  #with 10 subdivisions along X, 15 along Y and 20 along Z.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      &lt;br /&gt;   &lt;br /&gt;     &lt;br /&gt;  #CONNECT THE FIELDS TO THE RIGID BODIES(AGENTS)&lt;br /&gt;  #1) Connect the leaders with the followers 1-1&lt;br /&gt;  &lt;br /&gt;  for i in range(LNumber):&lt;br /&gt;   if i%3 == 0:&lt;br /&gt;    Lfield1=leaders1[i][2]&lt;br /&gt;    lfield1=leaders1[i][1]&lt;br /&gt;    for j in range (FNumber):&lt;br /&gt;     if j%3 == 0:&lt;br /&gt;      Frigid1 = followers1[j][0]&lt;br /&gt;      #connect the fields&lt;br /&gt;      cmds.connectDynamic(Frigid1, fields=Lfields)&lt;br /&gt;      cmds.connectDynamic(Frigid1, fields=lfields)&lt;br /&gt;     &lt;br /&gt;   if i%3 == 1:&lt;br /&gt;    Lfield2=leaders2[i][2]&lt;br /&gt;    lfield2=leaders2[i][1]&lt;br /&gt;    for j in range (FNumber):&lt;br /&gt;     if j%3 == 1:&lt;br /&gt;      Frigid1 = followers2[j][0]&lt;br /&gt;      #connect the fields&lt;br /&gt;      cmds.connectDynamic(Frigid2, fields=Lfields)&lt;br /&gt;      cmds.connectDynamic(Frigid2, fields=lfields)&lt;br /&gt;     &lt;br /&gt;   else:&lt;br /&gt;    Lfield3=leaders3[i][2]&lt;br /&gt;    lfield3=leaders3[i][1]&lt;br /&gt;    for j in range (FNumber):&lt;br /&gt;     if j%3 == 2:&lt;br /&gt;      Frigid3 = followers3[j][0]&lt;br /&gt;      #connect the fields&lt;br /&gt;      cmds.connectDynamic(Frigid3, fields=Lfields)&lt;br /&gt;      cmds.connectDynamic(Frigid3, fields=lfields)&lt;br /&gt;     &lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;  #2) Connect followers to leaders&lt;br /&gt;  for i in range(FNumber):&lt;br /&gt;   if i%3 == 0:&lt;br /&gt;    Ffield1 = followers1[i][1]&lt;br /&gt;    for j in range(LNumber):&lt;br /&gt;     if j%3 == 0:&lt;br /&gt;      Lrigid1 = leaders1[j][0]&lt;br /&gt;      cmds.connectDynamic(Lrigid1, fields=Ffield)&lt;br /&gt;      &lt;br /&gt;  &lt;br /&gt;   if i%3 == 1:&lt;br /&gt;    Ffield2 = followers2[i][1]&lt;br /&gt;    for j in range(LNumber):&lt;br /&gt;     if j%3 == 1:&lt;br /&gt;      Lrigid2 = leaders2[j][0]&lt;br /&gt;      cmds.connectDynamic(Lrigid2, fields=Ffield)&lt;br /&gt;    &lt;br /&gt;     else:&lt;br /&gt;     Ffield3 = followers3[i][1]&lt;br /&gt;     for j in range(LNumber):&lt;br /&gt;      if j%3 == 2:&lt;br /&gt;       Lrigid3 = leaders3[j][0]&lt;br /&gt;       cmds.connectDynamic(Lrigid3, fields=Ffield)&lt;br /&gt;     &lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;  #3) Connect leaders to leaders&lt;br /&gt;  for i in range (LNumber):&lt;br /&gt;   if i%3 == 0:&lt;br /&gt;    Lrigid1 = leaders1[i][0]&lt;br /&gt;    Lfield1 = leaders1[i][1]&lt;br /&gt;    for j in range(LNumber):&lt;br /&gt;     if i == f: continue&lt;br /&gt;     if j%3 == 0:&lt;br /&gt;      L1rigid = leaders1[j][0]&lt;br /&gt;      #l1field = leaders1[j][1]&lt;br /&gt;      cmds.connectDynamic(L1rigid, fields=Lfield)&lt;br /&gt;     &lt;br /&gt;   if i%3 == 1:&lt;br /&gt;    Lrigid2 = leaders2[i][0]&lt;br /&gt;    Lfield2 = leaders2[i][1]&lt;br /&gt;    for j in range(LNumber):&lt;br /&gt;     if i == f: continue&lt;br /&gt;     if j%3 == 1:&lt;br /&gt;      L1rigid = leaders2[j][0]&lt;br /&gt;      #l1field = leaders1[j][1]&lt;br /&gt;      cmds.connectDynamic(L1rigid, fields=Lfield)&lt;br /&gt;  &lt;br /&gt;   if i%3 == 2:&lt;br /&gt;    Lrigid3 = leaders3[i][0]&lt;br /&gt;    Lfield3 = leaders3[i][1]&lt;br /&gt;    for j in range(LNumber):&lt;br /&gt;     if i == f: continue&lt;br /&gt;     if j%3 == 2:&lt;br /&gt;      L1rigid = leaders3[j][0]&lt;br /&gt;      #l1field = leaders1[j][1]&lt;br /&gt;      cmds.connectDynamic(L1rigid, fields=Lfield)&lt;br /&gt;    &lt;br /&gt;  #4) Connect followers to followers&lt;br /&gt;  for i in range(FNumber):&lt;br /&gt;   if i%3 == 0:&lt;br /&gt;    Ffield1=followers1[i][1]&lt;br /&gt;    for j in range(FNumber):&lt;br /&gt;     if i==j: continue&lt;br /&gt;     if j%3 == 0:&lt;br /&gt;      Frigid1 = followers1[j][0]&lt;br /&gt;      &lt;br /&gt;      cmds.connectDynamics(Frigid1, fields=Ffield)&lt;br /&gt;   if i%3 == 1:&lt;br /&gt;    Ffield2=followers2[i][1]&lt;br /&gt;    for j in range(FNumber):&lt;br /&gt;     if i==j: continue&lt;br /&gt;     if j%3 == 1:&lt;br /&gt;      Frigid2 = followers2[j][0]&lt;br /&gt;      &lt;br /&gt;      cmds.connectDynamics(Frigid2, fields=Ffield)&lt;br /&gt;   else:&lt;br /&gt;    Ffield3=followers3[i][1]&lt;br /&gt;    for j in range(FNumber):&lt;br /&gt;     if i==j: continue&lt;br /&gt;     if j%3 == 2:&lt;br /&gt;      Frigid3 = followers3[j][0]&lt;br /&gt;      &lt;br /&gt;      cmds.connectDynamics(Frigid3, fields=Ffield)&lt;br /&gt;    &lt;br /&gt;  &lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;  #create obstacles if i want&lt;br /&gt;  if self.obst:self.collectObstacles()&lt;br /&gt; &lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;  #disable solver warnings&lt;br /&gt;  cmds.cycleCheck(e=0)  &lt;br /&gt;      &lt;br /&gt;  #disable solver warnings&lt;br /&gt;  cmds.cycleCheck(e=0)&lt;br /&gt;  &lt;br /&gt; def collectObstacles(self):&lt;br /&gt;  "Collects all obstacles"&lt;br /&gt;  if len(self.collectObjects) == 0:&lt;br /&gt;   #there is nothing selected&lt;br /&gt;   return "There is nothing selected!"&lt;br /&gt;   &lt;br /&gt;  for o in self.collectObjects:&lt;br /&gt;   cmds.rigidBody( o,&lt;br /&gt;       passive = 1,&lt;br /&gt;       name=o+"_rb",&lt;br /&gt;       bounciness=2.0)&lt;br /&gt;       &lt;br /&gt;#craete an instance for this class&lt;br /&gt;c=Crowd()&lt;br /&gt; &lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-6107846917383213100?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/6107846917383213100/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/07/assignment-03-b-second-try.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/6107846917383213100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/6107846917383213100'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/07/assignment-03-b-second-try.html' title='Assignment 03 B - second try'/><author><name>alexandra virlan</name><uri>http://www.blogger.com/profile/07826702946109365185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/-Kxco3AGM9F4/TVkNwXHhRCI/AAAAAAAAAbk/8dMS0nu4xvA/s220/60961_1579924174077_1114837832_31660390_6247364_n.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-3211366912442031139</id><published>2009-07-21T01:40:00.004+02:00</published><updated>2009-07-21T01:52:33.845+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='A+M'/><category scheme='http://www.blogger.com/atom/ns#' term='assignments'/><title type='text'>Assignment 03B - first try</title><content type='html'>In this script we tried to add pavilions(by script) and obstacles(manually in maya). It seams to be something wrong when we define the pavilions. Pavilions are static rigid bodies. The only difference between vehicles and pavilions is the varriable active, which is 0 for pavilions. It is a wrong way to define pavilions like that?&lt;br /&gt;&lt;br /&gt;&lt;pre class="python" name="code"&gt;&lt;br /&gt;#######################################################################################################&lt;br /&gt;##&lt;br /&gt;## CROWD SYSTEM&lt;br /&gt;## Adapted from original idea by Mark R. Wilkins and Chris Kazmier&lt;br /&gt;##&lt;br /&gt;## Modified: 22.06.09 by Daniel da Rocha&lt;br /&gt;##&lt;br /&gt;## Last Modified: 21.07.09 by  Alexandra Virlan and Mircea Mogan&lt;br /&gt;##&lt;br /&gt;#######################################################################################################&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;import maya.cmds as cmds&lt;br /&gt;from random import *&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class Crowd:&lt;br /&gt; def __init__(self):&lt;br /&gt;  "Initialize attributes"&lt;br /&gt;  #objects for obstacles&lt;br /&gt;  self.collectObjects = []&lt;br /&gt;  #number of vehicles&lt;br /&gt;  self.vNumber = 0&lt;br /&gt;  #boolean for obstacles&lt;br /&gt;  self.obst = 0&lt;br /&gt;  #boolean for global forces&lt;br /&gt;  self.gforces = 0&lt;br /&gt;  #dictionary for UI elements&lt;br /&gt;  self.UIelements = {}&lt;br /&gt;  #set timeline&lt;br /&gt;  cmds.playbackOptions(min= 1, max=1000)&lt;br /&gt;  #get selected objects&lt;br /&gt;  self.collectObjects = cmds.ls(sl=1)&lt;br /&gt;  #start UI&lt;br /&gt;  self.crowdSystemUI()&lt;br /&gt;&lt;br /&gt; def crowdSystemUI(self):&lt;br /&gt;  "Assembles and displays the UI for the Crowd System"&lt;br /&gt;  self.UIelements["window"] = cmds.window(title="Crowd System",&lt;br /&gt;            widthHeight=(300, 200)&lt;br /&gt;            )&lt;br /&gt;&lt;br /&gt;  self.UIelements["form"] = cmds.formLayout()&lt;br /&gt;  txt = cmds.text(label="Number of Vehicles")&lt;br /&gt;  collection = cmds.radioCollection()&lt;br /&gt;  radiob1 = cmds.radioButton(label="10", data=1, changeCommand=self.changeVnumber)&lt;br /&gt;  radiob2 = cmds.radioButton(label="20", onCommand="vNumber = 20")&lt;br /&gt;  cmds.setParent(upLevel=1)&lt;br /&gt;  cmds.setParent(upLevel=1)&lt;br /&gt;&lt;br /&gt;  txtOB = cmds.text(label="Obstacles")&lt;br /&gt;  collection2 = cmds.radioCollection()&lt;br /&gt;  radiob3 = cmds.radioButton(label="On", changeCommand=self.changeObst)&lt;br /&gt;  radiob4 = cmds.radioButton(label="Off")&lt;br /&gt;  cmds.setParent(upLevel=1)&lt;br /&gt;  cmds.setParent(upLevel=1)&lt;br /&gt;&lt;br /&gt;  txtGF = cmds.text( label = "Global Forces")&lt;br /&gt;  collection3 = cmds.radioCollection()&lt;br /&gt;  radiob5 = cmds.radioButton(label= "On" ,changeCommand =self.changeGforces)&lt;br /&gt;  radiob6 = cmds.radioButton(label="Off")&lt;br /&gt;  cmds.setParent(upLevel=1)&lt;br /&gt;  cmds.setParent(upLevel=1)&lt;br /&gt;&lt;br /&gt;  cmds.radioCollection(collection, edit=1, select=radiob1)&lt;br /&gt;  cmds.radioCollection(collection2, edit=1, select=radiob4)&lt;br /&gt;  cmds.radioCollection(collection3, edit=1, select=radiob6)&lt;br /&gt;&lt;br /&gt;  # Place Vehicle options&lt;br /&gt;  form = self.UIelements["form"]&lt;br /&gt;  cmds.formLayout(form,&lt;br /&gt;      edit=1,&lt;br /&gt;      attachForm= [&lt;br /&gt;         ( txt, "top", 20),&lt;br /&gt;         (txt ,"left", 70),&lt;br /&gt;         (radiob1,"top", 10),&lt;br /&gt;         (radiob1,"left", 20),&lt;br /&gt;         (radiob2,"top", 30),&lt;br /&gt;         (radiob2,"left", 20)&lt;br /&gt;         ]&lt;br /&gt;      )&lt;br /&gt;  # Place environment options&lt;br /&gt;  cmds.formLayout(form,&lt;br /&gt;      edit=1,&lt;br /&gt;      attachForm= [&lt;br /&gt;         (txtOB, "top", 80),&lt;br /&gt;         (txtOB, "left", 80),&lt;br /&gt;         (radiob3, "top", 80),&lt;br /&gt;         (radiob3, "left", 150),&lt;br /&gt;         (radiob4 ,"top", 80),&lt;br /&gt;         (radiob4, "left", 190),&lt;br /&gt;         (txtGF, "top", 110),&lt;br /&gt;         (txtGF, "left", 63),&lt;br /&gt;         (radiob5, "top", 110),&lt;br /&gt;         (radiob5, "left", 150),&lt;br /&gt;         (radiob6, "top", 110),&lt;br /&gt;         (radiob6, "left", 190)&lt;br /&gt;         ]&lt;br /&gt;      )&lt;br /&gt;  # Create buttons&lt;br /&gt;  button1 = cmds.button(label = "Create")&lt;br /&gt;  button2 = cmds.button(label = "Cancel")&lt;br /&gt;&lt;br /&gt;  # Place buttons in the window&lt;br /&gt;  cmds.formLayout(form,&lt;br /&gt;      edit=1,&lt;br /&gt;      attachForm =[&lt;br /&gt;         (button1, "bottom", 10),&lt;br /&gt;         (button1, "left", 185),&lt;br /&gt;         (button2, "bottom", 10),&lt;br /&gt;         (button2, "right", 10)&lt;br /&gt;         ]&lt;br /&gt;      )&lt;br /&gt;  # Add the commands to the buttons.&lt;br /&gt;  cmds.button(button1, edit=1, command=self.createCrowd )&lt;br /&gt;  cmds.button(button2, edit=1, command=self.deleteUI )&lt;br /&gt;&lt;br /&gt;  cmds.showWindow(self.UIelements["window"])&lt;br /&gt; ## UI help functions&lt;br /&gt; def changeVnumber(self, *args):&lt;br /&gt;  if args[0] == "true":&lt;br /&gt;   self.vNumber = 10&lt;br /&gt;  else:&lt;br /&gt;   self.vNumber = 20&lt;br /&gt;  print "vNumber:",self.vNumber&lt;br /&gt; def changeObst(self, *args):&lt;br /&gt;  if args[0] == "true":&lt;br /&gt;   self.obst = 1&lt;br /&gt;  else:&lt;br /&gt;   self.obst = 0&lt;br /&gt;  print "Obst:", self.obst&lt;br /&gt; def changeGforces(self, *args):&lt;br /&gt;  if args[0] == "true":&lt;br /&gt;   self.gforces = 1&lt;br /&gt;  else:&lt;br /&gt;   self.gforces = 0&lt;br /&gt;  print "gforces:", self.gforces&lt;br /&gt; def deleteUI(self, *args):&lt;br /&gt;  cmds.deleteUI(self.UIelements["window"])&lt;br /&gt;  self.UIelements["window"] = ""&lt;br /&gt;&lt;br /&gt; ## MAIN METHODS&lt;br /&gt; def createCrowdSolver(self):&lt;br /&gt;  "Creates the main rigidSolver for the elements in the Crowd System"&lt;br /&gt;  self.crowdSolver = cmds.rigidSolver( create=1,&lt;br /&gt;            current=1,&lt;br /&gt;            name="crowdSolver",&lt;br /&gt;            velocityVectorScale=0.5,&lt;br /&gt;            displayVelocity=1&lt;br /&gt;            )&lt;br /&gt;  cmds.setAttr(self.crowdSolver + ".allowDisconnection", 1)&lt;br /&gt;&lt;br /&gt; def createVehicle(self, vType, N):&lt;br /&gt;  "Creates one vehicle and add fields and expressions to it."&lt;br /&gt;  #first verify if the vehicle is of type follower (F) or leader (L)&lt;br /&gt;  #and set the size of the cube according to the type (leaders are bigger! :)&lt;br /&gt;  if vType == "F":&lt;br /&gt;   w = 2  #width&lt;br /&gt;   h = 2.5 #height&lt;br /&gt;   d = 2  #depth&lt;br /&gt;&lt;br /&gt;  if vType == "P":&lt;br /&gt;   w = 100 #width&lt;br /&gt;   h = 100 #height&lt;br /&gt;   d = 100 #depth&lt;br /&gt;&lt;br /&gt;  else:&lt;br /&gt;   w = 5&lt;br /&gt;   h = 3.5&lt;br /&gt;   d = 5&lt;br /&gt;&lt;br /&gt;  #creates the basic cube&lt;br /&gt;  vehicle = cmds.polyCube(w=w,d=d,h=h)&lt;br /&gt;  pavilion = cmds.polyCube(w=w,d=d,h=h)&lt;br /&gt;&lt;br /&gt;  #create a vehicule force to the agent&lt;br /&gt;  field=cmds.radial(position=[0,0,0],&lt;br /&gt;         magnitude=50,&lt;br /&gt;         attenuation = 0.3,&lt;br /&gt;         maxDistance = 8.0&lt;br /&gt;         )&lt;br /&gt;       &lt;br /&gt;  cmds.parent(field[0], vehicle[0])&lt;br /&gt;  cmds.parent(field[0], pavilion[0])&lt;br /&gt;  cmds.hide(field)&lt;br /&gt;&lt;br /&gt;  if vType=="L":&lt;br /&gt;   Lfield = cmds.radial(position=[0,0,0],&lt;br /&gt;         magnitude=-1,&lt;br /&gt;         attenuation=.2,&lt;br /&gt;         maxDistance=50&lt;br /&gt;         )&lt;br /&gt;       &lt;br /&gt;   cmds.parent(Lfield[0], vehicle[0])&lt;br /&gt;   cmds.hide(Lfield)&lt;br /&gt;&lt;br /&gt;  #convert it to a rigid body with random placement&lt;br /&gt;  rigid = cmds.rigidBody(&lt;br /&gt;     vehicle[0],&lt;br /&gt;     n="rigidVeh1%s%d" %(vType, N),&lt;br /&gt;     active=1,&lt;br /&gt;     mass=1,&lt;br /&gt;     bounciness=0,&lt;br /&gt;     damping=1.5,&lt;br /&gt;     position=(uniform(-70,70),uniform(-70,70),0),&lt;br /&gt;     impulse=(0,0,0),&lt;br /&gt;     standInObject="cube",&lt;br /&gt;     solver=self.crowdSolver&lt;br /&gt;     )&lt;br /&gt;   &lt;br /&gt;  rigid = cmds.rigidBody(&lt;br /&gt;     pavilion[0],&lt;br /&gt;     n="rigidVeh1%s%d" %(vType, N),&lt;br /&gt;     active=0,&lt;br /&gt;     mass=1,&lt;br /&gt;     bounciness=0,&lt;br /&gt;     damping=1.5,&lt;br /&gt;     position=(uniform(-70,70),uniform(-70,70),0),&lt;br /&gt;     impulse=(0,0,0),&lt;br /&gt;     standInObject="cube",&lt;br /&gt;     solver=self.crowdSolver&lt;br /&gt;     )&lt;br /&gt;   &lt;br /&gt;  #disconnect the rotation attributes of the vehicle   ??)?)?)?)&lt;br /&gt;  cmds.disconnectAttr(rigid + "rx.output", vehicle[0]+".rx")&lt;br /&gt;  cmds.disconnectAttr(rigid + "ry.output", vehicle[0]+".ry")&lt;br /&gt;  cmds.disconnectAttr(rigid + "rz.output", vehicle[0]+".rz")&lt;br /&gt;&lt;br /&gt;  #add expression for movement&lt;br /&gt;  randX = uniform(-3,3)&lt;br /&gt;  randY = uniform(-3,3)&lt;br /&gt;&lt;br /&gt;  expString = "%s.impulseX = sin(time * %f);" % (rigid, randX)&lt;br /&gt;  expString += "%s.impulseY = (noise(time)*%f);" % (rigid, randY)&lt;br /&gt;  expString += "float $Vel[] = `getAttr %s.velocity`;" % rigid&lt;br /&gt;  expString += "%s.rotateX = 0;" % vehicle[0]&lt;br /&gt;  expString += "%s.rotateY = 0;" % vehicle[0]&lt;br /&gt;  expString += "%s.rotateZ = atan2d( $Vel[0], $Vel[2] );" % vehicle[0]&lt;br /&gt;&lt;br /&gt;  cmds.expression(s=expString)&lt;br /&gt;&lt;br /&gt;  if vType == "F":&lt;br /&gt;   return [rigid, field] #returns the name of the function&lt;br /&gt; &lt;br /&gt;  if vType == "L":&lt;br /&gt;   return[rigid, field, Lfield]&lt;br /&gt; &lt;br /&gt;  else:&lt;br /&gt;   return[rigid, field, Pfield]&lt;br /&gt;&lt;br /&gt; def createCrowd(self, *args):&lt;br /&gt;  "Method to assemble the whole system"&lt;br /&gt;  #creates a rigidSolver to add the vehicle to&lt;br /&gt;  self.createCrowdSolver()&lt;br /&gt;  #turn on the velocity arrow &lt;br /&gt;  cmds.setAttr(self.crowdSolver + ".displayVelocity", 1)&lt;br /&gt;  cmds.setAttr(self.crowdSolver + ".scaleVelocity", .5)&lt;br /&gt;&lt;br /&gt;  #allow disconnections on the rigidSolver&lt;br /&gt;  cmds.setAttr(self.crowdSolver + ".allowDisconnection", 1)&lt;br /&gt;&lt;br /&gt;  ###create amount of agents&lt;br /&gt;  if self.vNumber == 10:&lt;br /&gt;   FNumber = 8&lt;br /&gt;   LNumber = 2&lt;br /&gt;  elif self.vNumber == 20:&lt;br /&gt;   FNumber=18&lt;br /&gt;   Lnumber=2&lt;br /&gt; &lt;br /&gt;  #create empty lists to store followers and leaders&lt;br /&gt;  followers=[]&lt;br /&gt;  leaders=[]&lt;br /&gt;  pavilions=[]&lt;br /&gt;  #create the followers&lt;br /&gt;  for i in range(FNumber):&lt;br /&gt;     v=self.createVehicle("F",i)&lt;br /&gt;     followers.append(v)&lt;br /&gt;&lt;br /&gt;  #create the leaders&lt;br /&gt;  for i in range(LNumber):&lt;br /&gt;     v=self.createVehicle("L",i)&lt;br /&gt;     leaders.append(v)&lt;br /&gt;   &lt;br /&gt;  create pavilion&lt;br /&gt;  for i in range(1):&lt;br /&gt;     v=self.createVehicle("P",i)&lt;br /&gt;     pavilions.append(v)&lt;br /&gt;   &lt;br /&gt;   &lt;br /&gt;&lt;br /&gt;  #CONNECT THE FIELDS TO THE RIGID BODIES(AGENTS)&lt;br /&gt;  #1) Connect the leaders with the followers&lt;br /&gt;&lt;br /&gt;  for i in range(LNumber):&lt;br /&gt;   Lfield=leaders[i][2]&lt;br /&gt;   lfield=leaders[i][1]&lt;br /&gt;   for j in range (FNumber):&lt;br /&gt;    Frigid = followers[j][0]&lt;br /&gt;    #connect the fields&lt;br /&gt;    cmds.connectDynamic(Frigid, fields=Lfields)&lt;br /&gt;    cmds.connectDynamic(Frigid, fields=lfields)&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  #2) Connect followers to leaders&lt;br /&gt;  for i in range(FNumber):&lt;br /&gt;   Ffield = followers[i][1]&lt;br /&gt;   for j in range(LNumber):&lt;br /&gt;    Lrigid = leaders[j][0]&lt;br /&gt;    cmds.connectDynamic(Lrigid, fields=Ffield)&lt;br /&gt;  &lt;br /&gt;  #3) Connect leaders to leaders&lt;br /&gt;  for i in range (LNumber):&lt;br /&gt;   Lrigid = leaders[i][0]&lt;br /&gt;   Lfield = leaders[i][1]&lt;br /&gt;   for j in range(LNumber):&lt;br /&gt;    if i == f: continue&lt;br /&gt;    L1rigid = leaders[j][0]&lt;br /&gt;    #l1field = leaders[j][1]&lt;br /&gt;    cmds.connectDynamic(L1rigid, fields=Lfield)&lt;br /&gt;  &lt;br /&gt;  #4) Connect followers to followers&lt;br /&gt;  for i in range(FNumber):&lt;br /&gt;   Ffield=followers[i][1]&lt;br /&gt;   for j in range(FNumber):&lt;br /&gt;    if i==j: continue&lt;br /&gt;    Frigid = followers[j][0]&lt;br /&gt;  &lt;br /&gt;    cmds.connectDynamics(Frigid, fields=Ffield)&lt;br /&gt;  &lt;br /&gt;  #5) Connect the pavilion with the leaders&lt;br /&gt;&lt;br /&gt;  for i in range(1):&lt;br /&gt;   Pfield=pavilions[i][2]&lt;br /&gt;   Lfield=pavilions[i][1]&lt;br /&gt; &lt;br /&gt;   for j in range (LNumber):&lt;br /&gt;    Frigid = leaders[j][0]&lt;br /&gt;    #connect the fields&lt;br /&gt;    cmds.connectDynamic(Frigid, fields=Pfields)&lt;br /&gt;    cmds.connectDynamic(Frigid, fields=Lfields)&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  #6) Connect leaders to pavilions&lt;br /&gt;  for i in range(LNumber):&lt;br /&gt;   Lfield = leaders[i][1]&lt;br /&gt;   for j in range(1):&lt;br /&gt;    Frigid = pavilions[j][0]&lt;br /&gt;    cmds.connectDynamic(Prigid, fields=Lfield)&lt;br /&gt;&lt;br /&gt;  #create obstacles if i want&lt;br /&gt;  if self.obst:self.collectObstacles()&lt;br /&gt;&lt;br /&gt;  #disable solver warnings&lt;br /&gt;  cmds.cycleCheck(e=0)&lt;br /&gt;    &lt;br /&gt;  #disable solver warnings&lt;br /&gt;  cmds.cycleCheck(e=0)&lt;br /&gt;&lt;br /&gt; def collectObstacles(self):&lt;br /&gt;  "Collects all obstacles"&lt;br /&gt;  if len(self.collectObjects) == 0:&lt;br /&gt;   #there is nothing selected&lt;br /&gt;   return "There is nothing selected!"&lt;br /&gt; &lt;br /&gt;  for o in self.collectObjects:&lt;br /&gt;   cmds.rigidBody( o,&lt;br /&gt;       passive = 1,&lt;br /&gt;       name=o+"_rb",&lt;br /&gt;       bounciness=2.0)&lt;br /&gt;     &lt;br /&gt;#craete an instance for this class&lt;br /&gt;c=Crowd()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-3211366912442031139?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/3211366912442031139/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/07/assignment-03b-first-try.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/3211366912442031139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/3211366912442031139'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/07/assignment-03b-first-try.html' title='Assignment 03B - first try'/><author><name>alexandra virlan</name><uri>http://www.blogger.com/profile/07826702946109365185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/-Kxco3AGM9F4/TVkNwXHhRCI/AAAAAAAAAbk/8dMS0nu4xvA/s220/60961_1579924174077_1114837832_31660390_6247364_n.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-895599810906933166</id><published>2009-07-12T21:11:00.007+02:00</published><updated>2009-07-13T18:10:46.179+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Alec'/><title type='text'>Chinese whispers</title><content type='html'>&lt;h1 id="firstHeading" class="firstHeading"&gt;Chinese whispers&lt;/h1&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 255);"&gt;::: SYNOPSIS :::&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);font-size:85%;" &gt;My idea is to have 1&lt;span style="color: rgb(255, 0, 0);"&gt;EMITER&lt;/span&gt;, 1&lt;span style="color: rgb(204, 204, 204);"&gt;RECEPTOR&lt;/span&gt;, and n number of &lt;span&gt;TRANSMITOR&lt;/span&gt;!&lt;br /&gt;The aim of this script is to bring the information from the &lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);font-size:85%;" &gt;&lt;span style="color: rgb(255, 0, 0);"&gt;EMITER&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);font-size:85%;" &gt;, to the &lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);font-size:85%;" &gt;&lt;span style="color: rgb(204, 204, 204);"&gt;RECEPTOR&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);font-size:85%;" &gt; by the &lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);font-size:85%;" &gt;&lt;span&gt;TRANSMITOR&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);font-size:85%;" &gt;!&lt;br /&gt;The information is symbolized by the red color, the white color symbolized the un-information ...&lt;br /&gt;The &lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);font-size:85%;" &gt;&lt;span style="color: rgb(255, 0, 0);"&gt;EMITER&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);font-size:85%;" &gt; and the &lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);font-size:85%;" &gt;&lt;span style="color: rgb(204, 204, 204);"&gt;RECEPTOR&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);font-size:85%;" &gt; doesn't move, only the&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);font-size:85%;" &gt;&lt;span&gt;TRANSMITOR&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);font-size:85%;" &gt; can move!...&lt;br /&gt;&lt;br /&gt;When a &lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);font-size:85%;" &gt;&lt;span&gt;TRANSMITOR&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);font-size:85%;" &gt; hit the &lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);font-size:85%;" &gt;&lt;span style="color: rgb(255, 0, 0);"&gt;EMITER&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);font-size:85%;" &gt;, the TRANSMITOR become red, the &lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);font-size:85%;" &gt;&lt;span style="color: rgb(255, 0, 0);"&gt;EMITER&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);font-size:85%;" &gt; become white!&lt;br /&gt;Then when this red-TRANSMITOR hit another black-TRANSMITOR, the red become black again, and the black become red!&lt;br /&gt;The Information is transmitted! ... When finally the &lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);font-size:85%;" &gt;&lt;span style="color: rgb(204, 204, 204);"&gt;RECEPTOR&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);font-size:85%;" &gt; is hitting by a red &lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);font-size:85%;" &gt;&lt;span&gt;TRANSMITOR&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);font-size:85%;" &gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(255, 255, 255);"&gt;the script stop! ..&lt;/span&gt;&lt;/span&gt;. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 255, 255);"&gt;::: AUTO-COMMENTS :::&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);font-size:85%;" &gt;- Does this script too simple?&lt;br /&gt;- I will try to clean a little bit the hit part! It's a little bit messy, and I found a new way to do it!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;- I also want to script another scenerio based on the same principe&lt;/span&gt;&lt;br /&gt;&lt;pre class="python" name="code"&gt;&lt;br /&gt;####################################&lt;br /&gt;## INFORMATIONS DIFFUSION&lt;br /&gt;## Chinese whispers&lt;br /&gt;####################################&lt;br /&gt;&lt;br /&gt;import maya.cmds as cmds&lt;br /&gt;import maya.mel as mel&lt;br /&gt;import random&lt;br /&gt;import math&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Function to create shader&lt;br /&gt;def createShader(color, transparency=0, type="lambert", name="shader"):&lt;br /&gt;#steps to create a new material&lt;br /&gt;shadingNode1 = cmds.shadingNode(type, asShader=1, name=name)&lt;br /&gt;shadingNode2 = cmds.sets(renderable=1, noSurfaceShader = 1, empty=1, name=name)&lt;br /&gt;cmds.connectAttr(shadingNode1+".outColor", shadingNode2 + ".surfaceShader", force=1)&lt;br /&gt;#steps to modify material attributes&lt;br /&gt;cmds.setAttr(shadingNode1 + ".color", color[0],color[1], color[2]) #color in r g b values&lt;br /&gt;cmds.setAttr(shadingNode1 + ".transparency", transparency, transparency, transparency)&lt;br /&gt;&lt;br /&gt;return shadingNode2&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Function to create shader I need&lt;br /&gt;def myshaders():&lt;br /&gt;# Create the transmitter shader =&gt; no information&lt;br /&gt;if cmds.objExists('noir'):&lt;br /&gt;# stupid line just to say to python to do nothing!&lt;br /&gt;nothing = 0&lt;br /&gt;else:&lt;br /&gt;noir = createShader((0,0,0), transparency=0, type="lambert", name="noir")&lt;br /&gt;&lt;br /&gt;# Create the Receptor shader =&gt; awaiting the information&lt;br /&gt;if cmds.objExists('blanc'):&lt;br /&gt;# stupid line just to say to python to do nothing!&lt;br /&gt;nothing = 0&lt;br /&gt;else:&lt;br /&gt;blanc = createShader((255,255,255), transparency=0, type="lambert", name="blanc")&lt;br /&gt;&lt;br /&gt;# Create the transmitter shader =&gt; information&lt;br /&gt;if cmds.objExists('rouge'):&lt;br /&gt;# stupid line just to say to python to do nothing!&lt;br /&gt;nothing = 0&lt;br /&gt;else:&lt;br /&gt;rouge = createShader((255,0,0), transparency=0, type="lambert", name="rouge")&lt;br /&gt;&lt;br /&gt;# Create the box shader, transparent to see what's happen inside! =)&lt;br /&gt;if cmds.objExists('transparent'):&lt;br /&gt;# stupid line just to say to python to do nothing!&lt;br /&gt;nothing = 0&lt;br /&gt;else:&lt;br /&gt;transparent = createShader((0,0,0), transparency=.9, type="lambert", name="transparent")&lt;br /&gt;&lt;br /&gt;# Function to apply the shader&lt;br /&gt;def applyShaderOnObject(obj, shader):&lt;br /&gt;cmds.sets(obj, e=1, forceElement=shader)&lt;br /&gt;&lt;br /&gt;# SYNOPSIS :::&lt;br /&gt;# My idea is to have 1EMITER, 1RECEPTOR, and n number of TRANSMITOR!&lt;br /&gt;# The aim of this script is to bring the information from the EMITER, to the RECEPTOR by the TRANSMITOR!&lt;br /&gt;# The information is symbolized by the red color, the white color symbolized the un-information ...&lt;br /&gt;# The EMITER and the RECEPTOR doesn't move, only the TRANSMITOR can move!...&lt;br /&gt;&lt;br /&gt;# When a TRANSMITOR hit the EMITER, the TRANSMITOR become red, the EMITER become white!&lt;br /&gt;# Then when this red-TRANSMITOR hit another black-TRANSMITOR, the red become black again, and the black become red!&lt;br /&gt;# The Information is transmitted! ... When finally the RECEPTOR is hitting by a red TRANSMITOR, the script stop! ...&lt;br /&gt;&lt;br /&gt;def hit(hit, agent):&lt;br /&gt;### define what to do when it some collision is detected&lt;br /&gt;if hit == "wall_rigid":&lt;br /&gt;return&lt;br /&gt;&lt;br /&gt;agentRole = cmds.getAttr(agent + ".role")&lt;br /&gt;hitRole = cmds.getAttr(hit + ".role")&lt;br /&gt;agentShader = cmds.getAttr(agent + ".shader")&lt;br /&gt;hitShader = cmds.getAttr(hit + ".shader")&lt;br /&gt;&lt;br /&gt;# If the emitter hit a transmitter&lt;br /&gt;if agentRole == "emitter":&lt;br /&gt;if hitRole == "transmitters":&lt;br /&gt;#print agentRole # = emitter&lt;br /&gt;#print hitRole # = transmitter&lt;br /&gt;&lt;br /&gt;if agentShader == 'rouge1':&lt;br /&gt;# change the color of the transmitter from black to red&lt;br /&gt;obj = cmds.getAttr(hit+".obj")&lt;br /&gt;applyShaderOnObject(obj, 'rouge1')&lt;br /&gt;cmds.setAttr(hit+".shader", 'rouge1', type="string")&lt;br /&gt;&lt;br /&gt;# change the color of the emitter from red to black&lt;br /&gt;obj = cmds.getAttr(agent+".obj")&lt;br /&gt;applyShaderOnObject(obj, 'noir1')&lt;br /&gt;cmds.setAttr(agent+".shader", 'noir1', type="string")&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# If a transmiter hit a emitter&lt;br /&gt;if agentRole == "transmitters":&lt;br /&gt;if hitRole == "emitter":&lt;br /&gt;#print agentRole # = trans&lt;br /&gt;#print hitRole # = emit&lt;br /&gt;&lt;br /&gt;if hitShader == 'rouge1':&lt;br /&gt;# change the color of the emitter from red to black&lt;br /&gt;obj = cmds.getAttr(hit+".obj")&lt;br /&gt;applyShaderOnObject(obj, 'noir1')&lt;br /&gt;cmds.setAttr(hit+".shader", 'noir1', type="string")&lt;br /&gt;&lt;br /&gt;# change the color of the transmitter from black to red&lt;br /&gt;obj = cmds.getAttr(agent+".obj")&lt;br /&gt;applyShaderOnObject(obj, 'rouge1')&lt;br /&gt;cmds.setAttr(agent+".shader", 'rouge1', type="string")&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# If a transmitter hit another transmitter&lt;br /&gt;if agentRole == "transmitters":&lt;br /&gt;if hitRole == "transmitters":&lt;br /&gt;&lt;br /&gt;if agentShader == 'rouge1':&lt;br /&gt;# change the color of the frist transmitter from black to red&lt;br /&gt;obj = cmds.getAttr(hit+".obj")&lt;br /&gt;applyShaderOnObject(obj, 'rouge1')&lt;br /&gt;cmds.setAttr(hit+".shader", 'rouge1', type="string")&lt;br /&gt;&lt;br /&gt;# change the color of the second transmitter from red to black&lt;br /&gt;obj = cmds.getAttr(agent+".obj")&lt;br /&gt;applyShaderOnObject(obj, 'noir1')&lt;br /&gt;cmds.setAttr(agent+".shader", 'noir1', type="string")&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;if hitShader == 'rouge1':&lt;br /&gt;# change the color of the frist transmitter from red to black&lt;br /&gt;obj = cmds.getAttr(hit+".obj")&lt;br /&gt;applyShaderOnObject(obj, 'noir1')&lt;br /&gt;cmds.setAttr(hit+".shader", 'noir1', type="string")&lt;br /&gt;&lt;br /&gt;# change the color of the second transmitter from black to red&lt;br /&gt;obj = cmds.getAttr(agent+".obj")&lt;br /&gt;applyShaderOnObject(obj, 'rouge1')&lt;br /&gt;cmds.setAttr(agent+".shader", 'rouge1', type="string")&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# And Finally, if an emitter hit the receptor!&lt;br /&gt;if agentRole == "receptor":&lt;br /&gt;if hitRole == "transmitters":&lt;br /&gt;#print agentRole # = receptor&lt;br /&gt;#print hitRole # = emitter&lt;br /&gt;&lt;br /&gt;if hitShader == 'rouge1':&lt;br /&gt;# change the color of the transmitter from red to black&lt;br /&gt;obj = cmds.getAttr(hit+".obj")&lt;br /&gt;applyShaderOnObject(obj, 'noir1')&lt;br /&gt;cmds.setAttr(hit+".shader", 'noir1', type="string")&lt;br /&gt;&lt;br /&gt;# change the color of the receptor form white to red&lt;br /&gt;obj = cmds.getAttr(agent+".obj")&lt;br /&gt;applyShaderOnObject(obj, 'rouge1')&lt;br /&gt;cmds.setAttr(agent+".shader", 'rouge1', type="string")&lt;br /&gt;&lt;br /&gt;# means that the information is propely transmitted&lt;br /&gt;# so, stop the animation, and print a feedback&lt;br /&gt;cmds.play( state=False )&lt;br /&gt;frame = cmds.currentTime( query=True )&lt;br /&gt;print "INFORMATION TRANSMITED IN", frame, "FRAMES"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# if an emitter hit the receptor!&lt;br /&gt;if agentRole == "transmitters":&lt;br /&gt;if hitRole == "receptor":&lt;br /&gt;#print agentRole # = emit&lt;br /&gt;#print hitRole # = trans&lt;br /&gt;&lt;br /&gt;if agentShader == 'rouge1':&lt;br /&gt;# change the color of the receptor form white to red&lt;br /&gt;obj = cmds.getAttr(hit+".obj")&lt;br /&gt;applyShaderOnObject(obj, 'rouge1')&lt;br /&gt;cmds.setAttr(hit+".shader", 'rouge1', type="string")&lt;br /&gt;&lt;br /&gt;# change the color of the transmitter from red to black&lt;br /&gt;obj = cmds.getAttr(agent+".obj")&lt;br /&gt;applyShaderOnObject(obj, 'noir1')&lt;br /&gt;cmds.setAttr(agent+".shader", 'noir1', type="string")&lt;br /&gt;&lt;br /&gt;# means that the information is propely transmitted&lt;br /&gt;# so, stop the animation, and print a feedback&lt;br /&gt;cmds.play( state=False )&lt;br /&gt;frame = cmds.currentTime( query=True )&lt;br /&gt;print "INFORMATION TRANSMITED IN", frame, "FRAMES"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class Agent:&lt;br /&gt;def __init__(self, solver, role, position=(0,0,0), size=(3,3,3), color=(0,0,0), objType="sphere", rigidType="active", bounciness=.6, collide=1, mass=1, speed=5):&lt;br /&gt;#set agent atributes&lt;br /&gt;self.bounciness = bounciness&lt;br /&gt;self.collide = collide&lt;br /&gt;self.rigidType = rigidType&lt;br /&gt;self.solver=solver&lt;br /&gt;self.role = role&lt;br /&gt;self.initialScale = size&lt;br /&gt;self.mass=mass&lt;br /&gt;self.speed = speed&lt;br /&gt;&lt;br /&gt;#create the agent and scale it&lt;br /&gt;self.object = cmds.polySphere(ax=(0,0,1))&lt;br /&gt;cmds.scale(size[0], size[1], size[2])&lt;br /&gt;#apply a color to the agent&lt;br /&gt;#set the object color&lt;br /&gt;&lt;br /&gt;applyShaderOnObject(self.object[0], color)&lt;br /&gt;&lt;br /&gt;#create the rigid body&lt;br /&gt;self.rigid = cmds.rigidBody(self.object,&lt;br /&gt;    name=self.object[0] + "_rigid",&lt;br /&gt;    p=position,&lt;br /&gt;    b=self.bounciness,&lt;br /&gt;    impulse=(0,0,0),&lt;br /&gt;    sio=objType, #stand in object&lt;br /&gt;    cc = 1, #contact count&lt;br /&gt;    cp = 1, #contact position&lt;br /&gt;    cn = 1, #contact name&lt;br /&gt;    si = (190,190,190),&lt;br /&gt;    m=mass,&lt;br /&gt;    solver=self.solver)&lt;br /&gt;&lt;br /&gt;#add attribute to the rigid body to store the type of agent&lt;br /&gt;cmds.select(self.rigid, r=1)&lt;br /&gt;cmds.addAttr(ln="role", dt="string", keyable=1, w=1)&lt;br /&gt;cmds.setAttr(self.rigid + ".role", self.role, type="string")&lt;br /&gt;&lt;br /&gt;cmds.addAttr(ln="obj", dt="string", keyable=1, w=1)&lt;br /&gt;cmds.setAttr(self.rigid + ".obj", self.object[0] , type="string")&lt;br /&gt;&lt;br /&gt;cmds.addAttr(ln="shader", dt="string", keyable=1, w=1)&lt;br /&gt;cmds.setAttr(self.rigid + ".shader", color , type="string")&lt;br /&gt;&lt;br /&gt;self.applyExpression(speed)&lt;br /&gt;&lt;br /&gt;def applyExpression(self, speed):&lt;br /&gt;"Function to apply the expression to the agent"&lt;br /&gt;#first disconnect the rotation attributes because we want to controll it via expressions&lt;br /&gt;cmds.disconnectAttr (self.rigid + "ry.output", self.object[0] + ".rotateY")&lt;br /&gt;cmds.disconnectAttr (self.rigid + "rx.output", self.object[0] +  ".rotateX")&lt;br /&gt;cmds.disconnectAttr (self.rigid + "rz.output", self.object[0] + ".rotateZ")&lt;br /&gt;&lt;br /&gt;# Create expression for VehicleF with a random multiplier added to the expression.&lt;br /&gt;randX = random.uniform(-speed,speed)&lt;br /&gt;randY = random.uniform(speed,-speed)&lt;br /&gt;&lt;br /&gt;expString = "// Set wander motion of vehicle and add random multipliers.\n"&lt;br /&gt;&lt;br /&gt;if self.role == "transmitters":&lt;br /&gt;####COMPOSE THE EXPRESSION STRING&lt;br /&gt;#now put the text above in a python string&lt;br /&gt;#the first lines define how the agent will wander&lt;br /&gt;&lt;br /&gt;expString += "%s.impulseX" % self.rigid&lt;br /&gt;expString += " = (cos(time*%f));\n" % randX&lt;br /&gt;expString += "%s.impulseY" % self.rigid&lt;br /&gt;expString += " = ((noise(time) * %f));\n\n" % randY&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#the second part, how it rotates according to the direction it is going (velocity vector)&lt;br /&gt;expString += "// Set orientation of Vehicle according to the velocity direction.\n"&lt;br /&gt;expString += "float $fVel[];\n"&lt;br /&gt;expString += "$fVel  = `getAttr %s.velocity`;\n\n" % (self.rigid)&lt;br /&gt;expString += "%s.rotateX = 0;\n" % self.object[0]&lt;br /&gt;expString += "%s.rotateZ = atan2d( $fVel[0], $fVel[1] );\n" % (self.object[0])&lt;br /&gt;expString += "%s.rotateY = 0;\n\n" % self.object[0]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#the third part, checking bumps on other agents&lt;br /&gt;expString += "//checking bumps on other agents\n"&lt;br /&gt;expString += "string $lastHit;\n"&lt;br /&gt;expString += "if (%s.contactCount &gt; 0){\n" % self.rigid&lt;br /&gt;expString += "  int $contactCount = `getAttr %s.contactCount`;\n" % self.rigid&lt;br /&gt;expString += "  $lastHit = `getAttr %s.contactName[0]`;\n" %self.rigid&lt;br /&gt;expString += '  string $rigid = "%s";\n' % self.rigid&lt;br /&gt;expString += '  python("hit(\'"+$lastHit+"\', \'"+ $rigid +"\')");\n'&lt;br /&gt;expString += "};//endif\n"&lt;br /&gt;&lt;br /&gt;self.expString = expString&lt;br /&gt;cmds.expression(s=expString)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;##############################################&lt;br /&gt;class Crowd:&lt;br /&gt;def __init__(self, numAgents=20, scaleRecept=2.5, scaleTrans=2, minPosition=-70, maxPosition=70, walls=1, speed=5):&lt;br /&gt;#set the playback options to increase the time range&lt;br /&gt;cmds.playbackOptions(min= 1, max=5000)&lt;br /&gt;self.numAgents = numAgents&lt;br /&gt;self.minPosition = minPosition&lt;br /&gt;self.maxPosition = maxPosition&lt;br /&gt;self.scaleRecept = scaleRecept&lt;br /&gt;self.scaleTrans = scaleTrans&lt;br /&gt;self.speed = speed&lt;br /&gt;&lt;br /&gt;#get any selected objects&lt;br /&gt;self.createBorders(scaleRecept,maxPosition)&lt;br /&gt;self.wallObjs = cmds.ls(sl=1)&lt;br /&gt;&lt;br /&gt;#create the rigid solver&lt;br /&gt;self.solver = self.createSolver()&lt;br /&gt;#create the agents&lt;br /&gt;self.createAgents(scaleRecept, scaleTrans, speed)&lt;br /&gt;#create the walls&lt;br /&gt;if walls: self.makeWalls()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Create a box to contain the balls&lt;br /&gt;def createBorders(self, scaleRecept,maxPosition):&lt;br /&gt;cmds.polyCube(n="border", ax=(0,0,0), w=((maxPosition*2)+(scaleRecept*2)), h=((maxPosition*2)+(scaleRecept*2)), d=(scaleRecept*2))&lt;br /&gt;cmds.polyNormal( nm=0 )&lt;br /&gt;myshaders()&lt;br /&gt;applyShaderOnObject("border", 'transparent1')&lt;br /&gt;&lt;br /&gt;cmds.select("border")&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Create Solver&lt;br /&gt;def createSolver(self):&lt;br /&gt;solver = cmds.rigidSolver(create=1, current=1, name="crowdSolver", velocityVectorScale=0.1, displayVelocity=1, sc=1, ctd=1)&lt;br /&gt;cmds.setAttr(solver + ".allowDisconnection", 1)&lt;br /&gt;return solver&lt;br /&gt;&lt;br /&gt;# Create x numbers of transmittors&lt;br /&gt;def createAgents(self, scaleRecept, scaleTrans, speed):&lt;br /&gt;myshaders()&lt;br /&gt;self.speed = speed&lt;br /&gt;transmitters = ['transmitters', (scaleTrans,scaleTrans,scaleTrans), 1, 'noir1'] #name, scale, mass, color&lt;br /&gt;emitter = ['emitter', (scaleRecept,scaleRecept,scaleRecept), 1000, 'rouge1'] #name, scale, mass, color&lt;br /&gt;receptor = ['receptor', (scaleRecept,scaleRecept,scaleRecept), 1000, 'blanc1'] #name, scale, mass, color&lt;br /&gt;&lt;br /&gt;self.transmitlist = []&lt;br /&gt;self.emitlist = []&lt;br /&gt;self.receptlist = []&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Create the emeter&lt;br /&gt;x = float(random.uniform(self.minPosition,self.maxPosition))&lt;br /&gt;y = float(random.uniform(self.minPosition,self.maxPosition))&lt;br /&gt;z = 0&lt;br /&gt;&lt;br /&gt;emitagent = Agent(self.solver, emitter[0], size=emitter[1], color=emitter[3], position=(x,y,z), bounciness=0, mass=emitter[2], speed=speed)&lt;br /&gt;liste = (self.solver, emitagent)&lt;br /&gt;self.emitlist.append(liste)&lt;br /&gt;&lt;br /&gt;# Create the receptor&lt;br /&gt;x = float(random.uniform(self.minPosition,self.maxPosition))&lt;br /&gt;y = float(random.uniform(self.minPosition,self.maxPosition))&lt;br /&gt;z = 0&lt;br /&gt;&lt;br /&gt;receptagent = Agent(self.solver, receptor[0], size=receptor[1], color=receptor[3], position=(x,y,z), bounciness=0, mass=receptor[2], speed=speed)&lt;br /&gt;liste = (self.solver, receptagent)&lt;br /&gt;self.receptlist.append(liste)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Create n transmiters&lt;br /&gt;for i in range(self.numAgents):&lt;br /&gt;#get random x and y&lt;br /&gt;x = random.uniform(self.minPosition,self.maxPosition)&lt;br /&gt;y = random.uniform(self.minPosition,self.maxPosition)&lt;br /&gt;z = 0&lt;br /&gt;&lt;br /&gt;#create the agents&lt;br /&gt;transagent = Agent(self.solver, transmitters[0], position=(x,y,z), size=transmitters[1], color=transmitters[3], mass=transmitters[2], speed=speed)&lt;br /&gt;liste = (self.solver, transagent)&lt;br /&gt;self.transmitlist.append(liste)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def makeWalls(self):&lt;br /&gt;#get selected object,&lt;br /&gt;#which should be already with its normals facing to the right directions,&lt;br /&gt;#and convert it to passive rigid bodies&lt;br /&gt;if len(self.wallObjs) == 0:&lt;br /&gt;return "No wall objects were selected."&lt;br /&gt;else:&lt;br /&gt;for w in self.wallObjs:&lt;br /&gt;self.wallRigid = cmds.rigidBody(w, passive=1, name= "wall_rigid", bounciness=.8)&lt;br /&gt;&lt;br /&gt;########################################&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;c=Crowd(numAgents=50, walls=1, speed=5)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-895599810906933166?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/895599810906933166/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/07/0n-self.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/895599810906933166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/895599810906933166'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/07/0n-self.html' title='Chinese whispers'/><author><name>alec</name><uri>http://www.blogger.com/profile/09823278314767605002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/_qqt7zCa-76A/SPT1pm42sNI/AAAAAAAAAFw/26kHzdRhX_4/S220/2589578483_d2918fb00c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-6334803241818880850</id><published>2009-07-10T18:29:00.003+02:00</published><updated>2009-08-13T19:05:54.081+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Alexander'/><category scheme='http://www.blogger.com/atom/ns#' term='Tudor'/><title type='text'>Predator-Prey crowd system</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_mg0pJcUsrJ0/SldslADfPnI/AAAAAAAAAfE/uGcpgcP7AzI/s1600-h/swarms001.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 247px;" src="http://1.bp.blogspot.com/_mg0pJcUsrJ0/SldslADfPnI/AAAAAAAAAfE/uGcpgcP7AzI/s320/swarms001.jpg" alt="" id="BLOGGER_PHOTO_ID_5356869664706084466" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The goal of the script was to create a primary state of equality and to add some fields which would tarnsform(change) the boids behaviour. Therefore from simple wanderers (with no leaders) some boids would become either preys or predators.&lt;br /&gt;&lt;br /&gt;If a predator would hit a wanderer, the number of predators would increase by one. If the predator would hit a prey, the number of preys would decrease by one and the number of predators would be the same. If a predator would enter the "force" field which changes the boids behaviour to preys, it would become a prey. If a prey would enter the "force" field which changes the boids behaviour to predators, it would become a predator.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;import maya.cmds as cmds&lt;br /&gt;import random&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Main&lt;br /&gt;# ____&lt;br /&gt;class Crowd:&lt;br /&gt;    def __init__(self):       &lt;br /&gt;        #def crowdMain():&lt;br /&gt;        self.vNumber = 10&lt;br /&gt;        self.obst = 0&lt;br /&gt;        self.gforces = 0&lt;br /&gt;        self.UIelements = {}&lt;br /&gt;        cmds.playbackOptions(min= 1, max=500)&lt;br /&gt;        self.crowdSystemUI()&lt;br /&gt;        #end if&lt;br /&gt;    #end def __init__&lt;br /&gt;   &lt;br /&gt;   &lt;br /&gt;    def crowdSystemUI(self):           &lt;br /&gt;        self.UIelements["window"] = cmds.window(title="Crowd System",&lt;br /&gt;                                                widthHeight=(300, 200)&lt;br /&gt;                                                )&lt;br /&gt;       &lt;br /&gt;        self.UIelements["form"] = cmds.formLayout()&lt;br /&gt;        txt = cmds.text(label="Number of Vehicles")&lt;br /&gt;        collection = cmds.radioCollection()&lt;br /&gt;        radiob1 = cmds.radioButton(label="10", data=1, changeCommand=self.changeVnumber)&lt;br /&gt;        radiob2 = cmds.radioButton(label="20", onCommand="vNumber = 20")&lt;br /&gt;        cmds.setParent(upLevel=1)&lt;br /&gt;        cmds.setParent(upLevel=1)&lt;br /&gt;&lt;br /&gt;        txtOB = cmds.text(label="Obstacles")&lt;br /&gt;        collection2 = cmds.radioCollection()&lt;br /&gt;        radiob3 = cmds.radioButton(label="On", changeCommand=self.changeObst)&lt;br /&gt;        radiob4 = cmds.radioButton(label="Off")&lt;br /&gt;        cmds.setParent(upLevel=1)&lt;br /&gt;        cmds.setParent(upLevel=1)&lt;br /&gt;&lt;br /&gt;        txtGF = cmds.text( label = "Global Forces")&lt;br /&gt;        collection3 = cmds.radioCollection()&lt;br /&gt;        radiob5 = cmds.radioButton(label= "On" ,changeCommand =self.changeGforces)&lt;br /&gt;        radiob6 = cmds.radioButton(label="Off")&lt;br /&gt;        cmds.setParent(upLevel=1)&lt;br /&gt;        cmds.setParent(upLevel=1)&lt;br /&gt;&lt;br /&gt;        cmds.radioCollection(collection, edit=1, select=radiob1)&lt;br /&gt;        cmds.radioCollection(collection2, edit=1, select=radiob4)&lt;br /&gt;        cmds.radioCollection(collection3, edit=1, select=radiob6)&lt;br /&gt;&lt;br /&gt;        # Place Vehicle options&lt;br /&gt;        form = self.UIelements["form"]&lt;br /&gt;        cmds.formLayout(form,&lt;br /&gt;                        edit=1,&lt;br /&gt;                        attachForm= [&lt;br /&gt;                                    ( txt, "top", 20),&lt;br /&gt;                                    (txt ,"left", 70),&lt;br /&gt;                                    (radiob1,"top", 10),&lt;br /&gt;                                    (radiob1,"left", 20),&lt;br /&gt;                                    (radiob2,"top", 30),&lt;br /&gt;                                    (radiob2,"left", 20)&lt;br /&gt;                                    ]&lt;br /&gt;                        )&lt;br /&gt;&lt;br /&gt;        # Place environment options&lt;br /&gt;        cmds.formLayout(form,&lt;br /&gt;                        edit=1,&lt;br /&gt;                        attachForm= [&lt;br /&gt;                                    (txtOB, "top", 80),&lt;br /&gt;                                    (txtOB, "left", 80),&lt;br /&gt;                                    (radiob3, "top", 80),&lt;br /&gt;                                    (radiob3, "left", 150),&lt;br /&gt;                                    (radiob4 ,"top", 80),&lt;br /&gt;                                    (radiob4, "left", 190),&lt;br /&gt;                                    (txtGF, "top", 110),&lt;br /&gt;                                    (txtGF, "left", 63),&lt;br /&gt;                                    (radiob5, "top", 110),&lt;br /&gt;                                    (radiob5, "left", 150),&lt;br /&gt;                                    (radiob6, "top", 110),&lt;br /&gt;                                    (radiob6, "left", 190)&lt;br /&gt;                                    ]&lt;br /&gt;                        )&lt;br /&gt;                       &lt;br /&gt;        # Create buttons&lt;br /&gt;        button1 = cmds.button(label = "Create")&lt;br /&gt;        button2 = cmds.button(label = "Cancel")&lt;br /&gt;&lt;br /&gt;        # Place buttons in the window&lt;br /&gt;        cmds.formLayout(form,&lt;br /&gt;                        edit=1,&lt;br /&gt;                        attachForm =[&lt;br /&gt;                                    (button1, "bottom", 10),&lt;br /&gt;                                    (button1, "left", 185),&lt;br /&gt;                                    (button2, "bottom", 10),&lt;br /&gt;                                    (button2, "right", 10)&lt;br /&gt;                                    ]&lt;br /&gt;                        )&lt;br /&gt;       &lt;br /&gt;        # Add the commands to the buttons.&lt;br /&gt;&lt;br /&gt;        cmds.button(button1, edit=1, command=self.createCrowd )&lt;br /&gt;        cmds.button(button2, edit=1, command=self.deleteUI )&lt;br /&gt;       &lt;br /&gt;        cmds.showWindow(self.UIelements["window"])&lt;br /&gt;       &lt;br /&gt;    ##############################################################&lt;br /&gt;    def createCrowdSolver(self):&lt;br /&gt;        self.crowdSolver = cmds.rigidSolver(    create=1,&lt;br /&gt;                                                current=1,&lt;br /&gt;                                                name="crowdSolver",&lt;br /&gt;                                                velocityVectorScale=0.5,&lt;br /&gt;                                                displayVelocity=1,&lt;br /&gt;                                                sc=1&lt;br /&gt;                                                )&lt;br /&gt;        cmds.setAttr(self.crowdSolver + ".allowDisconnection", 1)&lt;br /&gt;       &lt;br /&gt;    def createVehicle(self, i, vType):&lt;br /&gt;        "Creates a Vehicle"&lt;br /&gt;        if vType == "F":&lt;br /&gt;            w = 2&lt;br /&gt;            h = 2.5&lt;br /&gt;            d = 2&lt;br /&gt;        else:&lt;br /&gt;            w=5&lt;br /&gt;            h=3.5&lt;br /&gt;            d=5&lt;br /&gt;        v = cmds.polyCube(name="vehicle%s_%d" % (vType, i), width = w,  height = h, depth = d)&lt;br /&gt;        #Add a Vehicle force field for follower.&lt;br /&gt;        field = cmds.radial(    position=(0, 0, 0),&lt;br /&gt;                                name = "vehicle%sForce_%d" % (vType, i),&lt;br /&gt;                                magnitude=50,&lt;br /&gt;                                attenuation=0.3,&lt;br /&gt;                                maxDistance = 8.0&lt;br /&gt;                            )&lt;br /&gt;        cmds.parent(field[0], v[0])&lt;br /&gt;        cmds.hide (field)&lt;br /&gt;        '''&lt;br /&gt;        if vType == "L":&lt;br /&gt;            # Add leader field&lt;br /&gt;            lRadial = cmds.radial(    position = (0, 0, 0),&lt;br /&gt;                                    name = "vehicleGlobalLeadForce_%d" % i,&lt;br /&gt;                                    magnitude = -1,&lt;br /&gt;                                    attenuation = 0.2,&lt;br /&gt;                                    maxDistance = 50&lt;br /&gt;                                    )&lt;br /&gt;            cmds.parent (lRadial[0], v[0])&lt;br /&gt;            cmds.hide (lRadial)&lt;br /&gt;        '''&lt;br /&gt;        # Make the Vehicle a Rigid Body with random placement.&lt;br /&gt;        rigid = cmds.rigidBody(v[0],&lt;br /&gt;                                name="rigidVehicle%s_%d" % (vType, i),&lt;br /&gt;                                active=1,&lt;br /&gt;                                mass=1,&lt;br /&gt;                                bounciness=0,&lt;br /&gt;                                damping= 1.5 ,&lt;br /&gt;                                position = (random.uniform(-70,70), random.uniform(-70,70), 0),&lt;br /&gt;                                impulse =( 0, 0, 0),&lt;br /&gt;                                standInObject="cube",&lt;br /&gt;                                solver= self.crowdSolver&lt;br /&gt;                                )&lt;br /&gt;   &lt;br /&gt;        cmds.disconnectAttr (rigid + "ry.output", v[0] + ".rotateY")&lt;br /&gt;        cmds.disconnectAttr (rigid + "rx.output", v[0] +  ".rotateX")&lt;br /&gt;        cmds.disconnectAttr (rigid + "rz.output", v[0] + ".rotateZ")&lt;br /&gt;&lt;br /&gt;        # Create expression for VehicleF with a random multiplier added to the expression.&lt;br /&gt;        randX = random.uniform(-3,3)&lt;br /&gt;        randY = random.uniform(3,-3)&lt;br /&gt;        expString = "// Set wander motion of vehicle and add random multipliers.\n"&lt;br /&gt;        expString += "%s.impulseX" % rigid&lt;br /&gt;        expString += " = sin(time * %f);\n" % randX&lt;br /&gt;        expString += "%s.impulseY" % rigid&lt;br /&gt;        expString += " = (noise(time) * %f);\n\n" % randY&lt;br /&gt;        expString += "// Set orientation of Vehicle according to the velocity direction.\n"&lt;br /&gt;        expString += "float $fVel%d[];\n" % i&lt;br /&gt;        expString += "$fVel%d  = `getAttr %s.velocity`;\n\n" % (i,rigid)&lt;br /&gt;        expString += "%s.rotateX = 0;\n" % v[0]&lt;br /&gt;        expString += "%s.rotateY = atan2d( $fVel%d[0], $fVel%d[2] );\n" % (v[0],i,i)&lt;br /&gt;        expString += "%s.rotateZ = 0;\n" % v[0]&lt;br /&gt;        expString += "string $ContactNames = `getAttr %s.cnn`;\n" % rigid&lt;br /&gt;        expString += "print($ContactNames);\n"&lt;br /&gt;       &lt;br /&gt;        #print expString&lt;br /&gt;        exp = cmds.expression(s=expString )&lt;br /&gt;        ######################################################################### start w08&lt;br /&gt;        if vType == "F":&lt;br /&gt;            return [rigid, field]&lt;br /&gt;        else:&lt;br /&gt;            return [rigid, field, lRadial]&lt;br /&gt;   &lt;br /&gt;    def createCrowd(self, *args) :&lt;br /&gt;   &lt;br /&gt;        self.collectObjects = cmds.ls(sl=1) ###################################### get selected objects&lt;br /&gt;       &lt;br /&gt;        # Bring in ints and string from interface.&lt;br /&gt;        # Vehicle creation for crowd system.&lt;br /&gt;        # Create a master crowdSolver for all Vehicles.&lt;br /&gt;        self.createCrowdSolver()&lt;br /&gt;&lt;br /&gt;        # Get total number of Vehicles from interface options.&lt;br /&gt;        if self.vNumber == 10:&lt;br /&gt;            FvNumber = 10     # Followers&lt;br /&gt;            #LvNumber = 2     # Leaders&lt;br /&gt;        elif self.vNumber == 20:&lt;br /&gt;            FvNumber = 20   # Followers&lt;br /&gt;            #LvNumber = 2     # Leaders&lt;br /&gt;&lt;br /&gt;        #if (self.gforces == 1): self.makeGforces()    # Check Global Forces option.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        # Basic Vehicle model type: follower&lt;br /&gt;        #____________________________&lt;br /&gt;        followers = []&lt;br /&gt;        for i in range(FvNumber):&lt;br /&gt;            v = self.createVehicle(i, "F")&lt;br /&gt;            followers.append(v)&lt;br /&gt;&lt;br /&gt;        # Basic Vehicle model type: Leader&lt;br /&gt;        #_________________________________&lt;br /&gt;        #leaders = []&lt;br /&gt;        #for i in range(LvNumber):&lt;br /&gt;        #    v = self.createVehicle(i, "L")&lt;br /&gt;        #    leaders.append(v)&lt;br /&gt;        ##########################&lt;br /&gt;        # Connect the fields nested loops.&lt;br /&gt;        # ________________________________       &lt;br /&gt;        '''&lt;br /&gt;        for i in range(LvNumber):        # Connect Leaders to Followers both fields.&lt;br /&gt;            fieldL = leaders[i][1]&lt;br /&gt;            fieldLG = leaders[i][2]&lt;br /&gt;            for j in range(FvNumber):&lt;br /&gt;                rigidF = followers[j][0]&lt;br /&gt;                cmds.connectDynamic(rigidF, fields=fieldL)&lt;br /&gt;                cmds.connectDynamic(rigidF, fields=fieldLG)&lt;br /&gt;               &lt;br /&gt;               &lt;br /&gt;               &lt;br /&gt;               &lt;br /&gt;       &lt;br /&gt;        for i in range(FvNumber):        # Connect Followers to Leaders&lt;br /&gt;            fieldF = followers[i][1]&lt;br /&gt;            for j in range(LvNumber):&lt;br /&gt;                rigidL = leaders[j][0]&lt;br /&gt;                cmds.connectDynamic(rigidL, fields=fieldF)&lt;br /&gt;               &lt;br /&gt;               &lt;br /&gt;        # Connect same type Vehicles to each other. Disconnect Vehicle from itself.&lt;br /&gt;&lt;br /&gt;        for i in range(LvNumber):           # Connect Leaders to Leaders&lt;br /&gt;            rigidL1 = leaders[i][0]&lt;br /&gt;            fieldL1 = leaders[i][1]&lt;br /&gt;            for j in range(LvNumber):&lt;br /&gt;                rigidL2 = leaders[j][0]&lt;br /&gt;                fieldL2 = leaders[j][1]&lt;br /&gt;                cmds.connectDynamic(rigidL2, fields=fieldL1)&lt;br /&gt;&lt;br /&gt;            cmds.connectDynamic(rigidL1, delete=1, fields=fieldL1)&lt;br /&gt;        '''&lt;br /&gt;        for i in range(FvNumber):           # Connect Follower to Followers&lt;br /&gt;            rigidF1 = followers[i][0]&lt;br /&gt;            fieldF1 = followers[i][1]&lt;br /&gt;            for j in range(FvNumber):&lt;br /&gt;                rigidF2 = followers[j][0]&lt;br /&gt;                fieldF2 = followers[j][1]&lt;br /&gt;                cmds.connectDynamic(rigidF2, fields=fieldF1)&lt;br /&gt;&lt;br /&gt;            cmds.connectDynamic(rigidF1, delete=1, fields=fieldF1)&lt;br /&gt;           &lt;br /&gt;        ########################################################################################  skip this global forces thing&lt;br /&gt;        # Connect the Global Forces to both types of Vehicles if option is on.&lt;br /&gt;&lt;br /&gt;        if self.gforces:&lt;br /&gt;            self.makeGforces()&lt;br /&gt;       &lt;br /&gt;            compass =  [ "N", "S", "E", "W" ]&lt;br /&gt;            for i in range(LvNumber):   &lt;br /&gt;                for c in range(len(compass)):&lt;br /&gt;                    cmds.connectDynamic(leaders[i][0], fields = "Gforce" + compass[c])&lt;br /&gt;           &lt;br /&gt;            for i in range(FvNumber):   &lt;br /&gt;                for c in range(len(compass)):&lt;br /&gt;                    cmds.connectDynamic(followers[i][0], fields = "Gforce" + compass[c])&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        # Build Obstacles if option is selected.&lt;br /&gt;        if self.obst: self.collectObstacles()&lt;br /&gt;&lt;br /&gt;        # Disable warning.&lt;br /&gt;&lt;br /&gt;        cmds.cycleCheck(e=0)&lt;br /&gt;       &lt;br /&gt;    # End of createCrowd def&lt;br /&gt;   &lt;br /&gt;    def collectObstacles(self):&lt;br /&gt;        print "collecting obstacles!!"&lt;br /&gt;        if len(self.collectObjects) == 0:   ### show on __init__ def&lt;br /&gt;            return "No obstacle objects were selected."&lt;br /&gt;        else:&lt;br /&gt;            print "elseeeee"&lt;br /&gt;            for ob in self.collectObjects:&lt;br /&gt;                print ob&lt;br /&gt;                cmds.rigidBody(ob, passive=1, name= ob + "_RigidB", bounciness=2.0)&lt;br /&gt;               &lt;br /&gt;    #end def collectObstacles&lt;br /&gt;   &lt;br /&gt;   &lt;br /&gt;    # Make Global Forces with an interface.&lt;br /&gt;    #______________________________________&lt;br /&gt;   &lt;br /&gt;   &lt;br /&gt;    ########################################### UI functions (for radio buttons)&lt;br /&gt;    def changeVnumber(self, *args):&lt;br /&gt;        if args[0] == "true":&lt;br /&gt;            self.vNumber = 10&lt;br /&gt;        else:&lt;br /&gt;            self.vNumber = 20&lt;br /&gt;        print "vNumber:",self.vNumber   &lt;br /&gt;    def changeObst(self, *args):&lt;br /&gt;        if args[0] == "true":&lt;br /&gt;            self.obst = 1&lt;br /&gt;        else:&lt;br /&gt;            self.obst = 0&lt;br /&gt;        print "Obst:", self.obst&lt;br /&gt;    def changeGforces(self, *args):&lt;br /&gt;        if args[0] == "true":&lt;br /&gt;            self.gforces = 1&lt;br /&gt;        else:&lt;br /&gt;            self.gforces = 0&lt;br /&gt;        print "gforces:", self.gforces&lt;br /&gt;    def deleteUI(self, *args):&lt;br /&gt;        cmds.deleteUI(self.UIelements["window"])&lt;br /&gt;        self.UIelements = {}&lt;br /&gt;&lt;br /&gt;############### call the class&lt;br /&gt;c = Crowd()&lt;br /&gt;&lt;br /&gt;And part of the second attempt:&lt;br /&gt;&lt;br /&gt;import maya.cmds as cmds&lt;br /&gt;import maya.mel as mel&lt;br /&gt;import random&lt;br /&gt;import math&lt;br /&gt;&lt;br /&gt;def hit(hit, agent):&lt;br /&gt;    ### define what to do when it some collision is detected&lt;br /&gt;    #all transformations are made only on the agent, as the hit object will perform the same queries on this agent&lt;br /&gt;    #if it hit the cube, ignore&lt;br /&gt;    if hit == "wall_rigid":&lt;br /&gt;        return&lt;br /&gt;    agentRole = cmds.getAttr(agent + ".role")&lt;br /&gt;    hitRole = cmds.getAttr(hit + ".role")&lt;br /&gt;    if hitRole == agentRole:&lt;br /&gt;        #check if both are bad&lt;br /&gt;        if hitRole == "bad":&lt;br /&gt;            #then shrink&lt;br /&gt;            cmds.scale(.9,.9,.9, agent, r=1)&lt;br /&gt;        else:&lt;br /&gt;            #if good, increase size&lt;br /&gt;            cmds.scale(1.1,1.1,1.1, agent, r=1)&lt;br /&gt;    elif hitRole != agentRole:&lt;br /&gt;        if hitRole == "bad":&lt;br /&gt;            #means agent role is good&lt;br /&gt;            cmds.scale(.90,.90,.90, agent, r=1)&lt;br /&gt;        elif hitRole == "good":&lt;br /&gt;            #means agent was bad&lt;br /&gt;            cmds.scale(1.1,1.1,1.1, agent, r=1)&lt;br /&gt;&lt;br /&gt;           &lt;br /&gt;#function to create shader&lt;br /&gt;def createShader(color, transparency=0, type="lambert"):&lt;br /&gt;    #steps to create a new material&lt;br /&gt;    shadingNode1 = cmds.shadingNode(type, asShader=1)&lt;br /&gt;    shadingNode2 = cmds.sets(renderable=1, noSurfaceShader = 1, empty=1, name=shadingNode1+"SG")&lt;br /&gt;    cmds.connectAttr(shadingNode1+".outColor", shadingNode2 + ".surfaceShader", force=1)&lt;br /&gt;    #steps to modify material attributes&lt;br /&gt;    cmds.setAttr(shadingNode1 + ".color", color[0],color[1], color[2]) #color in r g b values&lt;br /&gt;    cmds.setAttr(shadingNode1 + ".transparency", transparency, transparency, transparency)&lt;br /&gt;   &lt;br /&gt;    return shadingNode2&lt;br /&gt;   &lt;br /&gt;def applyShaderOnObject(obj, shader):&lt;br /&gt;    cmds.sets(obj, e=1, forceElement=shader)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class Agent:&lt;br /&gt;    def __init__(self, solver, role, position=(0,0,0), size=(3,3,3), color=(0,0,0), objType="cube", rigidType="active", bounciness=.6, collide=1):&lt;br /&gt;        #set agent atributes&lt;br /&gt;        self.bounciness = bounciness&lt;br /&gt;        self.collide = collide&lt;br /&gt;        self.rigidType = rigidType&lt;br /&gt;        self.solver=solver&lt;br /&gt;        self.role = role&lt;br /&gt;        self.initialScale = size&lt;br /&gt;        #create the agent and scale it&lt;br /&gt;        self.object = cmds.polySphere(ax=(0,0,1))&lt;br /&gt;        cmds.scale(size[0], size[1], size[2])&lt;br /&gt;        #apply a color to the agent&lt;br /&gt;        #set the object color&lt;br /&gt;        sh = createShader(color, transparency=0, type="lambert")&lt;br /&gt;        applyShaderOnObject(self.object[0], sh)&lt;br /&gt;       &lt;br /&gt;        #create the rigid body&lt;br /&gt;        self.rigid = cmds.rigidBody(self.object,&lt;br /&gt;                                    name=self.object[0] + "_rigid",&lt;br /&gt;                                    p=position,&lt;br /&gt;                                    b=self.bounciness,&lt;br /&gt;                                    impulse=(0,0,0),&lt;br /&gt;                                    sio=objType, #stand in object&lt;br /&gt;                                    cc = 1, #contact count&lt;br /&gt;                                    cp = 1, #contact position&lt;br /&gt;                                    cn = 1, #contact name&lt;br /&gt;                                    solver=self.solver)&lt;br /&gt;                                   &lt;br /&gt;        #add attribute to the rigid body to store the type of agent&lt;br /&gt;        cmds.select(self.rigid, r=1)&lt;br /&gt;        cmds.addAttr(ln="role", dt="string", keyable=1)&lt;br /&gt;        cmds.setAttr(self.rigid + ".role", "good", type="string")&lt;br /&gt;&lt;br /&gt;        if self.rigidType == "active":&lt;br /&gt;            cmds.setAttr(self.rigid + ".active", 1)&lt;br /&gt;        else:&lt;br /&gt;            cmds.setAttr(self.rigid + ".active", 0)&lt;br /&gt;           &lt;br /&gt;        #apply the expression&lt;br /&gt;        self.applyExpression()&lt;br /&gt;   &lt;br /&gt;    def applyExpression(self):&lt;br /&gt;        "Function to apply the expression to the agent"&lt;br /&gt;        #first disconnect the rotation attributes because we want to controll it via expressions&lt;br /&gt;        cmds.disconnectAttr (self.rigid + "ry.output", self.object[0] + ".rotateY")&lt;br /&gt;        cmds.disconnectAttr (self.rigid + "rx.output", self.object[0] +  ".rotateX")&lt;br /&gt;        cmds.disconnectAttr (self.rigid + "rz.output", self.object[0] + ".rotateZ")&lt;br /&gt;        # Create expression for VehicleF with a random multiplier added to the expression.&lt;br /&gt;        randX = random.uniform(-3,3)&lt;br /&gt;        randY = random.uniform(3,-3)&lt;br /&gt;        ####COMPOSE THE EXPRESSION STRING&lt;br /&gt;        #this is how it should look like (in MEL)&lt;br /&gt;        '''&lt;br /&gt;        // Set wander motion of vehicle and add random multipliers.&lt;br /&gt;        pCube1_rigid_0.impulseX = sin(time * -2.808801);&lt;br /&gt;        pCube1_rigid_0.impulseY = (noise(time) * -1.041035);&lt;br /&gt;&lt;br /&gt;        // Set orientation of Vehicle according to the velocity direction.&lt;br /&gt;        float $fVel[];&lt;br /&gt;        $fVel  = `getAttr pCube1_rigid_0.velocity`;&lt;br /&gt;&lt;br /&gt;        pCube1.rotateX = 0;&lt;br /&gt;        pCube1.rotateZ = atan2d( $fVel[0], $fVel[1] );&lt;br /&gt;        pCube1.rotateY = 0;&lt;br /&gt;       &lt;br /&gt;        //checking bumps on other agents&lt;br /&gt;        string $lastHit;&lt;br /&gt;        if (pCube1_rigid_0.contactCount &gt; 0){&lt;br /&gt;            int $contactCount = `getAttr pCube1_rigid_0.contactCount`;&lt;br /&gt;            $lastHit = `getAttr pCube1_rigid_0.contactName[0]`;&lt;br /&gt;            string $rigid = "pCube1_rigid_0";&lt;br /&gt;            python("hit('"+$lastHit+"', '"+ $rigid +"')");&lt;br /&gt;        };//endif&lt;br /&gt;        '''&lt;br /&gt;        #now put the text above in a python string&lt;br /&gt;        #the first lines define how the agent will wander&lt;br /&gt;        expString = "// Set wander motion of vehicle and add random multipliers.\n"&lt;br /&gt;        expString += "%s.impulseX" % self.rigid&lt;br /&gt;        expString += " = sin(time * %f);\n" % randX&lt;br /&gt;        expString += "%s.impulseY" % self.rigid&lt;br /&gt;        expString += " = (noise(time) * %f);\n\n" % randY&lt;br /&gt;        #the second part, how it rotates according to the direction it is going (velocity vector)&lt;br /&gt;        expString += "// Set orientation of Vehicle according to the velocity direction.\n"&lt;br /&gt;        expString += "float $fVel[];\n"&lt;br /&gt;        expString += "$fVel  = `getAttr %s.velocity`;\n\n" % (self.rigid)&lt;br /&gt;        expString += "%s.rotateX = 0;\n" % self.object[0]&lt;br /&gt;        expString += "%s.rotateZ = atan2d( $fVel[0], $fVel[1] );\n" % (self.object[0])&lt;br /&gt;        expString += "%s.rotateY = 0;\n\n" % self.object[0]&lt;br /&gt;        #the third part, checking bumps on other agents&lt;br /&gt;        expString += "//checking bumps on other agents\n"&lt;br /&gt;        expString += "string $lastHit;\n"&lt;br /&gt;        expString += "if (%s.contactCount &gt; 0){\n" % self.rigid&lt;br /&gt;        expString += "  int $contactCount = `getAttr %s.contactCount`;\n" % self.rigid&lt;br /&gt;        expString += "  $lastHit = `getAttr %s.contactName[0]`;\n" %self.rigid&lt;br /&gt;        expString += '  string $rigid = "%s";\n' % self.rigid&lt;br /&gt;        expString += '  python("hit(\'"+$lastHit+"\', \'"+ $rigid +"\')");\n'&lt;br /&gt;        expString += "};//endif\n"&lt;br /&gt;       &lt;br /&gt;        self.expString = expString&lt;br /&gt;        cmds.expression(s=expString)       &lt;br /&gt;       &lt;br /&gt;&lt;br /&gt;##############################################&lt;br /&gt;class Crowd:&lt;br /&gt;    def __init__(self, numAgents=20, minPosition=-70, maxPosition=70, walls=0):&lt;br /&gt;        #set the playback options to increase the time range&lt;br /&gt;        cmds.playbackOptions(min= 1, max=5000)&lt;br /&gt;        self.numAgents = numAgents&lt;br /&gt;        self.minPosition = minPosition&lt;br /&gt;        self.maxPosition = maxPosition&lt;br /&gt;        #get any selected objects&lt;br /&gt;        self.wallObjs = cmds.ls(sl=1)&lt;br /&gt;        #create the rigid solver&lt;br /&gt;        self.solver = self.createSolver()&lt;br /&gt;        #create the agents&lt;br /&gt;        self.createAgents()&lt;br /&gt;        #create the walls&lt;br /&gt;        if walls: self.makeWalls()&lt;br /&gt;       &lt;br /&gt;    def createSolver(self):&lt;br /&gt;        solver = cmds.rigidSolver(    create=1,&lt;br /&gt;                                                current=1,&lt;br /&gt;                                                name="crowdSolver",&lt;br /&gt;                                                velocityVectorScale=0.5,&lt;br /&gt;                                                displayVelocity=1,&lt;br /&gt;                                                sc=1, #showcollision&lt;br /&gt;                                                ctd=1 #contact data&lt;br /&gt;                                                )&lt;br /&gt;        cmds.setAttr(solver + ".allowDisconnection", 1)&lt;br /&gt;        return solver&lt;br /&gt;       &lt;br /&gt;    def createAgents(self):&lt;br /&gt;        type1 = ["good", (3,3,3), (250,100,0)] #name, scale, color&lt;br /&gt;        type2 = ["bad", (5,5,5), (100,100,100)]&lt;br /&gt;        types = [type1, type2]&lt;br /&gt;        self.badAgents = []&lt;br /&gt;        self.goodAgents = []&lt;br /&gt;        for i in range(self.numAgents):&lt;br /&gt;            #get the agent type randomly&lt;br /&gt;            at = random.choice(types)&lt;br /&gt;            #get random x and y&lt;br /&gt;            x = random.uniform(self.minPosition,self.maxPosition)&lt;br /&gt;            y = random.uniform(self.minPosition,self.maxPosition)&lt;br /&gt;            #create the agents&lt;br /&gt;            a = Agent(self.solver, at[0], color=at[2], size=at[1], position=(x,y,0))&lt;br /&gt;            if at[0] == "good":&lt;br /&gt;                self.goodAgents.append(a)&lt;br /&gt;            else:&lt;br /&gt;                self.badAgents.append(a)&lt;br /&gt;       &lt;br /&gt;    def makeWalls(self):&lt;br /&gt;        #get selected object,&lt;br /&gt;        #which should be already with its normals facing to the right directions,&lt;br /&gt;        #and convert it to passive rigid bodies&lt;br /&gt;        if len(self.wallObjs) == 0:&lt;br /&gt;            return "No wall objects were selected."&lt;br /&gt;        else:&lt;br /&gt;            for w in self.wallObjs:&lt;br /&gt;                self.wallRigid = cmds.rigidBody(w, passive=1, name= "wall_rigid", bounciness=.8)&lt;br /&gt;           &lt;br /&gt;########################################&lt;br /&gt;c=Crowd(numAgents=30, walls=1)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-6334803241818880850?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/6334803241818880850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/07/predator-prey-crowd-system.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/6334803241818880850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/6334803241818880850'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/07/predator-prey-crowd-system.html' title='Predator-Prey crowd system'/><author><name>Tudor</name><uri>http://www.blogger.com/profile/14766722343631674567</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_mg0pJcUsrJ0/SPP1rrTZ_0I/AAAAAAAAAAo/7XdqQ0U38fI/S220/io3.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_mg0pJcUsrJ0/SldslADfPnI/AAAAAAAAAfE/uGcpgcP7AzI/s72-c/swarms001.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-1455242184655226925</id><published>2009-07-09T03:12:00.000+02:00</published><updated>2009-07-09T03:13:05.733+02:00</updated><title type='text'></title><content type='html'>##### Bacteria War _ crowd systems&lt;br /&gt;#### started 20:21 08.07.09&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;### import all possibly needed&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;### Super Plan&lt;br /&gt;###Passive agents:&lt;br /&gt;##                 BODY (obstacles__rigid body)&lt;br /&gt;##                 BRAIN (finish area__rigid body)&lt;br /&gt;##Active agents:&lt;br /&gt;##                 BACTERIUM (agent type1)&lt;br /&gt;##                 DRUG (agent type2) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#####################################TRANSLATING into script&lt;br /&gt;####create "BODY" and Agent 3d(small - Bacterium, big - Drug)&lt;br /&gt;#### have them on stage&lt;br /&gt;### rename 3d objects&lt;br /&gt;### run script&lt;br /&gt;&lt;br /&gt;import maya.cmds as cmds&lt;br /&gt;import maya.mel as mel&lt;br /&gt;import random&lt;br /&gt;import math&lt;br /&gt;&lt;br /&gt;def hit(hit, agent):&lt;br /&gt; ### define what to do when it some collision is detected&lt;br /&gt; #if it hit the body, ignore&lt;br /&gt; if hit == "wall_rigid":&lt;br /&gt;  return&lt;br /&gt; agentRole = cmds.getAttr(agent + ".role")&lt;br /&gt; hitRole = cmds.getAttr(hit + ".role")&lt;br /&gt; if hitRole == agentRole:&lt;br /&gt;  #check if both are Drugs&lt;br /&gt;  if hitRole == "Drug":&lt;br /&gt;   #then rotate&lt;br /&gt;   cmds.rotate(90,90,0)&lt;br /&gt;  else:&lt;br /&gt;   #if Bacteria, delete Bacteria&lt;br /&gt;   cmds.delete('agent')&lt;br /&gt; elif hitRole != agentRole:&lt;br /&gt;  if hitRole == "Drug":&lt;br /&gt;   #means agent role is Bacteria&lt;br /&gt;   cmds.duplicate('agent')&lt;br /&gt;   cmds.move(0,0,0)&lt;br /&gt;  elif hitRole == "Bacteria":&lt;br /&gt;   #means agent was Drug&lt;br /&gt;   cmds.delete('agent')&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class Agent:&lt;br /&gt; def __init__(self, solver, role, position=(0,0,0), size=(3,3,3), color=(0,0,0), objType="agent", rigidType="active", bounciness=.6, collide=1):&lt;br /&gt;  #set agent atributes&lt;br /&gt;  self.bounciness = bounciness&lt;br /&gt;  self.collide = collide&lt;br /&gt;  self.rigidType = rigidType&lt;br /&gt;  self.solver=solver&lt;br /&gt;  self.role = role&lt;br /&gt;  self.initialScale = size&lt;br /&gt;  #create the agent and scale it&lt;br /&gt;  NameDubObj1 = []&lt;br /&gt;  myDubObj1 = cmds.duplicate( 'agent' )# creation ( dublication) of the elements (bacteria/drug)&lt;br /&gt;  self.object = myDubObj1&lt;br /&gt;  cmds.scale(size[0], size[1], size[2])&lt;br /&gt;  &lt;br /&gt;  #create the rigid body&lt;br /&gt;  self.rigid = cmds.rigidBody(self.object, &lt;br /&gt;         name=self.object[0] + "_rigid",&lt;br /&gt;         p=position, &lt;br /&gt;         b=self.bounciness, &lt;br /&gt;         impulse=(0,0,0),&lt;br /&gt;         sio=objType, #stand in object&lt;br /&gt;         cc = 1, #contact count&lt;br /&gt;         cp = 1, #contact position&lt;br /&gt;         cn = 1, #contact name&lt;br /&gt;         solver=self.solver)&lt;br /&gt;         &lt;br /&gt;  #add attribute to the rigid body to store the type of agent&lt;br /&gt;  cmds.select(self.rigid, r=1)&lt;br /&gt;  cmds.addAttr(ln="role", dt="string", keyable=1)&lt;br /&gt;  cmds.setAttr(self.rigid + ".role", "Bacteria", type="string")&lt;br /&gt;&lt;br /&gt;  if self.rigidType == "active":&lt;br /&gt;   cmds.setAttr(self.rigid + ".active", 1)&lt;br /&gt;  else:&lt;br /&gt;   cmds.setAttr(self.rigid + ".active", 0)&lt;br /&gt;   &lt;br /&gt;  #apply the expression&lt;br /&gt;  self.applyExpression()&lt;br /&gt; &lt;br /&gt; def applyExpression(self):&lt;br /&gt;  "Function to apply the expression to the agent"&lt;br /&gt;  #first disconnect the rotation attributes because we want to controll it via expressions&lt;br /&gt;  cmds.disconnectAttr (self.rigid + "ry.output", self.object[0] + ".rotateY")&lt;br /&gt;  cmds.disconnectAttr (self.rigid + "rx.output", self.object[0] +  ".rotateX")&lt;br /&gt;  cmds.disconnectAttr (self.rigid + "rz.output", self.object[0] + ".rotateZ")&lt;br /&gt;  # Create expression for VehicleF with a random multiplier added to the expression.&lt;br /&gt;  randX = random.uniform(-1,1)&lt;br /&gt;  randY = random.uniform(1,-1)&lt;br /&gt;  &lt;br /&gt;  #the first lines define how the agent will wander&lt;br /&gt;  expString = "// Set wander motion of vehicle and add random multipliers.\n"&lt;br /&gt;  expString += "%s.impulseX" % self.rigid&lt;br /&gt;  expString += " = sin(time * %f);\n" % randX&lt;br /&gt;  expString += "%s.impulseY" % self.rigid&lt;br /&gt;  expString += " = (noise(time) * %f);\n\n" % randY&lt;br /&gt;  #the second part, how it rotates according to the direction it is going (velocity vector)&lt;br /&gt;  expString += "// Set orientation of Vehicle according to the velocity direction.\n"&lt;br /&gt;  expString += "float $fVel[];\n"&lt;br /&gt;  expString += "$fVel  = `getAttr %s.velocity`;\n\n" % (self.rigid)&lt;br /&gt;  expString += "%s.rotateX = 0;\n" % self.object[0]&lt;br /&gt;  expString += "%s.rotateZ = atan2d( $fVel[0], $fVel[1] );\n" % (self.object[0])&lt;br /&gt;  expString += "%s.rotateY = 0;\n\n" % self.object[0]&lt;br /&gt;  #the third part, checking bumps on other agents&lt;br /&gt;  expString += "//checking bumps on other agents\n"&lt;br /&gt;  expString += "string $lastHit;\n"&lt;br /&gt;  expString += "if (%s.contactCount &gt; 0){\n" % self.rigid&lt;br /&gt;  expString += "  int $contactCount = `getAttr %s.contactCount`;\n" % self.rigid&lt;br /&gt;  expString += "  $lastHit = `getAttr %s.contactName[0]`;\n" %self.rigid&lt;br /&gt;  expString += '  string $rigid = "%s";\n' % self.rigid&lt;br /&gt;  expString += '  python("hit(\'"+$lastHit+"\', \'"+ $rigid +"\')");\n'&lt;br /&gt;  expString += "};//endif\n"&lt;br /&gt;  &lt;br /&gt;  self.expString = expString&lt;br /&gt;  cmds.expression(s=expString)  &lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;##############################################&lt;br /&gt;class Crowd:&lt;br /&gt; def __init__(self, numAgents=4, minPosition=-20, maxPosition=20, walls=0):&lt;br /&gt;  #set the playback options to increase the time range&lt;br /&gt;  cmds.playbackOptions(min= 1, max=5000)&lt;br /&gt;  self.numAgents = numAgents&lt;br /&gt;  self.minPosition = minPosition&lt;br /&gt;  self.maxPosition = maxPosition&lt;br /&gt;  #get any selected objects&lt;br /&gt;  self.wallObjs = cmds.ls(sl=1)&lt;br /&gt;  #create the rigid solver&lt;br /&gt;  self.solver = self.createSolver()&lt;br /&gt;  #create the agents&lt;br /&gt;  self.createAgents()&lt;br /&gt;  #create the walls&lt;br /&gt;  if walls: self.makeWalls()&lt;br /&gt;  &lt;br /&gt; def createSolver(self):&lt;br /&gt;  solver = cmds.rigidSolver( create=1, &lt;br /&gt;            current=1,&lt;br /&gt;            name="crowdSolver",&lt;br /&gt;            velocityVectorScale=0.5,&lt;br /&gt;            displayVelocity=1,&lt;br /&gt;            sc=1, #showcollision&lt;br /&gt;            ctd=1 #contact data&lt;br /&gt;            )&lt;br /&gt;  cmds.setAttr(solver + ".allowDisconnection", 1)&lt;br /&gt;  return solver&lt;br /&gt;  &lt;br /&gt; def createAgents(self):&lt;br /&gt;  type1 = ["Bacteria", (1,1,1), (1,1,0)] #name, scale, color&lt;br /&gt;  type2 = ["Drug", (5,5,5), (.6,.6,.6)]&lt;br /&gt;  types = [type1, type2]&lt;br /&gt;  self.DrugAgents = []&lt;br /&gt;  self.BacteriaAgents = []&lt;br /&gt;  for i in range(self.numAgents):&lt;br /&gt;   #get the agent type randomly&lt;br /&gt;   at = random.choice(types) &lt;br /&gt;   #get random x and y&lt;br /&gt;   x = random.uniform(self.minPosition,self.maxPosition)&lt;br /&gt;   y = random.uniform(self.minPosition,self.maxPosition)&lt;br /&gt;   #create the agents&lt;br /&gt;   a = Agent(self.solver, at[0], color=at[2], size=at[1], position=(x,y,0))&lt;br /&gt;   if at[0] == "Bacteria":&lt;br /&gt;    self.BacteriaAgents.append(a)&lt;br /&gt;   else:&lt;br /&gt;    self.DrugAgents.append(a)&lt;br /&gt;  &lt;br /&gt; def makeWalls(self):&lt;br /&gt;  #get selected object, &lt;br /&gt;  #which should be already with its normals facing to the right directions, &lt;br /&gt;  #and convert it to passive rigid bodies&lt;br /&gt;  if len(self.wallObjs) == 0: &lt;br /&gt;   return "No wall objects were selected."&lt;br /&gt;  else:&lt;br /&gt;   for w in self.wallObjs:&lt;br /&gt;    self.wallRigid = cmds.rigidBody(w, passive=1, name= "wall_rigid", bounciness=.8)&lt;br /&gt;   &lt;br /&gt;########################################&lt;br /&gt;c=Crowd(numAgents=4, walls=1)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-1455242184655226925?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/1455242184655226925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/07/bacteria-war-crowd-systems-started-2021.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/1455242184655226925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/1455242184655226925'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/07/bacteria-war-crowd-systems-started-2021.html' title=''/><author><name>Anastasia Globa</name><uri>https://profiles.google.com/103588731693715960502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-KXLHi4wdi4w/AAAAAAAAAAI/AAAAAAAABBE/ASpfZ48C_ow/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-7156740510657115767</id><published>2009-07-08T01:29:00.001+02:00</published><updated>2009-07-08T01:29:30.411+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='announcements'/><title type='text'>Assignment 03B - Final</title><content type='html'>&lt;p&gt;As a continuation of the final assignment, you should now try to script your idea. Most of the ideas posted deal with collisions, and reactions according to those collisions. As this was not part of our original crowd system example given in class, here is an example script which deals with collision detection:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://groups.google.com/group/gsii_ss09/web/cs_help.py"&gt;cs_help.py&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Here is also an example .mb file where the system above is already placed in the scene:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://groups.google.com/group/gsii_ss09/web/cs_help.mb"&gt;cs_help.mb&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The rule which deals with the collision can be found in the hit function, right in the beginning of the script. this system not perfect, has tons of caveats, but you can get the idea.&lt;/p&gt;  &lt;p&gt;In this script you can also see how to create an enclosure for your agents, something such as a box which contains the whole system inside, so that your agents are &amp;quot;trapped&amp;quot;. &lt;/p&gt;  &lt;p&gt;If you have too much difficulty, post your doubt on the blog. I'll check it daily to answer it!&lt;/p&gt;  &lt;p&gt;The deadline for this assignment is this &lt;strong&gt;Sunday (12.07)&lt;/strong&gt;. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-7156740510657115767?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/7156740510657115767/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/07/assignment-03b-final.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/7156740510657115767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/7156740510657115767'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/07/assignment-03b-final.html' title='Assignment 03B - Final'/><author><name>danrocha</name><uri>http://www.blogger.com/profile/04468836977853242830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-5134917069918550262</id><published>2009-07-08T01:16:00.001+02:00</published><updated>2009-07-08T01:16:30.886+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='announcements'/><title type='text'>w08 - script</title><content type='html'>&lt;p&gt;Here is the finalized script for the crowd system done in the past two classes. It also includes the global forces option in it. For details, read the comments.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://groups.google.com/group/gsii_ss09/web/crowdSystem.py"&gt;crowdSystem.py&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-5134917069918550262?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/5134917069918550262/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/07/w08-script.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/5134917069918550262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/5134917069918550262'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/07/w08-script.html' title='w08 - script'/><author><name>danrocha</name><uri>http://www.blogger.com/profile/04468836977853242830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-5537493303662912077</id><published>2009-07-05T16:25:00.006+02:00</published><updated>2009-07-05T17:37:48.095+02:00</updated><title type='text'>Assignment 03 A - Biennale Self Organization System - Alexandra and Mircea</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/_ZSYzPEUPVm4/SlC-ID_9zRI/AAAAAAAAAWw/Ns8BA5qMTcQ/s1600-h/03A+assignment.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5354989002665348370" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; HEIGHT: 189px; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_ZSYzPEUPVm4/SlC-ID_9zRI/AAAAAAAAAWw/Ns8BA5qMTcQ/s400/03A+assignment.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_ZSYzPEUPVm4/SlC-BeKcmxI/AAAAAAAAAWo/2GIABHE9z2Y/s1600-h/a.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5354988889429547794" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; HEIGHT: 188px; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_ZSYzPEUPVm4/SlC-BeKcmxI/AAAAAAAAAWo/2GIABHE9z2Y/s400/a.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_ZSYzPEUPVm4/SlC96wtj7AI/AAAAAAAAAWg/wrNGa8Q5-wM/s1600-h/b.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5354988774149581826" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; HEIGHT: 189px; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_ZSYzPEUPVm4/SlC96wtj7AI/AAAAAAAAAWg/wrNGa8Q5-wM/s400/b.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-5537493303662912077?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/5537493303662912077/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/07/assignment-03-biennale-self.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/5537493303662912077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/5537493303662912077'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/07/assignment-03-biennale-self.html' title='Assignment 03 A - Biennale Self Organization System - Alexandra and Mircea'/><author><name>alexandra virlan</name><uri>http://www.blogger.com/profile/07826702946109365185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/-Kxco3AGM9F4/TVkNwXHhRCI/AAAAAAAAAbk/8dMS0nu4xvA/s220/60961_1579924174077_1114837832_31660390_6247364_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_ZSYzPEUPVm4/SlC-ID_9zRI/AAAAAAAAAWw/Ns8BA5qMTcQ/s72-c/03A+assignment.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-1000425947033475549</id><published>2009-07-05T14:42:00.002+02:00</published><updated>2009-07-05T14:43:52.921+02:00</updated><title type='text'>BACTERIUM WAR</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_1qBy3zIG0ec/SlCf-9A2wCI/AAAAAAAAAno/zIQWKPAcTpM/s1600-h/SELFORGANIZING1.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 285px;" src="http://4.bp.blogspot.com/_1qBy3zIG0ec/SlCf-9A2wCI/AAAAAAAAAno/zIQWKPAcTpM/s400/SELFORGANIZING1.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5354955860822376482" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_1qBy3zIG0ec/SlCf-sJHRWI/AAAAAAAAAng/-T4WGAoNVr4/s1600-h/SELFORGANIZING2.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 285px;" src="http://4.bp.blogspot.com/_1qBy3zIG0ec/SlCf-sJHRWI/AAAAAAAAAng/-T4WGAoNVr4/s400/SELFORGANIZING2.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5354955856293610850" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_1qBy3zIG0ec/SlCf-dKURwI/AAAAAAAAAnY/rmNcnPGsp9s/s1600-h/SELFORGANIZING3.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 285px;" src="http://4.bp.blogspot.com/_1qBy3zIG0ec/SlCf-dKURwI/AAAAAAAAAnY/rmNcnPGsp9s/s400/SELFORGANIZING3.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5354955852272125698" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-1000425947033475549?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/1000425947033475549/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/07/bacterium-war.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/1000425947033475549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/1000425947033475549'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/07/bacterium-war.html' title='BACTERIUM WAR'/><author><name>Anastasia Globa</name><uri>https://profiles.google.com/103588731693715960502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-KXLHi4wdi4w/AAAAAAAAAAI/AAAAAAAABBE/ASpfZ48C_ow/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_1qBy3zIG0ec/SlCf-9A2wCI/AAAAAAAAAno/zIQWKPAcTpM/s72-c/SELFORGANIZING1.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-5819221065610903780</id><published>2009-07-05T14:05:00.006+02:00</published><updated>2009-07-05T14:32:59.501+02:00</updated><title type='text'>Assignment 03A_Alice</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_k6vtLLcz3OQ/SlCc3hhZXNI/AAAAAAAAAdk/RJQtPl68xjk/s1600-h/IMG_1999.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 222px; height: 320px;" src="http://2.bp.blogspot.com/_k6vtLLcz3OQ/SlCc3hhZXNI/AAAAAAAAAdk/RJQtPl68xjk/s320/IMG_1999.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5354952434648702162" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Gill Sans"&gt;This is my initial thought...but I am not sure if my scenairo is too complicated. Represented by simple boxes, it is imitating a situation found in a district or shopping mall. &lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Gill Sans; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Gill Sans"&gt;Agent Type A represents poeple in different age groups. Therefore, in general, they are attracted/repulsed to different programmes, with different speeds. &lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Gill Sans; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Gill Sans"&gt;Agent Type B (passive) represents different programmes we can found either on streets or in a shopping mall. I have just named few in the list. &lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Gill Sans; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Gill Sans"&gt;Things to be defined&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Gill Sans"&gt;- Attraction Level i,e the speed and amount &lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Gill Sans"&gt;- Attraction Duration i.e. how long will Agent A be attached with Agent B&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Gill Sans"&gt;- Attraction Capacity i.e. repulsion occcurs when some Agent B is over-attracted. &lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Gill Sans; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Gill Sans"&gt;Differen types of Agent A should be generated randomly and being replaced along the timeline.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-5819221065610903780?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/5819221065610903780/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/07/assignment-03aalice.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/5819221065610903780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/5819221065610903780'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/07/assignment-03aalice.html' title='Assignment 03A_Alice'/><author><name>alice</name><uri>http://www.blogger.com/profile/13826062750165810811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_k6vtLLcz3OQ/SlCc3hhZXNI/AAAAAAAAAdk/RJQtPl68xjk/s72-c/IMG_1999.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-2674264084510105831</id><published>2009-07-05T12:37:00.001+02:00</published><updated>2009-07-05T12:38:59.013+02:00</updated><title type='text'>Assignment 03A   Shi xinyu &amp; Liu</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_2gY_HsWGQR4/SlCCsACL1kI/AAAAAAAAAe8/FHQHf5DTnh4/s1600-h/diagram03.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 258px; height: 400px;" src="http://2.bp.blogspot.com/_2gY_HsWGQR4/SlCCsACL1kI/AAAAAAAAAe8/FHQHf5DTnh4/s400/diagram03.jpg" alt="" id="BLOGGER_PHOTO_ID_5354923649378539074" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-2674264084510105831?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/2674264084510105831/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/07/assignment-03a-shi-xinyu-liu.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/2674264084510105831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/2674264084510105831'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/07/assignment-03a-shi-xinyu-liu.html' title='Assignment 03A   Shi xinyu &amp; Liu'/><author><name>Liu, Kocheng</name><uri>http://www.blogger.com/profile/06568145659726503765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_2gY_HsWGQR4/S2lJxVY9V0I/AAAAAAAAArI/ahtB3H3aRyc/S220/me1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_2gY_HsWGQR4/SlCCsACL1kI/AAAAAAAAAe8/FHQHf5DTnh4/s72-c/diagram03.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-269308234129181400</id><published>2009-07-01T18:28:00.001+02:00</published><updated>2009-07-01T18:31:00.525+02:00</updated><title type='text'>Agent-based system - applications</title><content type='html'>&lt;p&gt;Here are some examples of the use and study of agent-based, self-organizing systems in architecture:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_XBTenmxMJRs/SkuObSrYsjI/AAAAAAAAGuQ/A-sdRQq-yF4/s1600-h/02%5B11%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="02" border="0" alt="02" src="http://lh5.ggpht.com/_XBTenmxMJRs/SkuOb-Vu6iI/AAAAAAAAGuU/vGg3Y0QgCsM/02_thumb%5B7%5D.png?imgmax=800" width="260" height="148" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_XBTenmxMJRs/SkuOcb9irpI/AAAAAAAAGuY/5tyA0iugrWk/s1600-h/03%5B7%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="03" border="0" alt="03" src="http://lh3.ggpht.com/_XBTenmxMJRs/SkuOcyj4P4I/AAAAAAAAGuk/kVyPieB52D8/03_thumb%5B3%5D.png?imgmax=800" width="260" height="148" /&gt;&lt;/a&gt; &lt;a href="http://lh6.ggpht.com/_XBTenmxMJRs/SkuOdcOtArI/AAAAAAAAGuo/S3MVTFfepkY/s1600-h/04%5B5%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="04" border="0" alt="04" src="http://lh5.ggpht.com/_XBTenmxMJRs/SkuOdtub8_I/AAAAAAAAGu0/Lru0sbQrWXE/04_thumb%5B3%5D.png?imgmax=800" width="260" height="148" /&gt;&lt;/a&gt; &lt;a href="http://lh3.ggpht.com/_XBTenmxMJRs/SkuOeb_O4uI/AAAAAAAAGu8/Xh4XXBZM2Y0/s1600-h/05%5B4%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="05" border="0" alt="05" src="http://lh3.ggpht.com/_XBTenmxMJRs/SkuOeyaUQjI/AAAAAAAAGvE/mMTjb3dbbNk/05_thumb%5B2%5D.png?imgmax=800" width="260" height="147" /&gt;&lt;/a&gt; &lt;a href="http://lh5.ggpht.com/_XBTenmxMJRs/SkuOfWLcY_I/AAAAAAAAGvI/b5oRHw8fCiU/s1600-h/Capture1%5B4%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Capture1" border="0" alt="Capture1" src="http://lh4.ggpht.com/_XBTenmxMJRs/SkuOgBjI0jI/AAAAAAAAGvY/oOt65HUISHI/Capture1_thumb%5B2%5D.png?imgmax=800" width="260" height="147" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The images above are from the project Swarm Urbanism (2008) from &lt;a href="http://kokkugia.com/"&gt;Kokkugia&lt;/a&gt;, a speculative proposal which &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;(...) posits an urban design methodology based on the emergent capacities of Swarm Intelligence in rethinking of the current redevelopment of the Melbourne Docklands. Swarm systems involve the local interaction of autonomous agents, which give rise to emergent behavior and the self-organisation of structures. An application of swarm logic to urbanism enables a shift from notions of the master-plan to that of master-algorithm as an urban design tool. This shift changes the conception of urban design from a sequential set of decisions at reducing scales, to a simultaneous process in which a set of micro or local decisions interact generate a complex urban system. Rather than designing an urban plan that meets a set of criteria, urban imperatives are programmed into a set of agents which are able to self-organise. Consequently this conception of urbanism generates systems that are flexible to respond to the constantly changing political, economic and social pressures of urban development.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_XBTenmxMJRs/SkuOhOPkQKI/AAAAAAAAGts/4BqukrZQeDo/s1600-h/a01%5B2%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="a01" border="0" alt="a01" src="http://lh6.ggpht.com/_XBTenmxMJRs/SkuOhxnHv6I/AAAAAAAAGtw/IZcHG2Ef2j0/a01_thumb.png?imgmax=800" width="244" height="131" /&gt;&lt;/a&gt; &lt;a href="http://lh6.ggpht.com/_XBTenmxMJRs/SkuOiVa9J-I/AAAAAAAAGt0/n-_Uz60ypqs/s1600-h/a02%5B2%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="a02" border="0" alt="a02" src="http://lh3.ggpht.com/_XBTenmxMJRs/SkuOjUj2voI/AAAAAAAAGt4/y9rBjoFrTo0/a02_thumb.png?imgmax=800" width="244" height="87" /&gt;&lt;/a&gt; &lt;a href="http://lh5.ggpht.com/_XBTenmxMJRs/SkuOjxFemrI/AAAAAAAAGt8/A6gbxt4mgGc/s1600-h/a03%5B2%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="a03" border="0" alt="a03" src="http://lh5.ggpht.com/_XBTenmxMJRs/SkuOkc1QRVI/AAAAAAAAGuA/qLQ87dMQZVo/a03_thumb.png?imgmax=800" width="244" height="127" /&gt;&lt;/a&gt; &lt;a href="http://lh4.ggpht.com/_XBTenmxMJRs/SkuOk8iVpMI/AAAAAAAAGuE/3s3yzrIPprg/s1600-h/a04%5B2%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="a04" border="0" alt="a04" src="http://lh4.ggpht.com/_XBTenmxMJRs/SkuOlfnn4bI/AAAAAAAAGuI/EuwuIAksF_U/a04_thumb.png?imgmax=800" width="244" height="131" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Also from &lt;a href="http://kokkugia.com/"&gt;Kokkugia&lt;/a&gt;, the above project (Emergent Fields, 2003), in which&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;(...) Agent-based simulation techniques are used to generate programmatic relationships and an architectonic response to this field of program. Architectural elements such as a façade, plaza, or construction grid are assigned rules or behaviours, which govern the way in which they interact with this field in the form making process. This develops an emergent relationship between program and peculiarities of architectural form, enabling the design process, and resultant architecture to exhibit particular behavioural qualities. &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Also in the research developed by &lt;a href="http://www.spacesyntax.com/"&gt;Space Syntax&lt;/a&gt; together with the &lt;a href="http://www.space.bartlett.ucl.ac.uk/"&gt;Space Group&lt;/a&gt; at Barttlet, we can find &lt;a href="http://www.vr.ucl.ac.uk/research/evas/"&gt;the use&lt;/a&gt; of &lt;a href="http://www.vr.ucl.ac.uk/publications/penn2002-000.html"&gt;agent-based&lt;/a&gt; &lt;a href="http://www.vr.ucl.ac.uk/publications/turner2002-000.html"&gt;systems&lt;/a&gt; to explore pedestrian behaviour within the field of urbanism, flight-routes, programmatic organization, etc.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Space syntax has found that, despite many proposed higher-level cognitive models, there appears to be a fundamental process that informs human and social usage of an environment. In this paper we describe an exosomatic visual architecture, based on space syntax visibility graphs, giving many agents simultaneous access to the same pre-processed information about the configuration of a space layout. Results of experiments in a simulated retail environment show that a surprisingly simple 'random next step' based rule outperforms a more complex 'destination based' rule in reproducing observed human movement behaviour. We conclude that the effects of spatial configuration on movement patterns that space syntax studies have found are consistent with a model of individual decision behaviour based on the spatial affordances offered by the morphology of the local visual field.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;   &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:8e983e0f-2fce-4cc5-b048-c982289e5cf0" class="wlWriterEditableSmartContent"&gt;&lt;div id="daafed63-e589-44dd-807c-fd64496db1bb" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=UKJZF49NLFc&amp;amp;eurl=http%3A%2F%2Fwww.spacesyntax.com%2Fen%2Fservice-offer%2Fshaping-knowledge%2Fresearch.aspx&amp;amp;feature=player_embedded" target="_new"&gt;&lt;img src="http://lh5.ggpht.com/_XBTenmxMJRs/SkuOmGdhf1I/AAAAAAAAGvc/WN5mm10SmXU/video15294c614a38%5B9%5D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('daafed63-e589-44dd-807c-fd64496db1bb'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/UKJZF49NLFc&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/UKJZF49NLFc&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-269308234129181400?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/269308234129181400/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/07/agent-based-system-applications.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/269308234129181400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/269308234129181400'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/07/agent-based-system-applications.html' title='Agent-based system - applications'/><author><name>danrocha</name><uri>http://www.blogger.com/profile/04468836977853242830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_XBTenmxMJRs/SkuOb-Vu6iI/AAAAAAAAGuU/vGg3Y0QgCsM/s72-c/02_thumb%5B7%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-3696344176205130983</id><published>2009-06-23T14:20:00.001+02:00</published><updated>2009-06-23T14:20:53.833+02:00</updated><title type='text'>Assignment 03A</title><content type='html'>&lt;p&gt;In the first part of this assignment, you should think about the logic of a self-organizing system. You should draw diagrams and write the whole logic by which it would work. Here are some guidelines:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Think about local intelligence and local interactions. Each agent will only &amp;quot;look&amp;quot; at its immediate surroundings and make decisions based on these &amp;quot;encounters&amp;quot;. The collective intelligence comes from these local interactions (think ant colonies!)&lt;/li&gt;    &lt;li&gt;Define roles of your agents, or types of agents. Each agent has a set of properties and will react in a certain way when encountering certain other agents. Keep in mind the exponential complexity here: for each agent you should define the action to be taken when it encounters each of the other agents and also agents of the same type (in case there is more than one). So if you have 4 types of agents, you have to think of circa 16 types of interactions&lt;/li&gt;    &lt;li&gt;Think also of passive agents. Obstacles, for example, could be characterized as passive agents: they affect all other agents, but it doesn't react on any way.&lt;/li&gt;    &lt;li&gt;Think of forces of attraction and repulsion, and also on other more complex arrangements (in case one agent encounter a group of other agents combined, for example)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;More important, use your imagination. Produce material which could explain for ANYONE about your idea, and post on the blog. Be as thorough as possible!&lt;/p&gt;  &lt;p&gt;Please post all until Sunday, so you can have it out of the way the following week, and I can use the other week to prepare some help for you!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-3696344176205130983?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/3696344176205130983/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/06/assignment-03a.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/3696344176205130983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/3696344176205130983'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/06/assignment-03a.html' title='Assignment 03A'/><author><name>danrocha</name><uri>http://www.blogger.com/profile/04468836977853242830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-4457076328477673114</id><published>2009-06-23T14:11:00.001+02:00</published><updated>2009-06-23T14:11:43.306+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='announcements'/><title type='text'>w07 - recap + script</title><content type='html'>&lt;p&gt;Yesterday we started looking at our third and final topic: &lt;strong&gt;self-organizing systems&lt;/strong&gt; and &lt;strong&gt;dynamics/expressions&lt;/strong&gt; in Maya. We started some simple crowd system class, and saw some principles of dynamics in Maya (rigid bodies) and expressions (to make objects move).&lt;/p&gt;  &lt;p&gt;Here is the script until the part we accomplish together yesterday:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://groups.google.com/group/gsii_ss09/web/crowdSystem_w07.py"&gt;crowdSystem_w07.py&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In the next class we should finish it by applying &lt;strong&gt;fields forces&lt;/strong&gt; (for attraction and repulsion between elements) and create the desired number of leaders and followers, connecting their dynamic forces to make them &lt;strong&gt;interact&lt;/strong&gt; with each other.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-4457076328477673114?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/4457076328477673114/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/06/w07-recap-script.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/4457076328477673114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/4457076328477673114'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/06/w07-recap-script.html' title='w07 - recap + script'/><author><name>danrocha</name><uri>http://www.blogger.com/profile/04468836977853242830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-2744980887866402251</id><published>2009-06-21T16:40:00.001+02:00</published><updated>2009-06-21T16:40:33.169+02:00</updated><title type='text'>Delaunay Triangulation via Math</title><content type='html'>&lt;p&gt;Here is what was supposed to be your assignment 02B, a class definition to calculate Delaunay triangulations from a set of points by means of mathematical calculations (without the help from Qhull). &lt;/p&gt;  &lt;p&gt;&lt;a href="http://groups.google.com/group/gsii_ss09/web/delaunay.py"&gt;delaunay.py&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;There are several algorithms to approach such problem, some more efficient than others. &lt;a href="http://local.wasp.uwa.edu.au/~pbourke/papers/triangulate/index.html"&gt;This seems to be one of the simplest&lt;/a&gt;, and this class definition is based on it. &lt;/p&gt;  &lt;p&gt;Take some time to study it and check if you understand how it is done. I'll talk about it shortly on next class.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-2744980887866402251?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/2744980887866402251/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/06/delaunay-triangulation-via-math.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/2744980887866402251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/2744980887866402251'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/06/delaunay-triangulation-via-math.html' title='Delaunay Triangulation via Math'/><author><name>danrocha</name><uri>http://www.blogger.com/profile/04468836977853242830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-5104740388329438137</id><published>2009-06-17T13:42:00.001+02:00</published><updated>2009-06-17T13:43:12.340+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='announcements'/><title type='text'>w06 - recap and script</title><content type='html'>&lt;p&gt;Last class we saw how to parse a Delaunay 2D text file generated by qhull and convert it to objects in Maya's stage. Here is the link from the finished script, which also contains the Delaunay3D and ConvexHull classes:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://groups.google.com/group/gsii_ss09/web/qhull_w06.py"&gt;qhull_w06.py&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-5104740388329438137?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/5104740388329438137/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/06/w06-recap-and-script.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/5104740388329438137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/5104740388329438137'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/06/w06-recap-and-script.html' title='w06 - recap and script'/><author><name>danrocha</name><uri>http://www.blogger.com/profile/04468836977853242830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-7612096831378655210</id><published>2009-06-14T21:22:00.012+02:00</published><updated>2009-06-17T13:45:59.780+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='assignments'/><category scheme='http://www.blogger.com/atom/ns#' term='Alec'/><title type='text'>I'm not stupid :-)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_qqt7zCa-76A/SjVUHLtFLKI/AAAAAAAAAcM/n7W-B0eBI-M/s1600-h/Picture+1.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://1.bp.blogspot.com/_qqt7zCa-76A/SjVUHLtFLKI/AAAAAAAAAcM/n7W-B0eBI-M/s400/Picture+1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5347272614950022306" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_qqt7zCa-76A/SjVUG1FwMcI/AAAAAAAAAcE/j0xKkFpeMYc/s1600-h/Picture+2.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://3.bp.blogspot.com/_qqt7zCa-76A/SjVUG1FwMcI/AAAAAAAAAcE/j0xKkFpeMYc/s400/Picture+2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5347272608879489474" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre class="python" name="code"&gt;&lt;br /&gt;import maya.cmds as cmds&lt;br /&gt;&lt;br /&gt;def IsBounded(item):&lt;br /&gt;    for x in item:&lt;br /&gt;        if x &lt; 0:&lt;br /&gt;            return False&lt;br /&gt;    return True&lt;br /&gt; &lt;br /&gt;class delauney:&lt;br /&gt; def __init__(self):&lt;br /&gt;  self.vertices = []&lt;br /&gt;  self.regions = []&lt;br /&gt;  self.dimension = ""&lt;br /&gt;  self.path = "C:/MAYA/"&lt;br /&gt;  print "Instance of class Delauney created."&lt;br /&gt;  &lt;br /&gt; def load(self):&lt;br /&gt;  # Get vertices positions in the points.txt&lt;br /&gt;  &lt;br /&gt;  print "Loading Qhull file..."&lt;br /&gt;  # Open the file and get the second line in order to get the number of vertices&lt;br /&gt;  f = open('C:/MAYA/points.txt', 'r')&lt;br /&gt;  d = f.readline()&lt;br /&gt;  i = f.readline()&lt;br /&gt;  i = int(i.strip())&lt;br /&gt;&lt;br /&gt;  # Get line by line the x, y positions (and z if it exists) &lt;br /&gt;  while i &gt; 0:&lt;br /&gt;   l = f.readline()&lt;br /&gt;   t = l.split()&lt;br /&gt;   pt1 = float(t[0])&lt;br /&gt;   pt2 = float(t[1])&lt;br /&gt;   if len(t) &gt; 2:&lt;br /&gt;    pt3 = float(t[2])&lt;br /&gt;    self.dimension = "3D"&lt;br /&gt;    self.vertices.append([pt1, pt2, pt3])&lt;br /&gt;&lt;br /&gt;   else:&lt;br /&gt;    pt3 = 0&lt;br /&gt;    self.dimension = "2D"&lt;br /&gt;    self.vertices.append([pt1, pt2])    &lt;br /&gt;   i = i-1&lt;br /&gt;  &lt;br /&gt;  # Feedback &lt;br /&gt;  print "&gt;&gt;&gt; RESULTS"&lt;br /&gt;  print len(self.vertices), " vertices ", self.vertices&lt;br /&gt;  &lt;br /&gt;  # Open the qHullResults.txt in order to get the name of the points to join.&lt;br /&gt;  # Get the first number, in order to get number of regions&lt;br /&gt;  # Daniel, I'm sorry for the hardcoding for the names of the files, and for the "region.append(int(t[2]))" if its not a 3D drawing, but i'm really tired&lt;br /&gt;  f = open('C:/MAYA/qHullResults.txt', 'r')&lt;br /&gt;  l = f.readline()&lt;br /&gt;  i = int(l)&lt;br /&gt;  &lt;br /&gt;  # Get line by line the name of the points to join&lt;br /&gt;  while i &gt; 0:&lt;br /&gt;   l = f.readline()&lt;br /&gt;   t = l.split()&lt;br /&gt;   region = []&lt;br /&gt;   j=0&lt;br /&gt;   while j &lt; i:&lt;br /&gt;    region.append(int(t[0]))&lt;br /&gt;    region.append(int(t[1]))&lt;br /&gt;    region.append(int(t[2]))&lt;br /&gt;    j = j + 1&lt;br /&gt;   self.regions.append(region)&lt;br /&gt;   i = i-1&lt;br /&gt;  &lt;br /&gt;  # Feedback &lt;br /&gt;  print len(self.regions), " regions ", self.regions&lt;br /&gt;  f.close()&lt;br /&gt;   &lt;br /&gt; def draw(self):&lt;br /&gt;  # draw a curve between the points to create the regions! &lt;br /&gt;  &lt;br /&gt;  for region in filter(IsBounded, self.regions):&lt;br /&gt;   vs = []&lt;br /&gt;   neg = 0&lt;br /&gt;   &lt;br /&gt;   for i in region:&lt;br /&gt;    if i &lt; 0:&lt;br /&gt;     neg = 1&lt;br /&gt;     break&lt;br /&gt;   &lt;br /&gt;    v = self.vertices[i]&lt;br /&gt;    vs.append(v)&lt;br /&gt;      &lt;br /&gt;   if neg == 0:&lt;br /&gt;    crv = cmds.curve(ep=vs, d=1)&lt;br /&gt;    cmds.closeCurve(crv, rpo=1)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-7612096831378655210?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/7612096831378655210/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/06/im-not-stupid.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/7612096831378655210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/7612096831378655210'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/06/im-not-stupid.html' title='I&apos;m not stupid :-)'/><author><name>alec</name><uri>http://www.blogger.com/profile/09823278314767605002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/_qqt7zCa-76A/SPT1pm42sNI/AAAAAAAAAFw/26kHzdRhX_4/S220/2589578483_d2918fb00c.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_qqt7zCa-76A/SjVUHLtFLKI/AAAAAAAAAcM/n7W-B0eBI-M/s72-c/Picture+1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-2940051525133818466</id><published>2009-06-13T13:42:00.006+02:00</published><updated>2009-06-17T13:46:38.480+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Grisha'/><category scheme='http://www.blogger.com/atom/ns#' term='assignments'/><title type='text'></title><content type='html'>&lt;object width="400" height="300"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=5138686&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1"&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=5138686&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;p&gt;&lt;a href="http://vimeo.com/5138686"&gt;&lt;/a&gt;this is my studio script (using classes). i wrote some more helping scripts in the beginning.&lt;br /&gt;&lt;/p&gt;in the maya scene should be a few locators (which are attraction and repulsion points)&lt;br /&gt;&lt;br /&gt;&lt;pre class="python" name="code"&gt;&lt;br /&gt;import maya.cmds as cmds&lt;br /&gt;import maya.mel as mm&lt;br /&gt;import math&lt;br /&gt;import sys&lt;br /&gt;from random import*&lt;br /&gt;from setColor import*&lt;br /&gt;sys.setrecursionlimit(8000)&lt;br /&gt;&lt;br /&gt;############################################################################################################################&lt;br /&gt;&lt;br /&gt;def centerOfFace(facet):&lt;br /&gt; #find the vertices that define that face.&lt;br /&gt; vertex = cmds.polyListComponentConversion(facet, ff=1, tv=1)&lt;br /&gt; cmds.select(vertex, r=1)&lt;br /&gt; vertexFlat = cmds.ls(sl=1, fl=1)&lt;br /&gt;&lt;br /&gt; #find out how many vertices define that face&lt;br /&gt; vertCount = len(vertexFlat)&lt;br /&gt; #print vertexFlat&lt;br /&gt; &lt;br /&gt; #for each vertex go through and find it's world space position. &lt;br /&gt; vertPositionSumX = 0.&lt;br /&gt; vertPositionSumY = 0.&lt;br /&gt; vertPositionSumZ = 0.&lt;br /&gt; for a in range(0, vertCount, 1):&lt;br /&gt;  coordinate = cmds.pointPosition(vertexFlat[a], w=1)&lt;br /&gt;  vertPositionSumX += coordinate[0]&lt;br /&gt;  vertPositionSumY += coordinate[1]&lt;br /&gt;  vertPositionSumZ += coordinate[2]&lt;br /&gt;&lt;br /&gt; centroidX = vertPositionSumX/float(vertCount)&lt;br /&gt; centroidY = vertPositionSumY/float(vertCount)&lt;br /&gt; centroidZ = vertPositionSumZ/float(vertCount)&lt;br /&gt; &lt;br /&gt; return [centroidX, centroidY, centroidZ]&lt;br /&gt; &lt;br /&gt;def getDistance(start, end):&lt;br /&gt; #start and end must be lists xyz&lt;br /&gt; v = [start[0]-end[0], start[1]-end[1], start[2]-end[2]] #list format x,y,z&lt;br /&gt; vector = "&lt;&lt;" + str(v[0]) + "," + str(v[1]) + "," + str(v[2]) + "&gt;&gt;"&lt;br /&gt; mag = mm.eval("mag " + vector + ";")&lt;br /&gt;&lt;br /&gt; return mag&lt;br /&gt; &lt;br /&gt;def closestLocator (locator, netOfLocs):&lt;br /&gt; locatorPos = cmds.pointPosition(locator)&lt;br /&gt; distance = 1000000000&lt;br /&gt; closLocData = []&lt;br /&gt; closestLocator = ""&lt;br /&gt; for i in netOfLocs:&lt;br /&gt;  locPos = cmds.pointPosition(i)&lt;br /&gt;  currDist = getDistance(locatorPos, locPos)&lt;br /&gt;  if currDist &lt; distance:&lt;br /&gt;   distance = currDist&lt;br /&gt;   closLocator = i&lt;br /&gt;   closLocPos = locPos&lt;br /&gt;   closLocDist = currDist&lt;br /&gt; closLocData.append (closLocator)&lt;br /&gt; closLocData.append (closLocPos)&lt;br /&gt; closLocData.append (closLocDist)&lt;br /&gt; &lt;br /&gt; return closLocData&lt;br /&gt; &lt;br /&gt;def closestLocatorToPoint (Point, netOfLocs):&lt;br /&gt;&lt;br /&gt; locatorPos = Point&lt;br /&gt; distance = 1000000000&lt;br /&gt; closLocData = []&lt;br /&gt; closestLocator = ""&lt;br /&gt; for i in netOfLocs:&lt;br /&gt;  locPos = cmds.pointPosition(i)&lt;br /&gt;  currDist = getDistance(locatorPos, locPos)&lt;br /&gt;  if currDist &lt; distance:&lt;br /&gt;   distance = currDist&lt;br /&gt;   closLocator = i&lt;br /&gt;   closLocPos = locPos&lt;br /&gt;   closLocDist = currDist&lt;br /&gt; closLocData.append (closLocator)&lt;br /&gt; closLocData.append (closLocPos)&lt;br /&gt; closLocData.append (closLocDist)&lt;br /&gt; &lt;br /&gt; return closLocData&lt;br /&gt; &lt;br /&gt;def midPoint (listPt1,listPt2):&lt;br /&gt; x=0&lt;br /&gt; y=0&lt;br /&gt; z=0&lt;br /&gt; n=0&lt;br /&gt; for i in listPt1:&lt;br /&gt;  ptPos = cmds.pointPosition(i)&lt;br /&gt;  x=x+ptPos[0]&lt;br /&gt;  y=y+ptPos[1]&lt;br /&gt;  z=z+ptPos[2]&lt;br /&gt;  n=n+1&lt;br /&gt; for i in listPt2:&lt;br /&gt;  ptPos = cmds.pointPosition(i)&lt;br /&gt;  x=x+ptPos[0]&lt;br /&gt;  y=y+ptPos[1]&lt;br /&gt;  z=z+ptPos[2]&lt;br /&gt;  n=n+1&lt;br /&gt; midX = x/n&lt;br /&gt; midY = y/n&lt;br /&gt; midZ = z/n &lt;br /&gt; midPt=[]&lt;br /&gt; midPt.append (midX) &lt;br /&gt; midPt.append (midY)&lt;br /&gt; midPt.append (midZ)&lt;br /&gt; &lt;br /&gt; return midPt&lt;br /&gt; &lt;br /&gt;def midPointInPtLocs (listLoc1,listPt2):&lt;br /&gt; x=0&lt;br /&gt; y=0&lt;br /&gt; z=0&lt;br /&gt; n=0&lt;br /&gt; for i in (1,len(listLoc1)-1,1):&lt;br /&gt;  ptPos = cmds.pointPosition(listLoc1[i])&lt;br /&gt;  x=x+ptPos[0]&lt;br /&gt;  y=y+ptPos[1]&lt;br /&gt;  z=z+ptPos[2]&lt;br /&gt;  n=n+1&lt;br /&gt; ptPos = listPt2&lt;br /&gt; x=x+(ptPos[0]*len(listLoc1))&lt;br /&gt; y=y+(ptPos[1]*len(listLoc1))&lt;br /&gt; z=z+(ptPos[2]*len(listLoc1))&lt;br /&gt; n=n+len(listLoc1)&lt;br /&gt; midX = x/n&lt;br /&gt; midY = y/n&lt;br /&gt; midZ = z/n &lt;br /&gt; midPt=[]&lt;br /&gt; midPt.append (midX) &lt;br /&gt; midPt.append (midY)&lt;br /&gt; midPt.append (midZ)&lt;br /&gt; &lt;br /&gt; return midPt&lt;br /&gt;&lt;br /&gt;def direction(a,b):&lt;br /&gt; "Returns the direction vector going from a to b"&lt;br /&gt; # Calculate direction vector&lt;br /&gt; dire = [  a[0] - b[0], a[1] - b[1], a[2] - b[2] ]  #  a-b&lt;br /&gt; return dire&lt;br /&gt;&lt;br /&gt;############################################################################################################################&lt;br /&gt;&lt;br /&gt;class graves:&lt;br /&gt; def __init__(self):&lt;br /&gt;  print "Instance of class Graves created."&lt;br /&gt;  &lt;br /&gt; def getData(self):&lt;br /&gt;  locs = cmds.filterExpand(sm=22)&lt;br /&gt;  return locs&lt;br /&gt; &lt;br /&gt; def getRepulsiveLocs (self):&lt;br /&gt;  locs1 = cmds.filterExpand(sm=22)&lt;br /&gt;  return locs1&lt;br /&gt;  &lt;br /&gt; def getAllLocators (self, AmountOfAttractors):&lt;br /&gt;  repulciveLocs = cmds.filterExpand(sm=22)&lt;br /&gt;&lt;br /&gt;  locs =[]&lt;br /&gt;  for i in range (AmountOfAttractors):&lt;br /&gt;   L = repulciveLocs[0]&lt;br /&gt;   repulciveLocs.remove (L)&lt;br /&gt;   locs.append (L)&lt;br /&gt;  return locs, repulciveLocs&lt;br /&gt; &lt;br /&gt; def polyCubesInLocators (self, locators, size):&lt;br /&gt;  cubes = []&lt;br /&gt;  for i in locators:&lt;br /&gt;   position = cmds.pointPosition(i)&lt;br /&gt;   cube = cmds.polyCube (w =size ,h=size ,d=size )&lt;br /&gt;   cmds.move (position[0], position[1], position[2], cube)&lt;br /&gt;   cubes.append (cube)&lt;br /&gt;  &lt;br /&gt;  return cubes&lt;br /&gt;  &lt;br /&gt; def makeNet (self, locators, numRow, numCell):&lt;br /&gt;  allLocs = []&lt;br /&gt;  startLocs = []&lt;br /&gt;  x = randint (98,102)&lt;br /&gt;  x = x/100.0&lt;br /&gt;  for i in range (numRow):&lt;br /&gt;   for j in range (numCell):&lt;br /&gt;    newloc= cmds.spaceLocator( p=(j*10*x, i*10*x, 0) )&lt;br /&gt;    if i == 0: &lt;br /&gt;     startLocs.append (newloc)&lt;br /&gt;    elif i == (numRow-1):&lt;br /&gt;     startLocs.append (newloc)&lt;br /&gt;    else:&lt;br /&gt;     allLocs.append (newloc)&lt;br /&gt;  cmds.refresh()&lt;br /&gt;  return startLocs, allLocs&lt;br /&gt; &lt;br /&gt; def changeNetBecauseRepulsive (self, allLocs, repulsiveLocs, repSize, pointsAmount = 4, N=0):&lt;br /&gt;  Empty =[]&lt;br /&gt;  LOCS = allLocs&lt;br /&gt;  for i in allLocs:&lt;br /&gt;   Empty.append (i)&lt;br /&gt;  C = pointsAmount&lt;br /&gt;  &lt;br /&gt;  for k in repulsiveLocs: &lt;br /&gt;   for i in range (repSize):&lt;br /&gt;    L=(repSize/5)*(i+1)&lt;br /&gt;    for j in range (L):&lt;br /&gt;     Kpos = cmds.pointPosition(k)&lt;br /&gt;     closLoc = closestLocatorToPoint(Kpos, LOCS) &lt;br /&gt;     LOCpos = closLoc[1]&lt;br /&gt;     clLoc = closLoc[0] &lt;br /&gt;     direc = direction(LOCpos, Kpos)&lt;br /&gt;     newX = ((direc[0]*6)/((i+1)*(i+1)))&lt;br /&gt;     newY = ((direc[1]*6)/((i+1)*(i+1)))&lt;br /&gt;     newZ = ((direc[2]*6)/((i+1)*(i+1)))&lt;br /&gt;     cmds.move  (newX, newY, newZ, clLoc)&lt;br /&gt;     LOCS.remove (clLoc)&lt;br /&gt;     &lt;br /&gt;    cmds.refresh()&lt;br /&gt;  return Empty&lt;br /&gt;   &lt;br /&gt; def subdivStartLocs (self, startLocs, locs):&lt;br /&gt;  subStartLocs = []&lt;br /&gt;  lenLocs = len(locs)&lt;br /&gt;  lenStertLocs = len(startLocs)&lt;br /&gt;  locsPerUnit = lenStertLocs/lenLocs&lt;br /&gt;  for i in range (lenLocs):&lt;br /&gt;   groupOfLocs = []&lt;br /&gt;   groupOfLocs.append (locs[i])&lt;br /&gt;   for j in range (locsPerUnit):&lt;br /&gt;    numOfLoc = i*locsPerUnit+j&lt;br /&gt;    loccc = startLocs [numOfLoc] &lt;br /&gt;    loccc = loccc[0]&lt;br /&gt;    groupOfLocs.append (loccc)&lt;br /&gt;   subStartLocs.append (groupOfLocs)  &lt;br /&gt;  &lt;br /&gt;  return subStartLocs&lt;br /&gt;&lt;br /&gt; def looping1 (self, subdivStartLocs, allLocs, locs, size, number, cubes):&lt;br /&gt;  #cmds.pause( sec=0.5 )&lt;br /&gt;  cmds.refresh()&lt;br /&gt;  size *= 1.03&lt;br /&gt;  color = 255/(size*10) &lt;br /&gt;  number = number + 1&lt;br /&gt;  print "number"&lt;br /&gt;  print number&lt;br /&gt;  temploryList = []&lt;br /&gt;  midPoints =[]&lt;br /&gt;  N=0&lt;br /&gt;  for i in subdivStartLocs:&lt;br /&gt;   if number == 1:&lt;br /&gt;    Pt1 = len(i)/2&lt;br /&gt;    midP = i[Pt1]&lt;br /&gt;    midP = cmds.pointPosition(midP)&lt;br /&gt;    remLocs = []&lt;br /&gt;    remLocs.append (i[0])&lt;br /&gt;    x = randint (2,len(i)+7)&lt;br /&gt;   else: &lt;br /&gt;    midP = i&lt;br /&gt;    remLocs = []&lt;br /&gt;    #remLocs.append (i)&lt;br /&gt;    x = randint (2,len(subdivStartLocs)+7)&lt;br /&gt;   n = 0 &lt;br /&gt;   if len(allLocs)&gt;x:&lt;br /&gt;    for g in range (x):&lt;br /&gt;     closLocData = closestLocatorToPoint (midP, allLocs)&lt;br /&gt;     closLocator = closLocData[0]&lt;br /&gt;     closLocPos = closLocData[1]&lt;br /&gt;     closLocDist = closLocData[2]&lt;br /&gt;     &lt;br /&gt;     newSphere = cmds.polySphere (r=size, sx=4, sy=4)&lt;br /&gt;     cmds.move  (closLocPos[0], closLocPos[1], closLocPos[2], newSphere)&lt;br /&gt;     remLocs.append (closLocator)&lt;br /&gt;     allLocs.remove (closLocator)&lt;br /&gt;   if len(allLocs)&lt;2:&lt;br /&gt;    return "Done."&lt;br /&gt;     &lt;br /&gt;   temploryList.append (remLocs)&lt;br /&gt;   &lt;br /&gt;   #################################################################&lt;br /&gt;   if number == 1:&lt;br /&gt;    Pt1 = len(i)/2&lt;br /&gt;    midPt1 = i[Pt1]&lt;br /&gt;    midPt1 = cmds.pointPosition(midPt1)&lt;br /&gt;    ptPos = cmds.pointPosition(i[0])&lt;br /&gt;    midPt = midPoint (remLocs,i)&lt;br /&gt;   else:&lt;br /&gt;    ptPos = cmds.pointPosition(locs[N])&lt;br /&gt;    midPt = midPointInPtLocs (remLocs,i)&lt;br /&gt;   &lt;br /&gt;   midX = midPt[0] - midP[0]&lt;br /&gt;   midY = midPt[1] - midP[1]&lt;br /&gt;   midX = ptPos[0] + (midX/2)&lt;br /&gt;   midY = ptPos[1] + (midY/2)&lt;br /&gt;   cmds.move  (midX, midY, 0, cubes[N])&lt;br /&gt;   cmds.move  (midX, midY, 0, locs[N])&lt;br /&gt;   midP = midPt&lt;br /&gt;   N = N+1&lt;br /&gt;   midPoints.append (midP)&lt;br /&gt;   ##################################################################&lt;br /&gt;  &lt;br /&gt;  subdivStartLocs = midPoints&lt;br /&gt;  &lt;br /&gt;  if len(allLocs)&gt;0:    &lt;br /&gt;   self.looping1 (subdivStartLocs, allLocs, locs, size, number, cubes)&lt;br /&gt;  else:&lt;br /&gt;   return "Done." &lt;br /&gt;&lt;/pre&gt;this part is running the script in way like on the video above&lt;br /&gt;&lt;pre class="python" name="code"&gt;&lt;br /&gt;g= graves()&lt;br /&gt;&lt;br /&gt;locs, repulsiveLocs = g.getAllLocators (8)&lt;br /&gt;cubes = g.polyCubesInLocators ( locs, 6)&lt;br /&gt;cubes1 = g.polyCubesInLocators ( repulsiveLocs, 10)&lt;br /&gt;&lt;br /&gt;startLocs, allLocs = g.makeNet(locs,48,48)&lt;br /&gt;cubes2 = g.polyCubesInLocators ( startLocs, 1)&lt;br /&gt;allLocsPPP = allLocs&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ALLLOCS = g.changeNetBecauseRepulsive (allLocsPPP, repulsiveLocs, 13)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;subd = g.subdivStartLocs(startLocs,locs)&lt;br /&gt;g.looping1 (subd, ALLLOCS, locs, 1.2, 0, cubes)&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-2940051525133818466?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/2940051525133818466/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/06/this-is-my-studio-script-using-classes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/2940051525133818466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/2940051525133818466'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/06/this-is-my-studio-script-using-classes.html' title=''/><author><name>Grisha Zotov</name><uri>http://www.blogger.com/profile/05521528786515011570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='14' height='32' src='http://2.bp.blogspot.com/_HXZLYcrSPRg/Ss9Gxcu_CXI/AAAAAAAAAV8/W-6Ebb2f7vA/S220/meeee.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-6923686778248863061</id><published>2009-06-10T13:34:00.001+02:00</published><updated>2009-06-17T13:43:12.340+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='announcements'/><title type='text'>Assignment 02A</title><content type='html'>In this assignment you should take a look at the script from last class and try to write it further. The idea is to &lt;strong&gt;create a new class definition&lt;/strong&gt; on it, either to produce &lt;strong&gt;Delaunay triangulations&lt;/strong&gt; or &lt;strong&gt;convex hulls&lt;/strong&gt;. Here are some tips:   &lt;ul&gt;   &lt;li&gt;The &lt;strong&gt;qhull&lt;/strong&gt; commands you need to run are already in the &lt;em&gt;runQhull&lt;/em&gt; method of the &lt;em&gt;Qhull&lt;/em&gt; class. You don't need to worry about them. They will return you a text file containing all the information you need to assemble your objects &lt;/li&gt;    &lt;li&gt;The structure of the new class should be very similar from the Voronoi class structure. You should write a &lt;strong&gt;&lt;em&gt;load&lt;/em&gt;&lt;/strong&gt; method to read the file you generated from qhull and parse it, saving vertex and region information on the regions and vertices attributes of the class. &lt;/li&gt;    &lt;li&gt;Then you should then concentrate on the &lt;strong&gt;&lt;em&gt;draw&lt;/em&gt;&lt;/strong&gt; function. Keep in mind some of the workarounds done in the Voronoi class, like re-ordering the vertices, are not necessary in the Delaunay or convex hull. Just read all the vertices, then draw the regions using the vertices indexes. &lt;/li&gt;    &lt;li&gt;You can find some help on the web. Some sites:&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;&lt;a href="http://www.qhull.org/html/qdelaun.htm"&gt;Qhull Delaunay help&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.qhull.org/html/qconvex.htm"&gt;Qhull convex hull help&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.devshed.com/c/a/Python/File-Management-in-Python/"&gt;File management in Python&lt;/a&gt;&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;You should post whatever results you get on the blog by this&lt;strong&gt; Sunday, 14.06&lt;/strong&gt;. You should also post any questions you might encounter.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-6923686778248863061?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/6923686778248863061/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/06/assignment-02a.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/6923686778248863061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/6923686778248863061'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/06/assignment-02a.html' title='Assignment 02A'/><author><name>danrocha</name><uri>http://www.blogger.com/profile/04468836977853242830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-7179808485355866108</id><published>2009-06-10T13:22:00.001+02:00</published><updated>2009-06-17T13:43:12.340+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='announcements'/><title type='text'>Week 05 - script</title><content type='html'>&lt;a href="http://groups.google.com/group/gsii_ss09/web/qhull.py"&gt;Here is a link&lt;/a&gt; to download the working script from last class, which already contains the new &lt;strong&gt;&lt;em&gt;voronoiShatter&lt;/em&gt;&lt;/strong&gt; method. It is entirely commented and you should be able to understand it from what was explained in class.    &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-7179808485355866108?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/7179808485355866108/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/06/week-05-script.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/7179808485355866108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/7179808485355866108'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/06/week-05-script.html' title='Week 05 - script'/><author><name>danrocha</name><uri>http://www.blogger.com/profile/04468836977853242830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-5748623501964070340</id><published>2009-06-10T11:47:00.001+02:00</published><updated>2009-06-17T13:43:12.340+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='announcements'/><title type='text'>Week 05 - recap</title><content type='html'>On this class we took a look on all the functions contained in the voronoi script we are working on: point generation function, qhull commands, voronoi creation. We also wrote our own voronoi shatter method to the voronoi class, going through concepts of vector math along the way.  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-5748623501964070340?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/5748623501964070340/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/06/week-05-recap.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/5748623501964070340'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/5748623501964070340'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/06/week-05-recap.html' title='Week 05 - recap'/><author><name>danrocha</name><uri>http://www.blogger.com/profile/04468836977853242830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-2535384023095527341</id><published>2009-06-08T03:10:00.002+02:00</published><updated>2009-06-08T03:14:19.852+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='announcements'/><title type='text'>Week 05 - file to download</title><content type='html'>In our class tomorrow we will take a close look at a ready-made script containing advanced methods for the generation of Voronoi diagrams using Qhull. &lt;br /&gt;&lt;br /&gt;After that, we will add one more method to the class, which uses pure mathematics to perform voronoi calculations, so we can learn a bit about vector math and some other scripting techniques. &lt;br /&gt;&lt;br /&gt;For that, you should download &lt;a href="http://groups.google.com/group/gsii_ss09/web/w05_scriptForStudents.py"&gt;this script&lt;/a&gt; and save it in your script folder.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-2535384023095527341?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/2535384023095527341/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/06/week-05-file-to-download.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/2535384023095527341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/2535384023095527341'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/06/week-05-file-to-download.html' title='Week 05 - file to download'/><author><name>danrocha</name><uri>http://www.blogger.com/profile/04468836977853242830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-8909720927278921891</id><published>2009-05-25T13:43:00.003+02:00</published><updated>2009-06-17T13:47:10.864+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Alice'/><category scheme='http://www.blogger.com/atom/ns#' term='assignments'/><title type='text'>01B-Alice-Questions</title><content type='html'>Thanks a lot Daniel for all the comments. I am happy to know the script is working in the right direction. :) Sorry for sending you back my questions again...late...&lt;br /&gt;&lt;br /&gt;Refer to your comments&lt;br /&gt;&lt;br /&gt;1) I understand what you said and why the value of the points should be generated inside the function. However, if I change my function to &lt;br /&gt;&lt;br /&gt;def pointBoundary(iterations, ptA, ptB, ptC):  &lt;br /&gt;&lt;br /&gt;do I still need to, at least for once, use the random function to generate 3 points before I can call my function? &lt;br /&gt;when I call the recursion, can I just say, for instance:&lt;br /&gt;&lt;br /&gt;pointBoundary(10, ptA, ptB, ptC) or pointBoundary(10)&lt;br /&gt;&lt;br /&gt;2) I am not clear what do you mean:&lt;br /&gt;"it should be idented under the else statement, so that it is executed only if iterations are not equal to 0" &lt;br /&gt;because I have already idented...what should I change? &lt;br /&gt;&lt;br /&gt;3)I successfully created random points and store them in a list. &lt;br /&gt;&lt;pre class="python" name="code"&gt;&lt;br /&gt;pts=["ptA","ptB","ptC"]&lt;br /&gt; for i in range (len(pt)):&lt;br /&gt;  from random import *&lt;br /&gt;&lt;br /&gt;  x = uniform(-squareSideLength/2, squareSideLength/2)  &lt;br /&gt;  y = uniform(-squareSideLength/2, squareSideLength/2)&lt;br /&gt;  pts[i] =(x,y)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Is that alright? &lt;br /&gt;&lt;br /&gt;** I have extra questions -&lt;br /&gt;    any differences if I write "pts[%d]%i" but not "pt[i]" ??&lt;br /&gt;&lt;br /&gt;4) How to make sure I offset the line outward but not inward, in relation to the centre of the square?? &lt;br /&gt;&lt;br /&gt;5) Would using "classes" will help to shortening the script? because I always need to repeat the each steps for A, B, C...but I can't simply use loop...&lt;br /&gt;&lt;br /&gt;6) Other questions you haven't answered:&lt;br /&gt;&lt;br /&gt;a) Can you run the Serpentine Pavilion Script? I have syntax error with the line "iterations-=i"&lt;br /&gt;b) What does argument type -"boolean" and "linear" mean?&lt;br /&gt;c) What does "break" mean? &lt;br /&gt;d) I can check cmds.command on the python help list, but how about others like "random" commands, those kinds of none cmds. commands? &lt;br /&gt;&lt;br /&gt;Thanks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-8909720927278921891?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/8909720927278921891/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/05/01b-alice-questions.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/8909720927278921891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/8909720927278921891'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/05/01b-alice-questions.html' title='01B-Alice-Questions'/><author><name>alice</name><uri>http://www.blogger.com/profile/13826062750165810811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-8704020946777009936</id><published>2009-05-24T20:13:00.004+02:00</published><updated>2009-06-17T13:47:48.504+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='A+M'/><category scheme='http://www.blogger.com/atom/ns#' term='assignments'/><title type='text'>01B - Alexandra+Micea - Recursion squares - ScreenShots</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/_ZSYzPEUPVm4/ShmOsgWCpDI/AAAAAAAAAL4/iwU7M8hdqdg/s1600-h/4.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5339455728472204338" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; HEIGHT: 283px; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_ZSYzPEUPVm4/ShmOsgWCpDI/AAAAAAAAAL4/iwU7M8hdqdg/s400/4.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_ZSYzPEUPVm4/ShmOpI0r1wI/AAAAAAAAALw/eQUoEmllxMc/s1600-h/3.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5339455670618674946" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; HEIGHT: 290px; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_ZSYzPEUPVm4/ShmOpI0r1wI/AAAAAAAAALw/eQUoEmllxMc/s400/3.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_ZSYzPEUPVm4/ShmOleVlKII/AAAAAAAAALo/1lB5WLMx1m8/s1600-h/2.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5339455607674316930" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; HEIGHT: 283px; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_ZSYzPEUPVm4/ShmOleVlKII/AAAAAAAAALo/1lB5WLMx1m8/s400/2.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_ZSYzPEUPVm4/ShmOhewaUGI/AAAAAAAAALg/JsYLcid0efI/s1600-h/1.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5339455539067375714" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; HEIGHT: 283px; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_ZSYzPEUPVm4/ShmOhewaUGI/AAAAAAAAALg/JsYLcid0efI/s400/1.jpg" border="0" /&gt;&lt;/a&gt; &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-8704020946777009936?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/8704020946777009936/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/05/01b-alexandramicea-recursion-squares.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/8704020946777009936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/8704020946777009936'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/05/01b-alexandramicea-recursion-squares.html' title='01B - Alexandra+Micea - Recursion squares - ScreenShots'/><author><name>alexandra virlan</name><uri>http://www.blogger.com/profile/07826702946109365185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/-Kxco3AGM9F4/TVkNwXHhRCI/AAAAAAAAAbk/8dMS0nu4xvA/s220/60961_1579924174077_1114837832_31660390_6247364_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_ZSYzPEUPVm4/ShmOsgWCpDI/AAAAAAAAAL4/iwU7M8hdqdg/s72-c/4.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-7174245377630336321</id><published>2009-05-24T19:58:00.009+02:00</published><updated>2009-06-17T13:47:48.504+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='A+M'/><category scheme='http://www.blogger.com/atom/ns#' term='assignments'/><title type='text'>01B -  Mircea+Alexandra - Recursion squares-Script</title><content type='html'>&lt;pre class="python" name="code"&gt;&lt;br /&gt;#assignment o1B_A+M&lt;br /&gt;&lt;br /&gt;#create an initial square &lt;br /&gt;#get the coordinates of the points on each line, depending on the percentage ( in this case the percenatege is a subdivison)&lt;br /&gt;#create a new square with the center in each point we get in the previous step&lt;br /&gt;#rotate the squares with an angle&lt;br /&gt;#scale the initial square&lt;br /&gt;#recursion (by each iteration a new square is created, and along the lines other squares are created and rotated in the same time)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;import maya.cmds as cmds&lt;br /&gt;&lt;br /&gt;#create one initial square&lt;br /&gt;x=10&lt;br /&gt;y=10&lt;br /&gt;mySquare = cmds.nurbsSquare(sl1=x, sl2=y)&lt;br /&gt;&lt;br /&gt;      &lt;br /&gt;def recursion( iterations , amt , percentage): &lt;br /&gt; it=iterations  &lt;br /&gt; pp=percentage&lt;br /&gt; &lt;br /&gt; #select the square&lt;br /&gt; cmds.select( mySquare, r=1 )   &lt;br /&gt; isSides = cmds.filterExpand( sm=9 )  &lt;br /&gt; print isSides&lt;br /&gt;  &lt;br /&gt; #go through all the lines of the square &lt;br /&gt; for i in range(0, len(isSides), 1):  &lt;br /&gt;  print i &lt;br /&gt;  line = isSides[i]  &lt;br /&gt;      #get the coordinates on the lines depending on the percentages&lt;br /&gt;   for j in range(1, pp+1, 1):&lt;br /&gt;   procent = j/float(pp)&lt;br /&gt;   poc = cmds.pointOnCurve(line,pr=procent,top=True,p=True)&lt;br /&gt;   #create a new square with the center in each point;&lt;br /&gt;   #the side of the squares created either can have decreasing values or the same length&lt;br /&gt;   #newSquare = cmds.nurbsSquare(c=poc, sl1=1/float(x/pp), sl2=1/float(y/pp))  &lt;br /&gt;   newSquare = cmds.nurbsSquare(c=poc, sl1=2, sl2=2)      &lt;br /&gt;   #rotate squares with an angle&lt;br /&gt;   cmds.rotate(0,0,it*amt*2, newSquare, pivot=poc)&lt;br /&gt;&lt;br /&gt; if iterations == 0:  &lt;br /&gt;  return "Done."  &lt;br /&gt; else:  &lt;br /&gt;  iterations -= 1 &lt;br /&gt;  percentage -= 1 &lt;br /&gt;  #scale the initial square&lt;br /&gt;  cmds.scale( 1/float( x/pp),1/float( x/pp), 1/float( x/pp) , mySquare, pivot=(0, 0, 0), absolute=True )&lt;br /&gt;  recursion(iterations, amt, percentage) &lt;br /&gt;   &lt;br /&gt;   &lt;br /&gt;recursion(4,10,4)   &lt;br /&gt;   &lt;br /&gt;&lt;br /&gt;    &lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-7174245377630336321?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/7174245377630336321/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/05/01b-mirceaalexandra-recursion-squares.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/7174245377630336321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/7174245377630336321'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/05/01b-mirceaalexandra-recursion-squares.html' title='01B -  Mircea+Alexandra - Recursion squares-Script'/><author><name>alexandra virlan</name><uri>http://www.blogger.com/profile/07826702946109365185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/-Kxco3AGM9F4/TVkNwXHhRCI/AAAAAAAAAbk/8dMS0nu4xvA/s220/60961_1579924174077_1114837832_31660390_6247364_n.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-8472475185960177890</id><published>2009-05-24T02:06:00.002+02:00</published><updated>2009-06-17T13:45:07.274+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Liu'/><category scheme='http://www.blogger.com/atom/ns#' term='assignments'/><title type='text'>Assignment 01B</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_2gY_HsWGQR4/ShiQZZnmnZI/AAAAAAAAAbY/QCzTitIsOdA/s1600-h/2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 276px;" src="http://2.bp.blogspot.com/_2gY_HsWGQR4/ShiQZZnmnZI/AAAAAAAAAbY/QCzTitIsOdA/s400/2.jpg" alt="" id="BLOGGER_PHOTO_ID_5339176124295847314" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_2gY_HsWGQR4/ShiPh50M5WI/AAAAAAAAAbQ/zFp5qQYjPf8/s1600-h/1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 283px;" src="http://2.bp.blogspot.com/_2gY_HsWGQR4/ShiPh50M5WI/AAAAAAAAAbQ/zFp5qQYjPf8/s400/1.jpg" alt="" id="BLOGGER_PHOTO_ID_5339175170865948002" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Question:&lt;br /&gt;How to get the intersection coordinate in this case?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-8472475185960177890?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/8472475185960177890/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/05/assignment-01b_9203.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/8472475185960177890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/8472475185960177890'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/05/assignment-01b_9203.html' title='Assignment 01B'/><author><name>Liu, Kocheng</name><uri>http://www.blogger.com/profile/06568145659726503765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_2gY_HsWGQR4/S2lJxVY9V0I/AAAAAAAAArI/ahtB3H3aRyc/S220/me1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_2gY_HsWGQR4/ShiQZZnmnZI/AAAAAAAAAbY/QCzTitIsOdA/s72-c/2.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-8162933717973847760</id><published>2009-05-24T02:01:00.002+02:00</published><updated>2009-06-17T13:45:07.274+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Liu'/><category scheme='http://www.blogger.com/atom/ns#' term='assignments'/><title type='text'>Assignment 01B</title><content type='html'>import maya.cmds as cmds&lt;br /&gt;&lt;br /&gt;#Step1:Define the biggest and smallest circles&lt;br /&gt;BigRadius=30&lt;br /&gt;SmallRadius=2&lt;br /&gt;Minus= BigRadius-SmallRadius&lt;br /&gt;&lt;br /&gt;#Step2:Create these two circles&lt;br /&gt;cmds.circle(c=(0,0,0),r=30)&lt;br /&gt;cmds.circle(c=(0,-28,0),r=2)&lt;br /&gt;&lt;br /&gt;#Step3:Generate two circles which follow the tangent princples &lt;br /&gt;#1)r1+r2=D&lt;br /&gt;NextRadius=SmallRadius+1&lt;br /&gt;D= NextRadius+SmallRadius&lt;br /&gt;cmds.circle(c=(0,-28,0),r=D)&lt;br /&gt;&lt;br /&gt;#2)offset the outmost circle based on the radius of next circle  &lt;br /&gt;cmds.circle(c=(0,0,0), r=BigRadius-NextRadius)&lt;br /&gt;#3)Get the intersection point at the right side and as the center point of the new circle &lt;br /&gt;#  which is tangent with previous two circles&lt;br /&gt;#Question:&lt;br /&gt;# How to find out the coordinate of the intersection point in this case??????????????????????&lt;br /&gt;&lt;br /&gt;'''&lt;br /&gt;#Loop through it based on previous steps&lt;br /&gt;for i in range(2,BigRadius,1):&lt;br /&gt; cmds.circle(c=(0,0,0),r=Minus-i)&lt;br /&gt; radius=3&lt;br /&gt; r1= radius&lt;br /&gt; r2= radius+i&lt;br /&gt; radius+=1&lt;br /&gt; D=r1+r2&lt;br /&gt; cmds.circle(c=(the center coordinate from the intersection point),r=D)&lt;br /&gt;'''&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-8162933717973847760?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/8162933717973847760/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/05/assignment-01b_24.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/8162933717973847760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/8162933717973847760'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/05/assignment-01b_24.html' title='Assignment 01B'/><author><name>Liu, Kocheng</name><uri>http://www.blogger.com/profile/06568145659726503765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_2gY_HsWGQR4/S2lJxVY9V0I/AAAAAAAAArI/ahtB3H3aRyc/S220/me1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-4263920686744596150</id><published>2009-05-24T01:57:00.001+02:00</published><updated>2009-06-17T13:48:22.665+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Liu'/><category scheme='http://www.blogger.com/atom/ns#' term='assignments'/><title type='text'></title><content type='html'>&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-4263920686744596150?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/4263920686744596150/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/05/import-maya_24.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/4263920686744596150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/4263920686744596150'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/05/import-maya_24.html' title=''/><author><name>Liu, Kocheng</name><uri>http://www.blogger.com/profile/06568145659726503765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_2gY_HsWGQR4/S2lJxVY9V0I/AAAAAAAAArI/ahtB3H3aRyc/S220/me1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-8477853420620954372</id><published>2009-05-23T22:07:00.002+02:00</published><updated>2009-06-17T13:49:04.803+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Anastasia'/><category scheme='http://www.blogger.com/atom/ns#' term='assignments'/><title type='text'>MY SCRIPT "RECURSION STUFF" - pic</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_1qBy3zIG0ec/ShhX_d1yh5I/AAAAAAAAAlo/JybpYtrJQFM/s1600-h/rec02.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://2.bp.blogspot.com/_1qBy3zIG0ec/ShhX_d1yh5I/AAAAAAAAAlo/JybpYtrJQFM/s400/rec02.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5339114106101335954" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_1qBy3zIG0ec/ShhX_H6jJTI/AAAAAAAAAlg/SLBnnFlkayM/s1600-h/rec01.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://2.bp.blogspot.com/_1qBy3zIG0ec/ShhX_H6jJTI/AAAAAAAAAlg/SLBnnFlkayM/s400/rec01.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5339114100215719218" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_1qBy3zIG0ec/ShhX_AaMgpI/AAAAAAAAAlY/HBpmef5CWZ4/s1600-h/rec00.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://3.bp.blogspot.com/_1qBy3zIG0ec/ShhX_AaMgpI/AAAAAAAAAlY/HBpmef5CWZ4/s400/rec00.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5339114098200969874" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-8477853420620954372?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/8477853420620954372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/05/my-script-recursion-stuff-pic.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/8477853420620954372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/8477853420620954372'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/05/my-script-recursion-stuff-pic.html' title='MY SCRIPT &quot;RECURSION STUFF&quot; - pic'/><author><name>Anastasia Globa</name><uri>https://profiles.google.com/103588731693715960502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-KXLHi4wdi4w/AAAAAAAAAAI/AAAAAAAABBE/ASpfZ48C_ow/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_1qBy3zIG0ec/ShhX_d1yh5I/AAAAAAAAAlo/JybpYtrJQFM/s72-c/rec02.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-7828840809584463741</id><published>2009-05-23T21:43:00.001+02:00</published><updated>2009-06-17T13:49:04.803+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Anastasia'/><category scheme='http://www.blogger.com/atom/ns#' term='assignments'/><title type='text'>MY SCRIPT "RECURSION STUFF" - it works)</title><content type='html'>&lt;div&gt;&lt;div&gt; def PLAN():&lt;/div&gt;&lt;div&gt; &lt;span class="Apple-tab-span" style="white-space: pre; "&gt;  &lt;/span&gt; 1)Create primitive (6 angle for ex-le)&lt;/div&gt;&lt;div&gt; &lt;span class="Apple-tab-span" style="white-space: pre; "&gt;  &lt;/span&gt; 2)Use this primitive as a path (curve)&lt;/div&gt;&lt;div&gt; &lt;span class="Apple-tab-span" style="white-space: pre; "&gt;  &lt;/span&gt; 3)Define the random amount of primitives(within Fibonacci numbers 1,1,3,5,8,13,21,44,65...)&lt;/div&gt;&lt;div&gt; &lt;span class="Apple-tab-span" style="white-space: pre; "&gt;  &lt;/span&gt; 4)Dulicate them&lt;/div&gt;&lt;div&gt; &lt;span class="Apple-tab-span" style="white-space: pre; "&gt;  &lt;/span&gt; 5)Pick a random point within pritive length &lt;/div&gt;&lt;div&gt; &lt;span class="Apple-tab-span" style="white-space: pre; "&gt;  &lt;/span&gt; 6)Move them on it &lt;/div&gt;&lt;div&gt; &lt;span class="Apple-tab-span" style="white-space: pre; "&gt;  &lt;/span&gt; 7)Scale primitives random&lt;/div&gt;&lt;div&gt; &lt;span class="Apple-tab-span" style="white-space: pre; "&gt;  &lt;/span&gt; 8)enjoy)&lt;/div&gt;&lt;div&gt;PLAN()&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div&gt;###RECURSION STUFF#####&lt;/div&gt;&lt;div&gt;##&lt;/div&gt;&lt;div&gt;def primitives(numSides, radius):&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;#create a circle&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;myCircle = cmds.circle(radius = 30)&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;#get param steps, I will take 6 for ex-le&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;paramSteps = 1./6&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;#loop and get points coordinates&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;points = []&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;for i in range(0, 8, 1):&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;points.append(  cmds.pointOnCurve(myCircle[0], p=1, pr=paramSteps*i, top=1)  )&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;#create a curve connecting points&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;myPrimitive = cmds.curve(ep=points, d=1)&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;#close the curve&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;cmds.closeCurve(n="p_"+str(numSides)+"_sides", rpo=1)&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;#delete the circle &lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;cmds.delete(myCircle)&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;#return the name of the primitive&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;return myPrimitive&lt;/div&gt;&lt;div&gt;primitives(6, 30)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;from random import *&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;def Whatamess():&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;#define the random amount of primitives&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;randomAmount = randint(21,44) # fibonachi number 1,1,3,5,8,13,21,44,65... and so on&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;for i in range (0,randomAmount,1):&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;#duplicate my primitiv&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;myDupObj2 = cmds.duplicate( 'curve1' ) &lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;# get the center of the duplicated object&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;myCenter = cmds.xform(myDupObj2, q=1, t=1, ws=1)&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;# get the maximun "length" of the curve, so we can pick a random point within this length&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;#I wanna use my Primitive as a curve. Why not?)&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;myCurveParam = cmds.getAttr("curve1.maxValue")&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;# select a random point on the curve&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;myPoint = cmds.pointOnCurve( 'curve1', pr = uniform(0,myCurveParam), p=True)&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;# select the previously duplicated object&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;cmds.select(myDupObj2)&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;# move it to the new location&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;cmds.move(myPoint[0],myPoint[1],myPoint[2])&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;#scales it&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;cmds.scale(uniform(1,1.5),uniform(1,1.5),uniform(1,1.5),a=1)&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Whatamess()&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;### As You can see, I changed my consept a bit,&lt;/div&gt;&lt;div&gt;### from controlled variant to random, because I dont know how to put &lt;/div&gt;&lt;div&gt;### mathematical formulas (Fibonacci x3 = x2+x1) But I included one of your "helpful" scripts and I like the result) after all&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre; "&gt; &lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space: pre; "&gt; &lt;/span&gt;&lt;/div&gt;&lt;div&gt; def PLAN1():&lt;/div&gt;&lt;div&gt; &lt;span class="Apple-tab-span" style="white-space: pre; "&gt;  &lt;/span&gt; 1)Create primitive (6 angle for ex-le)&lt;/div&gt;&lt;div&gt; &lt;span class="Apple-tab-span" style="white-space: pre; "&gt;  &lt;/span&gt; 2)Use this primitive as a path (curve)&lt;/div&gt;&lt;div&gt; &lt;span class="Apple-tab-span" style="white-space: pre; "&gt;  &lt;/span&gt; 3)Define the random amount of primitives(within Fibonacci numbers 1,1,3,5,8,13,21,44,65...)&lt;/div&gt;&lt;div&gt; &lt;span class="Apple-tab-span" style="white-space: pre; "&gt;  &lt;/span&gt; 4)Dulicate them&lt;/div&gt;&lt;div&gt; &lt;span class="Apple-tab-span" style="white-space: pre; "&gt;  &lt;/span&gt; 5)Pick a  point within pritive length ( I dont know how to pick different &lt;/div&gt;&lt;div&gt; &lt;span class="Apple-tab-span" style="white-space: pre; "&gt;  &lt;/span&gt;        points with Fibonacci proporsion-divide curve propotionally [1,1,3,5...])&lt;/div&gt;&lt;div&gt; &lt;span class="Apple-tab-span" style="white-space: pre; "&gt;  &lt;/span&gt; 6)Move them on it  (I dont know how to put them, so they will not intersect)&lt;/div&gt;&lt;div&gt; &lt;span class="Apple-tab-span" style="white-space: pre; "&gt;  &lt;/span&gt; 7)Scale primitives  (but I dont know how to scale them proportionally)&lt;/div&gt;&lt;div&gt; &lt;span class="Apple-tab-span" style="white-space: pre; "&gt;  &lt;/span&gt; 8)enjoy more)&lt;/div&gt;&lt;div&gt;PLAN1()&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-7828840809584463741?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/7828840809584463741/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/05/my-script-recursion-stuff-it-works.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/7828840809584463741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/7828840809584463741'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/05/my-script-recursion-stuff-it-works.html' title='MY SCRIPT &quot;RECURSION STUFF&quot; - it works)'/><author><name>Anastasia Globa</name><uri>https://profiles.google.com/103588731693715960502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-KXLHi4wdi4w/AAAAAAAAAAI/AAAAAAAABBE/ASpfZ48C_ow/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-447048794217992848</id><published>2009-05-23T20:32:00.003+02:00</published><updated>2009-06-17T13:46:38.480+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Grisha'/><category scheme='http://www.blogger.com/atom/ns#' term='assignments'/><title type='text'></title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_HXZLYcrSPRg/ShhBu1K46EI/AAAAAAAAANk/OHkM2n-XYh0/s1600-h/1_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C+%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80.jpg"&gt;&lt;img style="cursor: pointer; width: 400px; height: 115px;" src="http://2.bp.blogspot.com/_HXZLYcrSPRg/ShhBu1K46EI/AAAAAAAAANk/OHkM2n-XYh0/s400/1_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C+%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80.jpg" alt="" id="BLOGGER_PHOTO_ID_5339089631050262594" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;It does not work and giving mistake:&lt;br /&gt;&lt;span style="font-family: arial; font-style: italic;"&gt; UnboundLocalError: local variable 'Squares' referenced before assignment #  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="python" name="code"&gt;&lt;br /&gt;import maya.cmds as cmds&lt;br /&gt;x=10&lt;br /&gt;y=10&lt;br /&gt;#Make a Square&lt;br /&gt;initialSqare = cmds.nurbsSquare(sl1=x, sl2=y)&lt;br /&gt;#get outline&lt;br /&gt;isSides = cmds.filterExpand (sm=9)&lt;br /&gt;print isSides&lt;br /&gt;#make an empty list&lt;br /&gt;Squares = []&lt;br /&gt;Squares.append (1)&lt;br /&gt;&lt;br /&gt;def squareINsquare (number):&lt;br /&gt;#scale&lt;br /&gt;x=10/(1.5*len(Squares)+1)&lt;br /&gt;y=10/(1.5*len(Squares)+1)&lt;br /&gt;#loop&lt;br /&gt;for j in range (0,len(Squares),1):&lt;br /&gt;cmds.select (Squares[j], r=True)&lt;br /&gt;#get outline&lt;br /&gt;isSides = cmds.filterExpand (sm=9)&lt;br /&gt;#looping in outline&lt;br /&gt;for i in range (0,2,1):&lt;br /&gt;perc1 = 0&lt;br /&gt;perc2 = 1&lt;br /&gt;line1=isSides[1]&lt;br /&gt;line2 = isSides[2]&lt;br /&gt;if i == 0:&lt;br /&gt; poc1 = cmds.pointOnCurve(line1, pr=perc1, top=True, p=True)&lt;br /&gt; print poc1&lt;br /&gt; #change the center of the new square&lt;br /&gt; poc1[0]=poc1[0]-x/2&lt;br /&gt; poc1[1]=poc1[1]+y/2&lt;br /&gt; print poc1&lt;br /&gt; #make a new square&lt;br /&gt; initialSqare1 = cmds.nurbsSquare(c = poc1, sl1=x, sl2=y)&lt;br /&gt;#the same for the oposit corner of the squre&lt;br /&gt;else:&lt;br /&gt; poc2 = cmds.pointOnCurve(line2, pr=perc2, top=True, p=True)&lt;br /&gt; print poc2&lt;br /&gt; poc2[0]=poc2[0]+x/2&lt;br /&gt; poc2[1]=poc2[1]-y/2&lt;br /&gt; print poc2&lt;br /&gt; initialSqare2 = cmds.nurbsSquare(c = poc2, sl1=x, sl2=y)&lt;br /&gt;&lt;br /&gt;Squares.append (initialSqare1)&lt;br /&gt;Squares.append (initialSqare2)&lt;br /&gt;Squares=Squares1&lt;br /&gt;Squares1=[]&lt;br /&gt;if number == 0 :&lt;br /&gt;#stop&lt;br /&gt;return "Done."&lt;br /&gt;else:&lt;br /&gt;#did not finish yet&lt;br /&gt;#remove one unit (count down)&lt;br /&gt;number -= 1&lt;br /&gt;&lt;br /&gt;squareINsquare (number)&lt;br /&gt;&lt;br /&gt;squareINsquare (3)&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-447048794217992848?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/447048794217992848/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/05/it-does-not-work-and-giving-mistake.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/447048794217992848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/447048794217992848'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/05/it-does-not-work-and-giving-mistake.html' title=''/><author><name>Grisha Zotov</name><uri>http://www.blogger.com/profile/05521528786515011570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='14' height='32' src='http://2.bp.blogspot.com/_HXZLYcrSPRg/Ss9Gxcu_CXI/AAAAAAAAAV8/W-6Ebb2f7vA/S220/meeee.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_HXZLYcrSPRg/ShhBu1K46EI/AAAAAAAAANk/OHkM2n-XYh0/s72-c/1_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C+%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-7860915871132250537</id><published>2009-05-23T18:58:00.011+02:00</published><updated>2009-06-17T13:45:59.781+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='assignments'/><category scheme='http://www.blogger.com/atom/ns#' term='Alec'/><title type='text'>01B - alec' - Real recursion, soft code, optimized, updated, improved &amp; commented new script...</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_qqt7zCa-76A/Shgtrq0b0iI/AAAAAAAAAW8/4MzZehsmkQw/s1600-h/Picture+1.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 92px; height: 400px;" src="http://4.bp.blogspot.com/_qqt7zCa-76A/Shgtrq0b0iI/AAAAAAAAAW8/4MzZehsmkQw/s400/Picture+1.jpg" alt="" id="BLOGGER_PHOTO_ID_5339067586499564066" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;In this script I mainly correct my mistakes! I changed the loop in a real recursive function, I used "soft code" instead of "hard code" and I tried to optimized my codes.&lt;br /&gt;&lt;br /&gt;I also added a recursion "J" which makes vary the result every time we call the function once again. This new "j" parameter (called "recursions" with a "s") increase the rotation angle and the scale of the squares. (= the first 4th screenshots)&lt;br /&gt;&lt;br /&gt;In this example, I used a loop at the end of the script to call the function 5times!&lt;br /&gt;and I configured this script to show only the z-axis projection. (= the last screenshot)&lt;br /&gt;&lt;br /&gt;I didn't managed to simplify the "projection part" ... from the line 53 to 65.&lt;/span&gt;&lt;br /&gt;&lt;pre class="python" name="code"&gt;&lt;br /&gt;&lt;br /&gt;import maya.cmds as cmds&lt;br /&gt;&lt;br /&gt;##########################&lt;br /&gt;### INITIAL PARAMETERS ###&lt;br /&gt;##########################&lt;br /&gt;### drawx = project square on x axis,  drawy = project square on y axis,  drawz = project square on z axis&lt;br /&gt;### delete3Dsquare = delete the original iterated squares&lt;br /&gt;### deletelocator = delete locator related to the rotationpoint&lt;br /&gt;### deleteSquareSurface = delete the nurbsSquare used for the pointPosition + offset function&lt;br /&gt;drawx = 0             # 0 = Fasle /// 1 = True&lt;br /&gt;drawy = 0             # 0 = Fasle /// 1 = True&lt;br /&gt;drawz = 1             # 0 = Fasle /// 1 = True&lt;br /&gt;delete3Dsquare = 1        # 0 = Fasle /// 1 = True&lt;br /&gt;deletelocator = 1        # 0 = Fasle /// 1 = True&lt;br /&gt;deleteSquareSurface = 1        # 0 = Fasle /// 1 = True&lt;br /&gt;iterationgroup = cmds.group(em=True)&lt;br /&gt;if cmds.objExists('j'):&lt;br /&gt;print "rien"&lt;br /&gt;else:&lt;br /&gt;cmds.spaceLocator(n='j')&lt;br /&gt;iterations = 1&lt;br /&gt;j = []&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;############################&lt;br /&gt;### DEF RECURSIVE SQUARE ###&lt;br /&gt;############################&lt;br /&gt;### Def the function according to 3 parameters; number of iterations, angle of rotation between each square, offset of the point of rotation&lt;br /&gt;### rotationpoint [0,0,0] is the initial rotation point position /// these position are used only for the first iteration&lt;br /&gt;&lt;br /&gt;def recursivesquares(j,iteration, angle, offset, rotationpoint=[0,0,0]):&lt;br /&gt;group = cmds.group(em=True)&lt;br /&gt;&lt;br /&gt;### Create the square, and rotate it according to the angle and rotationpoint parameters&lt;br /&gt;nurbsSquare = cmds.nurbsSquare(sl1=iterations*5, sl2=iterations*5, c=rotationpoint, nry=1, nrz=0)&lt;br /&gt;cmds.parent(nurbsSquare[0], group)&lt;br /&gt;cmds.rotate(iterations*iteration*angle, iterations*iteration*angle, iterations*iteration*angle, [nurbsSquare[0]], pivot=(rotationpoint))&lt;br /&gt;&lt;br /&gt;### Determining the position of each corner of this square&lt;br /&gt;topposition = cmds.pointPosition('top'+nurbsSquare[0]+'.cv[0]', world=True)&lt;br /&gt;leftposition = cmds.pointPosition('left'+nurbsSquare[0]+'.cv[0]', world=True)&lt;br /&gt;rightposition = cmds.pointPosition('right'+nurbsSquare[0]+'.cv[0]', world=True)&lt;br /&gt;bottomposition = cmds.pointPosition('bottom'+nurbsSquare[0]+'.cv[0]', world=True)&lt;br /&gt;&lt;br /&gt;### Create a nurbs surface to use the pointOnSurface command with the offset parameter&lt;br /&gt;### Create a locator in the position of this new rotationpoint&lt;br /&gt;nurbsSquareSurface = cmds.squareSurface('top'+nurbsSquare[0], 'right'+nurbsSquare[0], 'bottom'+nurbsSquare[0], 'left'+nurbsSquare[0], ct1=1, ct2=1, ct3=1, ct4=1, po=0)&lt;br /&gt;rotationpoint = cmds.pointOnSurface(nurbsSquareSurface[0], u=offset/(iteration+1), v=offset/(iteration+1), position=True)&lt;br /&gt;locator = cmds.spaceLocator(p=rotationpoint)&lt;br /&gt;cmds.parent(locator[0], nurbsSquareSurface[0], group)&lt;br /&gt;&lt;br /&gt;### Project the squares on the x, y or/and z axis&lt;br /&gt;if drawx == 1:&lt;br /&gt;  squaresonx = cmds.curve(d=1, p=[(topposition[0], topposition[1], 0),(leftposition[0], leftposition[1], 0),(bottomposition[0], bottomposition[1], 0),(rightposition[0], rightposition[1], 0), (topposition[0], topposition[1], 0)] )&lt;br /&gt;  cmds.parent(squaresonx, group)&lt;br /&gt;&lt;br /&gt;if drawy == 1:&lt;br /&gt;  squaresony = cmds.curve(d=1, p=[(topposition[0], 0, topposition[2]),(leftposition[0], 0, leftposition[2]),(bottomposition[0], 0, bottomposition[2]),(rightposition[0], 0, rightposition[2]), (topposition[0], 0, topposition[2])] )&lt;br /&gt;  cmds.parent(squaresony, group)&lt;br /&gt;&lt;br /&gt;if drawz == 1:&lt;br /&gt;  squaresonz = cmds.curve(d=1, p=[(0, topposition[1], topposition[2]),(0, leftposition[1], leftposition[2]),(0, bottomposition[1], bottomposition[2]),(0, rightposition[1], rightposition[2]), (0, topposition[1], topposition[2])] )&lt;br /&gt;  cmds.parent(squaresonz, group)&lt;br /&gt;&lt;br /&gt;else:&lt;br /&gt;  print "project nothing"&lt;br /&gt;&lt;br /&gt;### Clean the Scene&lt;br /&gt;cmds.parent(group, iterationgroup)&lt;br /&gt;&lt;br /&gt;if delete3Dsquare == 1:&lt;br /&gt;  cmds.delete(nurbsSquare[0])&lt;br /&gt;&lt;br /&gt;if deletelocator == 1:&lt;br /&gt;  cmds.delete(locator[0])&lt;br /&gt;&lt;br /&gt;if deleteSquareSurface == 1:&lt;br /&gt;  cmds.delete(nurbsSquareSurface[0])&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;### Iterate the function&lt;br /&gt;if iteration == 0:&lt;br /&gt;  j.append(1)&lt;br /&gt;  return j&lt;br /&gt;&lt;br /&gt;else:&lt;br /&gt;  iteration -= 1&lt;br /&gt;  recursivesquares(j,iteration, angle, offset, rotationpoint)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#############################&lt;br /&gt;### CALL RECURSIVE SQUARE ###&lt;br /&gt;#############################&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;for i in range (0, 5, 1):&lt;br /&gt;recursivesquares(j,10,15,.9, [0,0,0])&lt;br /&gt;iterations = len(j)+1&lt;br /&gt;print iterations&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-7860915871132250537?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/7860915871132250537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/05/new-script-real-recursion-optimized.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/7860915871132250537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/7860915871132250537'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/05/new-script-real-recursion-optimized.html' title='01B - alec&apos; - Real recursion, soft code, optimized, updated, improved &amp; commented new script...'/><author><name>alec</name><uri>http://www.blogger.com/profile/09823278314767605002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/_qqt7zCa-76A/SPT1pm42sNI/AAAAAAAAAFw/26kHzdRhX_4/S220/2589578483_d2918fb00c.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_qqt7zCa-76A/Shgtrq0b0iI/AAAAAAAAAW8/4MzZehsmkQw/s72-c/Picture+1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-6483624164534612897</id><published>2009-05-20T15:39:00.001+02:00</published><updated>2009-06-17T13:43:12.341+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='announcements'/><title type='text'>Week 03 – code (part 2) - classes</title><content type='html'>&lt;p&gt;&lt;strong&gt;Classes&lt;/strong&gt; are the workhorses of object-oriented programming languages (OOP) like Python. As we saw, everything in Python is an &lt;strong&gt;object&lt;/strong&gt;. Strings, lists, functions and even modules are objects and, as objects, they all have &lt;strong&gt;attributes&lt;/strong&gt; and &lt;strong&gt;functions&lt;/strong&gt; (which in the case of objects are called &lt;strong&gt;methods&lt;/strong&gt;) associated with them. Let’s take the example of a list:&lt;/p&gt;&lt;pre class="python" name="code"&gt;myList = [1 ,3.4, 5, 66, 298] &lt;br /&gt;myList.append(243) &lt;br /&gt;myList.sort( )&lt;/pre&gt;&lt;p&gt;In the above examples, &lt;em&gt;append()&lt;/em&gt; and &lt;em&gt;sort()&lt;/em&gt; are methods of the object list, and can be called by using the construction &lt;em&gt;objectName.method(arguments)&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;Lists, integers, strings, etc, are built-in objects in Python. But you can create your own objects by using classes. Classes are object definitions created by the user, and work as a place to collect functions and attributes related to the object you want to create. &lt;/p&gt;&lt;p&gt;When you put functions and variables into a class, they have a way to “talk” to each other and keep information together. Here is an better explanation and example taken from a tutorial on the web:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;For example, imagine you have a golf club. It has information about it (i.e. variables) like the length of the shaft, the material of the grip, and the material of the head. It also has functions associated with it, like the function of swinging your golf club, or the function of breaking it in pure frustration. For those functions, you need to know the variables of the shaft length, head material, etc. (…)&lt;/p&gt;&lt;p&gt;What happens if each time you use your golf club, the shaft gets weaker, the grip on the handle wears away a little, you get that little more frustrated, and a new scratch is formed on the head of the club? A function cannot [handle] that.&lt;strong&gt; A function only makes one output, not four or five, or five hundred&lt;/strong&gt;. What is needed is a way to group &lt;strong&gt;functions and variables that are closely related&lt;/strong&gt; into one place so that they can &lt;strong&gt;interact&lt;/strong&gt; with each other.&lt;/p&gt;&lt;p&gt;Chances are that you also have more than one golf club. Without classes, you need to write a whole heap of code for each different golf club. This is a pain, seeing that all clubs share&lt;strong&gt; common features&lt;/strong&gt;, it is just that some have &lt;strong&gt;changed properties&lt;/strong&gt; - like what the shaft is made of, and it's weight. The ideal situation would be to have a design of your basic golf club. Each time you create a new club, simply specify its attributes - the length of its shaft, its weight, etc. (…)&lt;/p&gt;&lt;p&gt;These problems that a thing called object-oriented-programming solves. &lt;strong&gt;It puts functions and variables together in a way that they can see each other and work together, be replicated, and altered as needed, and not when unneeded.&lt;/strong&gt; And we use a thing called a 'class' to do this.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;To use classes, the same way when you create functions, you have first to define them (class definition), and then call them by creating instances of this class. Like what we did in class:&lt;/p&gt;&lt;pre class="python" name="code"&gt;#### CLASSES&lt;br /&gt;#defining a class&lt;br /&gt;class Student: &lt;br /&gt;	#first define the class constructor&lt;br /&gt;	#which is the function that is executed&lt;br /&gt;	#every time you create an instance of this class&lt;br /&gt;	def __init__(self, name, attendance):&lt;br /&gt;		#in this function, we pass three arguments:&lt;br /&gt;		#self should ALWAYS be passed as the first argument&lt;br /&gt;		#in every function inside of a class definition&lt;br /&gt;		#the following arguments are defined by you&lt;br /&gt;		#depending on what you want to pass for the instance&lt;br /&gt;		#when you are creating it&lt;br /&gt;		self.name = name&lt;br /&gt;		self.attendance = attendance&lt;br /&gt;		self.marks = []&lt;br /&gt;		#in the lines above we declare a series of variables&lt;br /&gt;		#inhrent to the class, which will later work as &lt;br /&gt;		#attributes of each instance of the class you create&lt;br /&gt;		#as use of the &amp;quot;self.nameOfVariable&amp;quot; syntax indicates&lt;br /&gt;		numberOfAssignments = 0&lt;br /&gt;		#above we created a local variable which will exist only&lt;br /&gt;		#inside the class, and cannot be accessed as attributes&lt;br /&gt;		#of the instances you create (note we don't use &amp;quot;self&amp;quot;&lt;br /&gt;		print &amp;quot;New student was created&amp;quot;&lt;br /&gt;		print &amp;quot;this student did&amp;quot;, numberOfAssignments, &amp;quot; assignments&amp;quot;&lt;br /&gt;		#the lines above are simple print statements which will&lt;br /&gt;		#show when you create an instance of the class,&lt;br /&gt;		#because they are located on the __init__ function&lt;br /&gt;		&lt;br /&gt;	#now we leave the __init__ function and we can than create &lt;br /&gt;	#as many internal functions as we want &lt;br /&gt;	#(which are called &amp;quot;methods&amp;quot; of this class&lt;br /&gt;	#note that all of them MUST take as a first argument&lt;br /&gt;	#the variable self, so that they always refer to the&lt;br /&gt;	#instance itself&lt;br /&gt;	&lt;br /&gt;	def addMark(self, mark):&lt;br /&gt;		#this is a simple function which&lt;br /&gt;		#appends whatever value we pass as an argument&lt;br /&gt;		#to the internal list &amp;quot;marks&amp;quot;, which was&lt;br /&gt;		#created in the __init__ function&lt;br /&gt;		self.marks.append(mark)&lt;br /&gt;		&lt;br /&gt;	def addAttendance(self):&lt;br /&gt;		#the same with this method, which doesn't take&lt;br /&gt;		#any additional arguments, but still makes modifications&lt;br /&gt;		#(by adding one unit) to the attendance attribute of the class&lt;br /&gt;		self.attendance += 1&lt;/pre&gt;&lt;p&gt;Now that we have our class define, we can create instances of it and call its attributes and functions easily:&lt;/p&gt;&lt;pre class="python" name="code"&gt;## creating an instance of the class		&lt;br /&gt;myStudent = Student(&amp;quot;Liu&amp;quot;, 10)&lt;br /&gt;#as you see, we create instances of a class&lt;br /&gt;#by simply assigning it to a variable and&lt;br /&gt;#passing the necessary intial arguments&lt;br /&gt;#required by the __init__ function&lt;br /&gt;#Note that we don't ever need to pass &amp;quot;self&amp;quot; as an argument&lt;br /&gt;#on the instance creation, as Python automatically&lt;br /&gt;#does it internally&lt;br /&gt;&lt;br /&gt;#now we can access the attribute of these functions, also&lt;br /&gt;#defined on the __init__ function, by using a simple construction:&lt;br /&gt;print myStudent.name&lt;br /&gt;print myStudent.attendance&lt;br /&gt;&lt;br /&gt;#Here lies one of the powers of classes: I can create &lt;br /&gt;#as many instances of that class as I need,&lt;br /&gt;#and all of them inherit the methods and attributes of the class&lt;br /&gt;myStudent2 = Student(&amp;quot;Grisha&amp;quot;, 20)&lt;br /&gt;print myStudent2.name&lt;br /&gt;print myStudent2.marks&lt;br /&gt;&lt;br /&gt;#the same way as I accessed attributes aobve, I can&lt;br /&gt;#call the class's methods:&lt;br /&gt;myStudent2.addMark(10)&lt;br /&gt;print myStudent2.marks&lt;/pre&gt;&lt;p&gt;This was a short and small example of classes. You can do many powerful things with it as we will see next class. So keep in mind that the class definition works as a &lt;strong&gt;blueprint&lt;/strong&gt;, from which as many instances as you want can be generated.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-6483624164534612897?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/6483624164534612897/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/05/week-03-code-part-2-classes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/6483624164534612897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/6483624164534612897'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/05/week-03-code-part-2-classes.html' title='Week 03 – code (part 2) - classes'/><author><name>danrocha</name><uri>http://www.blogger.com/profile/04468836977853242830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-6975692749090580476</id><published>2009-05-19T18:49:00.001+02:00</published><updated>2009-06-17T13:43:12.341+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='announcements'/><title type='text'>Week 03 – code (part 1)</title><content type='html'>&lt;p&gt;We started by creating a function which would create an object on stage by recursion:&lt;/p&gt;  &lt;pre class="python" name="code"&gt;import maya.cmds as cmds&lt;br /&gt;&lt;br /&gt;def fakeRecursion( iterations ):&lt;br /&gt;	for i in range(iterations): #range(0, iterations, 1)&lt;br /&gt;		#create the objects&lt;br /&gt;		cmds.circle(  n=&amp;quot;myCircle_%d&amp;quot; % i )&lt;br /&gt;		cmds.nurbsSquare( n=&amp;quot;mySquare_%d&amp;quot; % i )&lt;br /&gt;		#rotate objs&lt;br /&gt;		cmds.rotate(i*10, i*10, i*10, &amp;quot;myCircle_%d&amp;quot;%i)&lt;br /&gt;		cmds.rotate(-i*10,- i*10,- i*10, &amp;quot;mySquare_%d&amp;quot;%i)&lt;br /&gt;		#move objs&lt;br /&gt;		cmds.move(0,0,i/10, 	&amp;quot;myCircle_%d&amp;quot;%i)&lt;br /&gt;		cmds.move(0,0,i/10, 	&amp;quot;mySquare_%d&amp;quot;%i)&lt;br /&gt;		#collect points for polyFacet&lt;br /&gt;		pos1 = cmds.pointPosition(&amp;quot;topmySquare_%d.cv[0]&amp;quot; %i)&lt;br /&gt;		pos2 = cmds.pointPosition(&amp;quot;myCircle_%d.cv[0]&amp;quot; % i)&lt;br /&gt;		pos3 = cmds.pointPosition(&amp;quot;rightmySquare_%d.cv[0]&amp;quot; %i)&lt;br /&gt;		pos4 = cmds.pointPosition(&amp;quot;myCircle_%d.cv[1]&amp;quot; % i)&lt;br /&gt;		pos5 = cmds.pointPosition(&amp;quot;bottommySquare_%d.cv[0]&amp;quot; %i)&lt;br /&gt;		pos6 = cmds.pointPosition(&amp;quot;myCircle_%d.cv[2]&amp;quot; % i)&lt;br /&gt;		pos7 = cmds.pointPosition(&amp;quot;leftmySquare_%d.cv[0]&amp;quot; %i)&lt;br /&gt;		pos8 = cmds.pointPosition(&amp;quot;myCircle_%d.cv[3]&amp;quot; % i)&lt;br /&gt;		&lt;br /&gt;		cmds.polyCreateFacet(n=&amp;quot;myFacet_%d&amp;quot; % i,&lt;br /&gt;					p=[pos1, pos2, pos3, pos4, pos5, pos6, pos7, pos8]&lt;br /&gt;					)&lt;br /&gt;		cmds.group(&amp;quot;myCircle_%d&amp;quot; % i,&lt;br /&gt;						&amp;quot;mySquare_%d&amp;quot; % i,&lt;br /&gt;						&amp;quot;myFacet_%d&amp;quot; % i )&lt;br /&gt;						&lt;br /&gt;fakeRecursion(30)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;As we saw, the code above works, but has a series of coding problem which makes it non-flexible and difficult to read and modify. The first modification we did was to convert the recursion, which in this case was made by using a &lt;em&gt;for&lt;/em&gt; loop, to what we could call “real” recursion, when the function calls itself:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="python" name="code"&gt;def realRecursion( iterations ):&lt;br /&gt;	i = iterations&lt;br /&gt;	#create the objects&lt;br /&gt;	cmds.circle(  n=&amp;quot;myCircle_%d&amp;quot; % i )&lt;br /&gt;	cmds.nurbsSquare( n=&amp;quot;mySquare_%d&amp;quot; % i )&lt;br /&gt;	#rotate objs&lt;br /&gt;	cmds.rotate(i*10, i*10, i*10, &amp;quot;myCircle_%d&amp;quot;%i)&lt;br /&gt;	cmds.rotate(-i*10,- i*10,- i*10, &amp;quot;mySquare_%d&amp;quot;%i)&lt;br /&gt;	#move objs&lt;br /&gt;	cmds.move(0,0,i/10, 	&amp;quot;myCircle_%d&amp;quot;%i)&lt;br /&gt;	cmds.move(0,0,i/10, 	&amp;quot;mySquare_%d&amp;quot;%i)&lt;br /&gt;	#collect points for polyFacet&lt;br /&gt;	pos1 = cmds.pointPosition(&amp;quot;topmySquare_%d.cv[0]&amp;quot; %i)&lt;br /&gt;	pos2 = cmds.pointPosition(&amp;quot;myCircle_%d.cv[0]&amp;quot; % i)&lt;br /&gt;	pos3 = cmds.pointPosition(&amp;quot;rightmySquare_%d.cv[0]&amp;quot; %i)&lt;br /&gt;	pos4 = cmds.pointPosition(&amp;quot;myCircle_%d.cv[1]&amp;quot; % i)&lt;br /&gt;	pos5 = cmds.pointPosition(&amp;quot;bottommySquare_%d.cv[0]&amp;quot; %i)&lt;br /&gt;	pos6 = cmds.pointPosition(&amp;quot;myCircle_%d.cv[2]&amp;quot; % i)&lt;br /&gt;	pos7 = cmds.pointPosition(&amp;quot;leftmySquare_%d.cv[0]&amp;quot; %i)&lt;br /&gt;	pos8 = cmds.pointPosition(&amp;quot;myCircle_%d.cv[3]&amp;quot; % i)&lt;br /&gt;	&lt;br /&gt;	cmds.polyCreateFacet(n=&amp;quot;myFacet_%d&amp;quot; % i,&lt;br /&gt;					p=[pos1, pos2, pos3, pos4, pos5, pos6, pos7, pos8]&lt;br /&gt;					)&lt;br /&gt;	cmds.group(&amp;quot;myCircle_%d&amp;quot; % i,&lt;br /&gt;						&amp;quot;mySquare_%d&amp;quot; % i,&lt;br /&gt;						&amp;quot;myFacet_%d&amp;quot; % i )&lt;br /&gt;						&lt;br /&gt;	#recursion part&lt;br /&gt;	if iterations == 0:&lt;br /&gt;		return &amp;quot;Done.&amp;quot;&lt;br /&gt;	else:&lt;br /&gt;		iterations -= 1&lt;br /&gt;		realRecursion(iterations)&lt;br /&gt;		&lt;br /&gt;realRecursion( 30 )&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;As we see it keeps producing the same result as the function before. Also, in terms of speed and memory, the difference is not noticeable. But as we saw, when you start to use complex and long functions, the use of “real” recursion is regarded as much more efficient.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The second step on the optimization of the function was to remove all the hard-coded bits. This allows for greater flexibility, as we don’t really need to care about the names of the created objects, simply by using variables to store them and to refer to them later:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="python" name="code"&gt;def realRecursionOpt1( iterations ):&lt;br /&gt;	i = iterations&lt;br /&gt;	#create the objects&lt;br /&gt;	myCircle = cmds.circle( )&lt;br /&gt;	mySquare = cmds.nurbsSquare( )&lt;br /&gt;	#rotate objs&lt;br /&gt;	cmds.rotate(i*10, i*10, i*10, myCircle )&lt;br /&gt;	cmds.rotate(-i*10,- i*10,- i*10, mySquare)&lt;br /&gt;	#move objs&lt;br /&gt;	cmds.move(0,0,i/10, 	myCircle )&lt;br /&gt;	cmds.move(0,0,i/10, 	mySquare )&lt;br /&gt;	&lt;br /&gt;	#collect points for polyFacet&lt;br /&gt;	#select mySquare&lt;br /&gt;	cmds.select( mySquare, r=1 ) &lt;br /&gt;	sides = cmds.filterExpand( sm=9 )&lt;br /&gt;	pos1 = cmds.pointPosition( sides[0]+&amp;quot;.cv[0]&amp;quot; )&lt;br /&gt;	pos2 = cmds.pointPosition( myCircle[0] + &amp;quot;.cv[0]&amp;quot;  )&lt;br /&gt;	pos3 = cmds.pointPosition( sides[1]+&amp;quot;.cv[0]&amp;quot; )&lt;br /&gt;	pos4 = cmds.pointPosition( myCircle[0] + &amp;quot;.cv[1]&amp;quot;)&lt;br /&gt;	pos5 = cmds.pointPosition( sides[2]+&amp;quot;.cv[0]&amp;quot; )&lt;br /&gt;	pos6 = cmds.pointPosition( myCircle[0] + &amp;quot;.cv[2]&amp;quot;)&lt;br /&gt;	pos7 = cmds.pointPosition( sides[3]+&amp;quot;.cv[0]&amp;quot; )&lt;br /&gt;	pos8 = cmds.pointPosition( myCircle[0] + &amp;quot;.cv[3]&amp;quot;)&lt;br /&gt;	&lt;br /&gt;	myFacet = cmds.polyCreateFacet(&lt;br /&gt;					p=[pos1, pos2, pos3, pos4, pos5, pos6, pos7, pos8]&lt;br /&gt;					)&lt;br /&gt;	cmds.group( myCircle, mySquare, myFacet  )&lt;br /&gt;						&lt;br /&gt;	#recursion part&lt;br /&gt;	if iterations == 0:&lt;br /&gt;		return &amp;quot;Done.&amp;quot;&lt;br /&gt;	else:&lt;br /&gt;		iterations -= 1&lt;br /&gt;		realRecursionOpt1(iterations)	&lt;br /&gt;		&lt;br /&gt;realRecursionOpt1( 30 )&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;As you can see, we do not have to know any names of objects if we store them in variables and use them to refer to them later.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;As a last step on the optmization process, we saw how when you repeat a command too many times, it almost always means you can convert it into a loop. The same is valid for numbers or strings which are being repeated too many times: you should always recur to variables or arguments to define values which are used several times:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="python" name="code"&gt;def realRecursionOpt2( iterations , amt=10  ):&lt;br /&gt;	i = iterations&lt;br /&gt;	#create the objects&lt;br /&gt;	myCircle = cmds.circle( )&lt;br /&gt;	mySquare = cmds.nurbsSquare( )&lt;br /&gt;	#rotate objs&lt;br /&gt;	cmds.rotate(i*amt, i*amt, i*amt, myCircle )&lt;br /&gt;	cmds.rotate(-i*amt,- i*amt,- i*amt, mySquare)&lt;br /&gt;	#move objs&lt;br /&gt;	cmds.move(0,0,i/amt, 	myCircle )&lt;br /&gt;	cmds.move(0,0,i/amt, 	mySquare )&lt;br /&gt;	&lt;br /&gt;	#collect points for polyFacet&lt;br /&gt;	#select mySquare&lt;br /&gt;	cmds.select( mySquare, r=1 ) &lt;br /&gt;	sides = cmds.filterExpand( sm=9 )&lt;br /&gt;	&lt;br /&gt;	#create a list to store the positions&lt;br /&gt;	positions = []&lt;br /&gt;	for i in range( len(sides)  ):&lt;br /&gt;		pos1 = cmds.pointPosition( sides[i] +&amp;quot;.cv[0]&amp;quot; )&lt;br /&gt;		pos2 = cmds.pointPosition( myCircle[0] + &amp;quot;.cv[%d]&amp;quot; % i )&lt;br /&gt;		positions.append(pos1)&lt;br /&gt;		positions.append(pos2)&lt;br /&gt;	&lt;br /&gt;	&lt;br /&gt;	myFacet = cmds.polyCreateFacet(&lt;br /&gt;					p=positions&lt;br /&gt;					)&lt;br /&gt;	cmds.group( myCircle, mySquare, myFacet  )&lt;br /&gt;						&lt;br /&gt;	#recursion part&lt;br /&gt;	if iterations == 0:&lt;br /&gt;		return &amp;quot;Done.&amp;quot;&lt;br /&gt;	else:&lt;br /&gt;		iterations -= 1&lt;br /&gt;		realRecursionOpt2(iterations, iterations )	&lt;br /&gt;		&lt;br /&gt;realRecursionOpt2( 30 )&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Another thing we saw on the example above is the creation and usage of optional function arguments, in this case, &lt;em&gt;amt=10&lt;/em&gt;. In this case, as we already assign a value to &lt;em&gt;amt&lt;/em&gt; in the function definition,&amp;#160; it means that if you don’t pass this argument in the function call, Maya will assume its value as 10. In case you do supply an argument, Maya will use this value instead.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-6975692749090580476?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/6975692749090580476/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/05/week-03-code-part-1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/6975692749090580476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/6975692749090580476'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/05/week-03-code-part-1.html' title='Week 03 – code (part 1)'/><author><name>danrocha</name><uri>http://www.blogger.com/profile/04468836977853242830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-8570074601733642676</id><published>2009-05-19T18:28:00.001+02:00</published><updated>2009-06-17T13:43:12.341+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='announcements'/><title type='text'>Week 03 – recap</title><content type='html'>&lt;p&gt;Yesterday in our third class we started by taking a look on how to &lt;strong&gt;optimize your code&lt;/strong&gt;. In the example, we saw how to avoid common mistakes on scripting, such as &lt;strong&gt;hard-coding&lt;/strong&gt; and &lt;strong&gt;repetition instead of loops&lt;/strong&gt;. Also, we saw again how to convert a loop recursion into a “real” recursion.&lt;/p&gt;  &lt;p&gt;In the end we had a initial and quick introduction to &lt;strong&gt;classes&lt;/strong&gt; in Python, which will be our main topic next class. We will then start to look into voronoi diagrams, delaunay tessellations, and convex hulls.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-8570074601733642676?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/8570074601733642676/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/05/week-03-recap.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/8570074601733642676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/8570074601733642676'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/05/week-03-recap.html' title='Week 03 – recap'/><author><name>danrocha</name><uri>http://www.blogger.com/profile/04468836977853242830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-5097313522950471791</id><published>2009-05-19T17:40:00.002+02:00</published><updated>2009-06-17T13:45:07.276+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='assignments'/><category scheme='http://www.blogger.com/atom/ns#' term='Tudor'/><title type='text'>Assignment 01B</title><content type='html'>&lt;pre class="python" name="code"&gt;&lt;br /&gt;import maya.cmds as cmds&lt;br /&gt;import math&lt;br /&gt;import maya.mel as mm&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def getDistance(start, end):&lt;br /&gt; #start and end must be lists xyz&lt;br /&gt; v = [start[0]-end[0], start[1]-end[1], start[2]-end[2]] #list format x,y,z&lt;br /&gt; vector = "&lt;&lt;" + str(v[0]) + "," + str(v[1]) + "," + str(v[2]) + "&gt;&gt;"&lt;br /&gt; mag = mm.eval("mag " + vector + ";")&lt;br /&gt;&lt;br /&gt; return mag&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#########THIS IS THE NON_RECURSIVE PART ------ JUST SKIP#######################&lt;br /&gt;'''&lt;br /&gt;mySquare = cmds.nurbsSquare(sl1=10, sl2=15)&lt;br /&gt;&lt;br /&gt;isSides = cmds.filterExpand (sm=9)&lt;br /&gt;&lt;br /&gt;pos = []&lt;br /&gt;&lt;br /&gt;for i in range (len(isSides)):&lt;br /&gt; posa = cmds.pointPosition(isSides[i]+".cv[0]")&lt;br /&gt; pos.append (posa)&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;br /&gt;diag = getDistance(pos[0],pos[2])&lt;br /&gt;a = getDistance(pos[2],pos[3])&lt;br /&gt;b = getDistance(pos[3],pos[0])&lt;br /&gt;&lt;br /&gt;h = math.sqrt(a*a - ((a*diag)/(b+a)) * ((a*diag)/(b+a)))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;mySquare2 = cmds.nurbsSquare(sl1=h, sl2=diag)&lt;br /&gt;isSides2 = cmds.filterExpand (sm=9)&lt;br /&gt;pos2 = []&lt;br /&gt;&lt;br /&gt;for i in range (len(isSides2)):&lt;br /&gt; posb = cmds.pointPosition(isSides2[i]+".cv[0]")&lt;br /&gt; pos2.append (posb)&lt;br /&gt;&lt;br /&gt;#get diference between actual location and move&lt;br /&gt;dist = getDistance(pos[2],pos2[2])&lt;br /&gt;p1 = pos[2]&lt;br /&gt;p2 = pos2[2]&lt;br /&gt;x=p2[0] - p1[0]&lt;br /&gt;print x&lt;br /&gt;y=p2[0] - p1[0]&lt;br /&gt;cmds.move(x,-y,0,mySquare)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#get angle of rotation&lt;br /&gt;sinF = getDistance(pos[0],pos[1])&lt;br /&gt;alpha = math.asin(sinF/diag)&lt;br /&gt;Ld= math.degrees (alpha)&lt;br /&gt;&lt;br /&gt;cmds.rotate(0,0,Ld,mySquare2, pivot = pos2[2])&lt;br /&gt;'''&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#create initial rectangle&lt;br /&gt;mySquare = cmds.nurbsSquare(sl1=a, sl2=b)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#define recursive function&lt;br /&gt;def MyRecursive(iterations,a,b):&lt;br /&gt; &lt;br /&gt; isSides = cmds.filterExpand (sm=9)&lt;br /&gt; &lt;br /&gt; pos = []&lt;br /&gt; for i in range (len(isSides)):&lt;br /&gt;  posa = cmds.pointPosition(isSides[i]+".cv[0]")&lt;br /&gt;  pos.append (posa)&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt; #define length of diagonal in order to use it for next rectangle&lt;br /&gt; diag = getDistance(pos[0],pos[2])&lt;br /&gt; #define length of 2 sides to get height&lt;br /&gt; a = getDistance(pos[2],pos[3])&lt;br /&gt; b = getDistance(pos[3],pos[0])&lt;br /&gt; #get height of triangle (diagonal and the two sides)&lt;br /&gt; h = math.sqrt(a*a - ((a*diag)/(b+a)) * ((a*diag)/(b+a)))&lt;br /&gt; &lt;br /&gt; #create new rectangle with l2=diagonal length and l1= height of triangle&lt;br /&gt; mySquare2 = cmds.nurbsSquare(sl1=h, sl2=diag)&lt;br /&gt; isSides2 = cmds.filterExpand (sm=9)&lt;br /&gt; &lt;br /&gt; pos2 = []&lt;br /&gt; &lt;br /&gt; for i in range (len(isSides2)):&lt;br /&gt;  posb = cmds.pointPosition(isSides2[i]+".cv[0]")&lt;br /&gt;  pos2.append (posb)&lt;br /&gt; &lt;br /&gt; #get diference between actual location and move to future pivot point&lt;br /&gt; dist = getDistance(pos[2],pos2[2])&lt;br /&gt; p1 = pos[2]&lt;br /&gt; p2 = pos2[2]&lt;br /&gt; x=p2[0] - p1[0]&lt;br /&gt; y=p2[0] - p1[0]&lt;br /&gt; cmds.move(x,-y,0,mySquare)&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt; #get angle of rotation from diagonal&lt;br /&gt; sinF = getDistance(pos[0],pos[1])&lt;br /&gt; alpha = math.asin(sinF/diag)&lt;br /&gt; Ld= math.degrees (alpha)&lt;br /&gt; &lt;br /&gt; #rotate on diagonal&lt;br /&gt; cmds.rotate(0,0,Ld,mySquare2, pivot = pos2[2])&lt;br /&gt; &lt;br /&gt; #recursion part&lt;br /&gt; #if else conditions&lt;br /&gt; if iterations == 0:&lt;br /&gt;  return "Done"&lt;br /&gt; else:&lt;br /&gt;  iterations -= 1&lt;br /&gt;  MyRecursive(iterations, a,b)&lt;br /&gt;  &lt;br /&gt;#call function&lt;br /&gt;MyRecursive(10,10,15)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The problems i have are first of all that the height of the triangle i am calculating is not corresponding to the actual height.&lt;br /&gt;&lt;br /&gt;Second would be that the recursion is not working as it should.&lt;br /&gt;&lt;br /&gt;What it should do is first create a rectangle, create another one(with length=diagonal, and width=height of the triangle formed by diagonal and two sides). Rotate the last created rectangle on the diagonal, so that one of the sides "becomes" the diagonal. And then repeat everything for the next one.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-5097313522950471791?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/5097313522950471791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/05/assignment-01b_19.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/5097313522950471791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/5097313522950471791'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/05/assignment-01b_19.html' title='Assignment 01B'/><author><name>Tudor</name><uri>http://www.blogger.com/profile/14766722343631674567</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_mg0pJcUsrJ0/SPP1rrTZ_0I/AAAAAAAAAAo/7XdqQ0U38fI/S220/io3.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-6646992284861763776</id><published>2009-05-19T16:30:00.003+02:00</published><updated>2009-06-17T13:47:48.504+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='A+M'/><category scheme='http://www.blogger.com/atom/ns#' term='assignments'/><title type='text'>Irina_Algorithm Sketches</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ZSYzPEUPVm4/ShLF5FRIQoI/AAAAAAAAAKw/ja8tDd8LYfM/s1600-h/P1_black.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 283px;" src="http://1.bp.blogspot.com/_ZSYzPEUPVm4/ShLF5FRIQoI/AAAAAAAAAKw/ja8tDd8LYfM/s400/P1_black.jpg" alt="" id="BLOGGER_PHOTO_ID_5337546092844696194" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ZSYzPEUPVm4/ShLF45IX-PI/AAAAAAAAAKo/KxekdO0PaIQ/s1600-h/P2_black.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 283px;" src="http://3.bp.blogspot.com/_ZSYzPEUPVm4/ShLF45IX-PI/AAAAAAAAAKo/KxekdO0PaIQ/s400/P2_black.jpg" alt="" id="BLOGGER_PHOTO_ID_5337546089586751730" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ZSYzPEUPVm4/ShLF4Wah4aI/AAAAAAAAAKg/YF-l9CQErzU/s1600-h/P3_black.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 283px;" src="http://3.bp.blogspot.com/_ZSYzPEUPVm4/ShLF4Wah4aI/AAAAAAAAAKg/YF-l9CQErzU/s400/P3_black.jpg" alt="" id="BLOGGER_PHOTO_ID_5337546080267657634" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;                         &lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-6646992284861763776?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/6646992284861763776/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/05/irinaalgorithm-sketches.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/6646992284861763776'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/6646992284861763776'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/05/irinaalgorithm-sketches.html' title='Irina_Algorithm Sketches'/><author><name>alexandra virlan</name><uri>http://www.blogger.com/profile/07826702946109365185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/-Kxco3AGM9F4/TVkNwXHhRCI/AAAAAAAAAbk/8dMS0nu4xvA/s220/60961_1579924174077_1114837832_31660390_6247364_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ZSYzPEUPVm4/ShLF5FRIQoI/AAAAAAAAAKw/ja8tDd8LYfM/s72-c/P1_black.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-1574876143416189352</id><published>2009-05-19T14:37:00.004+02:00</published><updated>2009-06-17T13:47:10.865+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Alice'/><category scheme='http://www.blogger.com/atom/ns#' term='assignments'/><title type='text'>Alice_Assignment 01B script trial</title><content type='html'>&lt;pre class="python" name="code"&gt;&lt;br /&gt;import maya.cmds as cmds&lt;br /&gt;&lt;br /&gt;#create an initial square&lt;br /&gt;initialSquare = cmds.nurbsSquare (sl1=10, sl2=10)&lt;br /&gt;isSides = cmds.filterExpand(sm=9)&lt;br /&gt;&lt;br /&gt;#create 3 random points inside the square** (I don't know how to find this random command)&lt;br /&gt;ptA =&lt;br /&gt;ptB =&lt;br /&gt;ptC =&lt;br /&gt;&lt;br /&gt;def pointBoundary(iterations)&lt;br /&gt; i=iterations&lt;br /&gt; &lt;br /&gt; #Create 3 curves&lt;br /&gt;  lineA = cmds.curve(ep=(ptC,ptB),d=1)&lt;br /&gt;  lineB = cmds.curve(ep=(ptA,ptC),d=1)&lt;br /&gt;  lineC = cmds.curve(ep=(ptB,ptA),d=1)&lt;br /&gt; &lt;br /&gt; #Get the distance between 3 points&lt;br /&gt;  lenA = cmds.distanceDimension(ptC,ptB)&lt;br /&gt;  lenB = cmds.distanceDimension(ptA,ptC)&lt;br /&gt;  lenC = cmds.distanceDimension(ptB,ptA)&lt;br /&gt; &lt;br /&gt; #Radius of the 3 circles:riA,riB,riC&lt;br /&gt;  riA = (lenB + lenC - lenA)/2&lt;br /&gt;  riB = (lenA + lenC - lenB)/2&lt;br /&gt;  riC = (lenA + lenB - lenC)/2&lt;br /&gt; &lt;br /&gt; #Create 3 circles&lt;br /&gt;  cirleA = cmds.circle(c=ptA,r=riA)&lt;br /&gt;  cirleB = cmds.circle(c=ptB,r=riB)&lt;br /&gt;  CirleC = cmds.circle(c=ptC,r=riC)&lt;br /&gt;  &lt;br /&gt; #Tangent points among the 3 circles&lt;br /&gt;  tanA = cmds.curveIntersect(lineA,circleB)&lt;br /&gt;  tanB = cmds.curveIntersect(lineB,circleC)&lt;br /&gt;  tanC = cmds.curveIntersect(lineC,circleA)&lt;br /&gt;   &lt;br /&gt; #Offset lenA, lenB, lenC to a long distance and create new lines offA, offB, offC&lt;br /&gt; #(I am not sure if it offset to the right direction!!!)&lt;br /&gt; &lt;br /&gt;  offA = cmds.offsetCurve(lenA,1000)&lt;br /&gt;  offB = cmds.offsetCurve(lenB,1000)&lt;br /&gt;  offC = cmds.offsetCurve(lenC,1000)&lt;br /&gt;  &lt;br /&gt;  nodeA = cmds.closestPointOnCurve(offA,tanA)&lt;br /&gt;  nodeB = cmds.closestPointOnCurve(offB,tanB)&lt;br /&gt;  nodeC = cmds.closestPointOnCurve(offC,tanC)&lt;br /&gt;  &lt;br /&gt; #Draw perpendicular lines &lt;br /&gt;  perA = cmds.curve(ep=(tanA,nodeA), d=1)&lt;br /&gt;  perB = cmds.curve(ep=(tanB,nodeB), d=1)&lt;br /&gt;  perC = cmds.curve(ep=(tanC,nodeC), d=1)&lt;br /&gt;  &lt;br /&gt; &lt;br /&gt; #Test if perpendicular lines intersect with which sides of the square&lt;br /&gt; #Get coordinates of the 3 intersection points on the square and &lt;br /&gt; #replace the existing values of ptA, ptB, ptC&lt;br /&gt; &lt;br /&gt; for i in range(len(isSides)):&lt;br /&gt;  isIntA = cmds.curveIntersect(perA,isSides[i])&lt;br /&gt;  isIntB = cmds.curveIntersect(perB,isSides[i])&lt;br /&gt;  isIntC = cmds.curveIntersect(perC,isSides[i])&lt;br /&gt;  if isIntA != None:&lt;br /&gt;   ptA = isIntA&lt;br /&gt;  if isIntB != None:&lt;br /&gt;   ptB = isIntB&lt;br /&gt;  if isIntC != None:&lt;br /&gt;   ptC =isIntC&lt;br /&gt;   &lt;br /&gt; &lt;br /&gt; #Resize the initial Square&lt;br /&gt;  cmds.rotate(0,0,30,initialSquare)&lt;br /&gt;  cmds.scale(1.5,1.5,1,initialSquare)&lt;br /&gt; &lt;br /&gt; #Recursion&lt;br /&gt; if iterations ==0:&lt;br /&gt;  return "Done"&lt;br /&gt; else:&lt;br /&gt;  iterations -=1&lt;br /&gt; &lt;br /&gt;def pointBoundary(10)&lt;br /&gt; &lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-1574876143416189352?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/1574876143416189352/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/05/your-code-here-indented-and-all-import.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/1574876143416189352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/1574876143416189352'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/05/your-code-here-indented-and-all-import.html' title='Alice_Assignment 01B script trial'/><author><name>alice</name><uri>http://www.blogger.com/profile/13826062750165810811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-1489785295088903939</id><published>2009-05-18T19:22:00.000+02:00</published><updated>2009-06-17T13:46:38.480+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Grisha'/><category scheme='http://www.blogger.com/atom/ns#' term='assignments'/><title type='text'></title><content type='html'>&lt;pre class="python" name="code"&gt;&lt;br /&gt; import maya.cmds as cmds&lt;br /&gt; x=10&lt;br /&gt; y=10&lt;br /&gt; #Make a Square&lt;br /&gt; initialSqare = cmds.nurbsSquare(sl1=x, sl2=y)&lt;br /&gt; #get outline&lt;br /&gt; isSides = cmds.filterExpand (sm=9)&lt;br /&gt; print isSides&lt;br /&gt; #make an empty list&lt;br /&gt; Squares = []&lt;br /&gt; Squares.append (1)&lt;br /&gt;&lt;br /&gt; def squareINsquare (number):&lt;br /&gt;  #scale&lt;br /&gt;  x=10/(1.5*len(Squares)+1)&lt;br /&gt; y=10/(1.5*len(Squares)+1)&lt;br /&gt; #loop &lt;br /&gt; for j in range (0,len(Squares),1):&lt;br /&gt;  cmds.select (Squares[j], r=True)&lt;br /&gt;  #get outline&lt;br /&gt;  isSides = cmds.filterExpand (sm=9)&lt;br /&gt;  #looping in outline&lt;br /&gt;  for i in range (0,2,1):&lt;br /&gt;   perc1 = 0&lt;br /&gt;   perc2 = 1&lt;br /&gt;   line1=isSides[1]&lt;br /&gt;   line2 = isSides[2]&lt;br /&gt;   if i == 0:&lt;br /&gt;    poc1 = cmds.pointOnCurve(line1, pr=perc1, top=True, p=True)&lt;br /&gt;    print poc1&lt;br /&gt;    #change the center of the new square &lt;br /&gt;    poc1[0]=poc1[0]-x/2&lt;br /&gt;    poc1[1]=poc1[1]+y/2&lt;br /&gt;    print poc1&lt;br /&gt;    #make a new square&lt;br /&gt;    initialSqare1 = cmds.nurbsSquare(c = poc1, sl1=x, sl2=y)&lt;br /&gt;   #the same for the oposit corner of the squre &lt;br /&gt;   else:&lt;br /&gt;    poc2 = cmds.pointOnCurve(line2, pr=perc2, top=True, p=True)&lt;br /&gt;    print poc2&lt;br /&gt;    poc2[0]=poc2[0]+x/2&lt;br /&gt;    poc2[1]=poc2[1]-y/2&lt;br /&gt;    print poc2&lt;br /&gt;    initialSqare2 = cmds.nurbsSquare(c = poc2, sl1=x, sl2=y)&lt;br /&gt;   &lt;br /&gt;   Squares.append (initialSqare1)&lt;br /&gt;   Squares.append (initialSqare2)&lt;br /&gt; Squares=Squares1&lt;br /&gt; Squares1=[]  &lt;br /&gt; if number == 0 :&lt;br /&gt;  #stop&lt;br /&gt;  return "Done."&lt;br /&gt; else:&lt;br /&gt;  #did not finish yet&lt;br /&gt;  #remove one unit (count down)&lt;br /&gt;  number -= 1&lt;br /&gt; &lt;br /&gt;  squareINsquare (number)&lt;br /&gt;&lt;br /&gt; squareINsquare (3)&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-1489785295088903939?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/1489785295088903939/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/05/import-maya_18.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/1489785295088903939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/1489785295088903939'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/05/import-maya_18.html' title=''/><author><name>Grisha Zotov</name><uri>http://www.blogger.com/profile/05521528786515011570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='14' height='32' src='http://2.bp.blogspot.com/_HXZLYcrSPRg/Ss9Gxcu_CXI/AAAAAAAAAV8/W-6Ebb2f7vA/S220/meeee.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-3125303873571834821</id><published>2009-05-18T12:35:00.000+02:00</published><updated>2009-06-17T13:48:22.665+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Liu'/><category scheme='http://www.blogger.com/atom/ns#' term='assignments'/><title type='text'>Andreea Assignment01B</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_2gY_HsWGQR4/ShE6JxKLiII/AAAAAAAAAbI/XD5Ui3syM6s/s1600-h/180509-2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 283px; height: 400px;" src="http://2.bp.blogspot.com/_2gY_HsWGQR4/ShE6JxKLiII/AAAAAAAAAbI/XD5Ui3syM6s/s400/180509-2.jpg" alt="" id="BLOGGER_PHOTO_ID_5337110972900018306" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_2gY_HsWGQR4/ShE6Jh9tJ4I/AAAAAAAAAbA/tqufANPJhE0/s1600-h/180509-1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 283px; height: 400px;" src="http://3.bp.blogspot.com/_2gY_HsWGQR4/ShE6Jh9tJ4I/AAAAAAAAAbA/tqufANPJhE0/s400/180509-1.jpg" alt="" id="BLOGGER_PHOTO_ID_5337110968821163906" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-3125303873571834821?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/3125303873571834821/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/05/andreea-assignment01b.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/3125303873571834821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/3125303873571834821'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/05/andreea-assignment01b.html' title='Andreea Assignment01B'/><author><name>Liu, Kocheng</name><uri>http://www.blogger.com/profile/06568145659726503765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_2gY_HsWGQR4/S2lJxVY9V0I/AAAAAAAAArI/ahtB3H3aRyc/S220/me1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_2gY_HsWGQR4/ShE6JxKLiII/AAAAAAAAAbI/XD5Ui3syM6s/s72-c/180509-2.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-605234997884640062</id><published>2009-05-18T03:42:00.010+02:00</published><updated>2009-06-17T13:47:10.865+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Alice'/><category scheme='http://www.blogger.com/atom/ns#' term='assignments'/><title type='text'>Alice_Assignment 01B</title><content type='html'>&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;I started by writing a simple algorithm and tried to search for suitable commands in Maya to execute the task, according to my idea. But soon enough, I already feel like I don't know much commands -.-.....&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Besides, to answer your comments for my last post, mathematically speaking, there should be only 1 possibility to draw 3 circles touching each of the others. Therefore, given any 3 points, there should be only 1 result. &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;I haven't get to the point to solve how to avoid concentrations result of the circles after many iterations. However, if it doesn't make the script much more complicated, I would like to try out if the square(the boundary) is rotated/extended according to a certain rule each time after making 3 new points and in a way to create an intricate network.... : )  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_k6vtLLcz3OQ/ShC9LrlQ1II/AAAAAAAAAYI/pRdEiV49hjs/s1600-h/Picture+5.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 222px;" src="http://1.bp.blogspot.com/_k6vtLLcz3OQ/ShC9LrlQ1II/AAAAAAAAAYI/pRdEiV49hjs/s320/Picture+5.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5336973566809265282" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-605234997884640062?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/605234997884640062/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/05/aliceassignment-01b.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/605234997884640062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/605234997884640062'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/05/aliceassignment-01b.html' title='Alice_Assignment 01B'/><author><name>alice</name><uri>http://www.blogger.com/profile/13826062750165810811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_k6vtLLcz3OQ/ShC9LrlQ1II/AAAAAAAAAYI/pRdEiV49hjs/s72-c/Picture+5.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-1755101765184028404</id><published>2009-05-18T02:13:00.000+02:00</published><updated>2009-06-17T13:45:07.278+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='A+M'/><category scheme='http://www.blogger.com/atom/ns#' term='assignments'/><title type='text'>Assignment 01B</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_piYNOHE-VrM/ShCoTtDiY1I/AAAAAAAAAUw/e2wlAnPxUzQ/s1600-h/asigment+01B.jpg"&gt;&lt;img style="cursor: pointer; width: 400px; height: 283px;" src="http://3.bp.blogspot.com/_piYNOHE-VrM/ShCoTtDiY1I/AAAAAAAAAUw/e2wlAnPxUzQ/s400/asigment+01B.jpg" alt="" id="BLOGGER_PHOTO_ID_5336950614899450706" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-1755101765184028404?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/1755101765184028404/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/05/assignment-01b_18.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/1755101765184028404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/1755101765184028404'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/05/assignment-01b_18.html' title='Assignment 01B'/><author><name>Mircea</name><uri>http://www.blogger.com/profile/04458403012112810362</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_piYNOHE-VrM/ShCoTtDiY1I/AAAAAAAAAUw/e2wlAnPxUzQ/s72-c/asigment+01B.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-861325523819048857</id><published>2009-05-18T01:02:00.001+02:00</published><updated>2009-06-17T13:49:55.255+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Shi'/><category scheme='http://www.blogger.com/atom/ns#' term='assignments'/><title type='text'>assignment 01b-1</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/_rnqzRpyl1j4/ShCX0GerRWI/AAAAAAAAAKY/ep9HT_qufAE/s1600-h/assignment+01b.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 291px; height: 400px;" src="http://2.bp.blogspot.com/_rnqzRpyl1j4/ShCX0GerRWI/AAAAAAAAAKY/ep9HT_qufAE/s400/assignment+01b.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5336932479782307170" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-861325523819048857?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/861325523819048857/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/05/assignment-01b-1.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/861325523819048857'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/861325523819048857'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/05/assignment-01b-1.html' title='assignment 01b-1'/><author><name>SHI</name><uri>http://www.blogger.com/profile/15369141728731220921</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='22' src='http://1.bp.blogspot.com/_rnqzRpyl1j4/STJsXKRUqLI/AAAAAAAAAGw/OUiufM2sYXI/S220/1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_rnqzRpyl1j4/ShCX0GerRWI/AAAAAAAAAKY/ep9HT_qufAE/s72-c/assignment+01b.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-5344539280674581955</id><published>2009-05-17T23:36:00.002+02:00</published><updated>2009-06-17T13:49:04.804+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Anastasia'/><category scheme='http://www.blogger.com/atom/ns#' term='assignments'/><title type='text'>homework</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_1qBy3zIG0ec/ShCDizSL-6I/AAAAAAAAAlQ/DOmjptrH7sc/s1600-h/Recursion.jpg"&gt;&lt;img style="cursor: pointer; width: 400px; height: 194px;" src="http://1.bp.blogspot.com/_1qBy3zIG0ec/ShCDizSL-6I/AAAAAAAAAlQ/DOmjptrH7sc/s400/Recursion.jpg" alt="" id="BLOGGER_PHOTO_ID_5336910192339319714" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-5344539280674581955?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/5344539280674581955/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/05/homework.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/5344539280674581955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/5344539280674581955'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/05/homework.html' title='homework'/><author><name>Anastasia Globa</name><uri>https://profiles.google.com/103588731693715960502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-KXLHi4wdi4w/AAAAAAAAAAI/AAAAAAAABBE/ASpfZ48C_ow/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_1qBy3zIG0ec/ShCDizSL-6I/AAAAAAAAAlQ/DOmjptrH7sc/s72-c/Recursion.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-3833057402318788924</id><published>2009-05-17T22:49:00.004+02:00</published><updated>2009-06-17T13:45:07.279+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Liu'/><category scheme='http://www.blogger.com/atom/ns#' term='assignments'/><title type='text'>Assignment 01B</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_2gY_HsWGQR4/ShB4XJjtkWI/AAAAAAAAAa4/6Hg367nh4B4/s1600-h/2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 276px;" src="http://4.bp.blogspot.com/_2gY_HsWGQR4/ShB4XJjtkWI/AAAAAAAAAa4/6Hg367nh4B4/s400/2.jpg" alt="" id="BLOGGER_PHOTO_ID_5336897897532068194" border="0" /&gt;Question:&lt;/a&gt;&lt;br /&gt;  How to find out the point which is tangent to the other circle in this case?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-3833057402318788924?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/3833057402318788924/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/05/assignment-01b_17.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/3833057402318788924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/3833057402318788924'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/05/assignment-01b_17.html' title='Assignment 01B'/><author><name>Liu, Kocheng</name><uri>http://www.blogger.com/profile/06568145659726503765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_2gY_HsWGQR4/S2lJxVY9V0I/AAAAAAAAArI/ahtB3H3aRyc/S220/me1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_2gY_HsWGQR4/ShB4XJjtkWI/AAAAAAAAAa4/6Hg367nh4B4/s72-c/2.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-7466406582219861024</id><published>2009-05-17T00:19:00.011+02:00</published><updated>2009-06-17T13:45:59.781+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='assignments'/><category scheme='http://www.blogger.com/atom/ns#' term='Alec'/><title type='text'>First Assignement ::: Relationship between 2D &amp; 3D</title><content type='html'>&lt;span style="font-weight: bold; color: rgb(255, 102, 0);font-size:85%;" &gt;&lt;span style="font-family:trebuchet ms;"&gt;Recurcive square ($iteration=10, $angle=15, $offset=2)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_qqt7zCa-76A/Sg88tLgzWoI/AAAAAAAAAV8/tmHleu-z9SQ/s1600-h/Picture+3.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 400px; height: 250px;" src="http://1.bp.blogspot.com/_qqt7zCa-76A/Sg88tLgzWoI/AAAAAAAAAV8/tmHleu-z9SQ/s400/Picture+3.png" alt="" id="BLOGGER_PHOTO_ID_5336550830339480194" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold; color: rgb(255, 102, 0);font-family:trebuchet ms;font-size:85%;"  &gt;Recurcive square ($iteration=10, $angle=15, $offset=2)&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_qqt7zCa-76A/Sg88tPlzegI/AAAAAAAAAV0/Vqv4bAUkl0c/s1600-h/Picture+1.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 400px; height: 250px;" src="http://1.bp.blogspot.com/_qqt7zCa-76A/Sg88tPlzegI/AAAAAAAAAV0/Vqv4bAUkl0c/s400/Picture+1.png" alt="" id="BLOGGER_PHOTO_ID_5336550831434201602" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 102, 0);font-family:trebuchet ms;font-size:85%;"  &gt;Recurcive square ($iteration=10, $angle=15, $offset=0.2)&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_qqt7zCa-76A/Sg88uvG4m3I/AAAAAAAAAWM/LvAow3_ibrk/s1600-h/Picture+5.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 400px; height: 250px;" src="http://4.bp.blogspot.com/_qqt7zCa-76A/Sg88uvG4m3I/AAAAAAAAAWM/LvAow3_ibrk/s400/Picture+5.png" alt="" id="BLOGGER_PHOTO_ID_5336550857074318194" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 102, 0);font-family:trebuchet ms;font-size:85%;"  &gt;Recurcive square ($iteration=15, $angle=33, $offset=0.2)&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_qqt7zCa-76A/Sg9CrGmfvNI/AAAAAAAAAWc/P56X90j9gqM/s1600-h/Picture+6.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 400px; height: 250px;" src="http://1.bp.blogspot.com/_qqt7zCa-76A/Sg9CrGmfvNI/AAAAAAAAAWc/P56X90j9gqM/s400/Picture+6.png" alt="" id="BLOGGER_PHOTO_ID_5336557391731211474" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold; color: rgb(255, 102, 0);font-family:trebuchet ms;font-size:85%;"  &gt;Recurcive square ($iteration=8, $angle=75, $offset=0.2)&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_qqt7zCa-76A/Sg9CrCGN3VI/AAAAAAAAAWU/tJX9c6jpiTo/s1600-h/Picture+7.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 400px; height: 250px;" src="http://3.bp.blogspot.com/_qqt7zCa-76A/Sg9CrCGN3VI/AAAAAAAAAWU/tJX9c6jpiTo/s400/Picture+7.png" alt="" id="BLOGGER_PHOTO_ID_5336557390522080594" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;pre class="python" name="code"&gt;import maya.cmds as cmds&lt;br /&gt;&lt;br /&gt;cmds.select(all=True)&lt;br /&gt;cmds.delete()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def recursivesquares(iteration, angle, offset):&lt;br /&gt;rotationpoint = [0,0,0]&lt;br /&gt;for i in range (0, iteration, 1):&lt;br /&gt;&lt;br /&gt;cmds.nurbsSquare(n="nurbsSquare%d" %i, sl1=10, sl2=10, c=rotationpoint, nry=1, nrz=0)&lt;br /&gt;cmds.select("topnurbsSquare%d" %i)&lt;br /&gt;&lt;br /&gt;cmds.select("nurbsSquare%d" %i)&lt;br /&gt;cmds.rotate(i*angle, i*angle, i*angle, pivot=(rotationpoint))&lt;br /&gt;&lt;br /&gt;top = 'topnurbsSquare%d' %i&lt;br /&gt;topposition = cmds.pointPosition('topnurbsSquare%d.cv[0]' %i, world=True)&lt;br /&gt;left = 'leftnurbsSquare%d' %i&lt;br /&gt;leftposition = cmds.pointPosition('leftnurbsSquare%d.cv[0]' %i, world=True)&lt;br /&gt;bottom = 'bottomnurbsSquare%d' %i&lt;br /&gt;bottomposition = cmds.pointPosition('bottomnurbsSquare%d.cv[0]' %i, world=True)&lt;br /&gt;right = 'rightnurbsSquare%d' %i&lt;br /&gt;rightposition = cmds.pointPosition('rightnurbsSquare%d.cv[0]' %i, world=True)&lt;br /&gt;&lt;br /&gt;cmds.squareSurface(top, right, bottom, left, n='nurbsSurface%d'%i, ct1=1, ct2=1, ct3=1, ct4=1, po=0)&lt;br /&gt;rotationpoint = cmds.pointOnSurface('nurbsSurface%d'%i, u=offset, v=offset, position=True)&lt;br /&gt;cmds.spaceLocator(p=rotationpoint, n="locator%d" %i)&lt;br /&gt;cmds.delete('nurbsSurface%d'%i)&lt;br /&gt;&lt;br /&gt;cmds.delete('nurbsSquare%d' %i)&lt;br /&gt;cmds.curve(n='topviewnurbsSquare%d' %i, d=1, p=[(topposition[0], topposition[1], 0),(leftposition[0], leftposition[1], 0),(bottomposition[0], bottomposition[1], 0),(rightposition[0], rightposition[1], 0), (topposition[0], topposition[1], 0)] )&lt;br /&gt;cmds.curve(n='frontviewnurbsSquare%d' %i, d=1, p=[(topposition[0], 0, topposition[2]),(leftposition[0], 0, leftposition[2]),(bottomposition[0], 0, bottomposition[2]),(rightposition[0], 0, rightposition[2]), (topposition[0], 0, topposition[2])] )&lt;br /&gt;cmds.curve(n='sideviewnurbsSquare%d' %i, d=1, p=[(0, topposition[1], topposition[2]),(0, leftposition[1], leftposition[2]),(0, bottomposition[1], bottomposition[2]),(0, rightposition[1], rightposition[2]), (0, topposition[1], topposition[2])] )&lt;br /&gt;&lt;br /&gt;group = cmds.group('topviewnurbsSquare%d' %i, 'frontviewnurbsSquare%d' %i, 'sideviewnurbsSquare%d' %i, 'locator%d' %i, n='Squares%d' %i)&lt;br /&gt;&lt;br /&gt;recursivesquares(10,15,0.9)&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-7466406582219861024?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/7466406582219861024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/05/import-maya.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/7466406582219861024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/7466406582219861024'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/05/import-maya.html' title='First Assignement ::: Relationship between 2D &amp; 3D'/><author><name>alec</name><uri>http://www.blogger.com/profile/09823278314767605002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/_qqt7zCa-76A/SPT1pm42sNI/AAAAAAAAAFw/26kHzdRhX_4/S220/2589578483_d2918fb00c.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_qqt7zCa-76A/Sg88tLgzWoI/AAAAAAAAAV8/tmHleu-z9SQ/s72-c/Picture+3.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-4971442503513580781</id><published>2009-05-14T15:02:00.001+02:00</published><updated>2009-06-17T13:43:12.341+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='announcements'/><title type='text'>Assignment 01B</title><content type='html'>&lt;p&gt;Now it is time to start scripting your idea. Don’t worry about making it perfect, just start simple and small and go step-by-step. Simplification is the key. Here some guidelines:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Make your diagrams and logic (Assignment 01A) very clear. Divide the script into smaller tasks to check which tasks you know and which you don’t know how to perform&lt;/li&gt;    &lt;li&gt;Define initial condition for your function to work. If it is very clear, you know that after you reach the initial condition again, you can run your function one more time. That’s where the recursion is.&lt;/li&gt;    &lt;li&gt;Define a clear final condition&lt;/li&gt;    &lt;li&gt;Make one iteration of your function work and only then make it recursive&lt;/li&gt;    &lt;li&gt;If you reach a point where you can’t proceed, either look for help on the web, or post your progress on the blog, so I can make some comments&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Please, post your progress by Sunday (17.05) morning on the blog, as I need time to take a look at it and prepare for the class on Monday, to be able to help you. &lt;/p&gt;  &lt;p&gt;Don’t forget to post and updated diagram and logic if you changed it or developed further. We need to understand what you want to achieve! &lt;/p&gt;  &lt;p&gt;If you manage the whole script by Sunday, great. If not, please make sure you tried really hard!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-4971442503513580781?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/4971442503513580781/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/05/assignment-01b.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/4971442503513580781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/4971442503513580781'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/05/assignment-01b.html' title='Assignment 01B'/><author><name>danrocha</name><uri>http://www.blogger.com/profile/04468836977853242830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-2857601016115706445</id><published>2009-05-14T14:52:00.001+02:00</published><updated>2009-06-17T13:43:12.341+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='announcements'/><title type='text'>Assignment 01B – Help Functions</title><content type='html'>&lt;p&gt;For the completion of Assignment 01, I prepared some small help functions and procedures to help you out in the process of scripting. They are based on things I observed on most submissions. They are not intended to provide ready solutions, but to offer some hints. Therefore they might seem a bit random and out of context. Any help you need to use them, please post on the comments.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://groups.google.com/group/gsii_ss09/web/gsii_A01_helpFunctions.py"&gt;gsii_A01_helpFunctions.py&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-2857601016115706445?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/2857601016115706445/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/05/assignment-01b-help-functions.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/2857601016115706445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/2857601016115706445'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/05/assignment-01b-help-functions.html' title='Assignment 01B – Help Functions'/><author><name>danrocha</name><uri>http://www.blogger.com/profile/04468836977853242830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-1187367588958490771</id><published>2009-05-14T14:19:00.003+02:00</published><updated>2009-06-17T13:43:34.511+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='announcements'/><title type='text'>The serpentine() function</title><content type='html'>&lt;p&gt;We started the script by defining the main logic behind it, according to the diagrams posted last week. &lt;/p&gt;  &lt;pre class="python" name="code"&gt;# Basic logic&lt;br /&gt;# 1) create an initial square (4 sides)&lt;br /&gt;# 2) loop thorugh the sides:&lt;br /&gt;#    2.1) get current line (line1)&lt;br /&gt;#    2.2) get next line (line2)&lt;br /&gt;#    2.3) define the percentages&lt;br /&gt;#    2.4) find the point on curve&lt;br /&gt;#    2.5) connect these points&lt;br /&gt;# 3) After finished, select all 4 new lines and run again&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;As we see by this logic, what we need to run the loop each time is 4 curves through which we will loop and generate a new set of 4 lines. You can notice that as soon as we reach the initial condition, we can run the whole loop again (3): this is where recursion comes in handy. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="python" name="code"&gt;#creating initial square&lt;br /&gt;initialSquare = cmds.nurbsSquare( sl1=10, sl2=10 )&lt;br /&gt;isSides = cmds.filterExpand(sm=9)&lt;br /&gt;print isSides&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;This is how we start everything. With this command we have the 4 initial curve which make our connection loop work. Most important is that, by the way Maya created a nurbsSquare, all curves are selected in the right order on which they compose the square.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="python" name="code"&gt;#lets connect line after line in a loop&lt;br /&gt;for i in range(0, len(isSides), 1):&lt;br /&gt;   print i&lt;br /&gt;   #get the name of the current line&lt;br /&gt;   line1 = isSides[i]&lt;br /&gt;   #get the name of the following line&lt;br /&gt;   #but first check if we are already on the last line&lt;br /&gt;   #because then we have to pick back the first line&lt;br /&gt;   if i == len(isSides)-1:&lt;br /&gt;       #this means it is in the last element&lt;br /&gt;       #so we have to get the first curve&lt;br /&gt;       line2 = isSides[0]&lt;br /&gt;   else:&lt;br /&gt;       #otherwise, get next curve&lt;br /&gt;       line2 = isSides[i+1]&lt;br /&gt;      &lt;br /&gt;   print line1, line2 #to check the line pair&lt;br /&gt;   #define the percentages on which to connect the lines&lt;br /&gt;   #this could be defined before the loop, because it is fixed&lt;br /&gt;   #but in case we wanted to make it variable, we need to&lt;br /&gt;   #define them here&lt;br /&gt;   perc1 = 1./2&lt;br /&gt;   perc2 = 1./3&lt;br /&gt;   #get the coordinates on the lines on the percentages&lt;br /&gt;   poc1 = cmds.pointOnCurve(  line1, pr=perc1, top=True, p=True  )&lt;br /&gt;   poc2 = cmds.pointOnCurve(  line2, pr=perc2, top=True, p=True  )&lt;br /&gt;   #create the curve to connect both lines&lt;br /&gt;   cmds.curve(ep=(poc1, poc2), d=1)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;This is the basic main loop we need. Having a set of four consecutive curves selected, it works by going through each one of them and connecting them with a straight line from certain points in each line (define by percentages). By the end of this loop, we have 4 new curves, which we can use to feed the next iteration of the function. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;To convert this basic part into a recursive function, we just need some small adjustments. The most important is the if/else statement after the loop which checks for the final condition. This ensures us the loop will not be infinite, and that the function will call itself again in case the end condition is still not met, creating the recursive effect we need.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="python" name="code"&gt;#turning this into a recursive function&lt;br /&gt;def serpentine(iterations):&lt;br /&gt;   #we assume that 4 lines are selected on stage&lt;br /&gt;   #and that these lines are in correct order&lt;br /&gt;   #this is the initial condition for the loop to work&lt;br /&gt;   isSides = cmds.filterExpand(sm=9)&lt;br /&gt;   #create a group to store the new lines&lt;br /&gt;   #in the end all we need is to select the group&lt;br /&gt;   #and we'll have the condition to run the function again&lt;br /&gt;   group = cmds.group( n=&amp;quot;newCurves&amp;quot;, em=True )&lt;br /&gt;   #loop through the curves in isSides&lt;br /&gt;   for i in range(0, len(isSides),1):&lt;br /&gt;      #get first curve name&lt;br /&gt;      line1 = isSides[i]&lt;br /&gt;      #get second curve name&lt;br /&gt;      if i == len(isSides)-1:&lt;br /&gt;         #this means it is in the last element&lt;br /&gt;         #so I have to get the first&lt;br /&gt;         line2 = isSides[0]&lt;br /&gt;      else:&lt;br /&gt;         #otherwise, get next element&lt;br /&gt;         line2 = isSides[i+1]&lt;br /&gt;      #print to check the pair &lt;br /&gt;      print line1, line2&lt;br /&gt;      #define the percentages&lt;br /&gt;      perc1 = 1./2&lt;br /&gt;      perc2 = 1./3&lt;br /&gt;      #get the coordinates on the lines&lt;br /&gt;      poc1 = cmds.pointOnCurve( line1, pr=perc1, top=True, p=True )&lt;br /&gt;      poc2 = cmds.pointOnCurve( line2, pr=perc2, top=True, p=True )      &lt;br /&gt;      #create the curve&lt;br /&gt;      crv = cmds.curve( ep=(poc1, poc2), d=1 )&lt;br /&gt;      #put the curve in the group&lt;br /&gt;      cmds.parent( crv, group )&lt;br /&gt;  &lt;br /&gt;   ## now the recursive part&lt;br /&gt;   #check for the final condition&lt;br /&gt;   if iterations == 0:&lt;br /&gt;      #finished stop!&lt;br /&gt;      return &amp;quot;Done.&amp;quot;&lt;br /&gt;   else:&lt;br /&gt;      #did not finish yet...&lt;br /&gt;      #remove one unit form iterations&lt;br /&gt;      #(coutdown)&lt;br /&gt;      iterations –= 1&lt;br /&gt;      #select the group&lt;br /&gt;      cmds.select( group, r=True )&lt;br /&gt;      #call the function again&lt;br /&gt;      serpentine( iterations )&lt;/pre&gt;&lt;br /&gt;Now, all you need is to create an initial square on stage, select it, and run the function, passing as a parameter the number of iterations you want it to perform.&lt;br /&gt;&lt;br /&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-1187367588958490771?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/1187367588958490771/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/05/serpentine-function.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/1187367588958490771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/1187367588958490771'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/05/serpentine-function.html' title='The serpentine() function'/><author><name>danrocha</name><uri>http://www.blogger.com/profile/04468836977853242830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-557567421275232075</id><published>2009-05-14T13:30:00.001+02:00</published><updated>2009-06-17T13:43:27.563+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='announcements'/><title type='text'>Week 02 - recap</title><content type='html'>&lt;p&gt;Last Monday we translated the rules from the Serpentine Pavilion to a full working script. In it, you saw how to find points in a curve, how to turn an initial loop into a recursive function, and how to create workaround for the lack of full 2D drafting support in Maya.&lt;/p&gt;  &lt;p&gt;Also, we reviewed your submissions for assignment 01A (all comments are on the blog, under each post). &lt;/p&gt;  &lt;p&gt;As a continuation of the assignment, you should give the first go at scripting your idea, keeping in mind the comments made, and what you should improve. Some of you should post new diagrams showing the improved logic of your script, according to the comments.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-557567421275232075?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/557567421275232075/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/05/week-02-recap.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/557567421275232075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/557567421275232075'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/05/week-02-recap.html' title='Week 02 - recap'/><author><name>danrocha</name><uri>http://www.blogger.com/profile/04468836977853242830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-5985601711080558475</id><published>2009-04-30T01:33:00.009+02:00</published><updated>2009-06-17T13:47:10.865+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Alice'/><category scheme='http://www.blogger.com/atom/ns#' term='assignments'/><title type='text'>Alice_Structure defined by Point + Boundary</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_k6vtLLcz3OQ/SfjnYRbJftI/AAAAAAAAAXM/Fq0KVRg86LY/s1600-h/recursive+1.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 400px; height: 95px;" src="http://1.bp.blogspot.com/_k6vtLLcz3OQ/SfjnYRbJftI/AAAAAAAAAXM/Fq0KVRg86LY/s400/recursive+1.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5330264563173129938" /&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_k6vtLLcz3OQ/Sfjm8Vff0GI/AAAAAAAAAXE/A5bucHDi8N8/s1600-h/recursive+1.jpg"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0);"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_k6vtLLcz3OQ/Sfjlnntf_iI/AAAAAAAAAW0/5Bcc48Pyn_o/s1600-h/recursive+1.jpg"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0);"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="text-decoration: underline; "&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span"  style="font-size:x-small;"&gt;Concept&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Times"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&gt; My intention is to generate a complex pattern by given as few points as possible within a certain area. Later on, this pattern can be interpreted as building structure with a specific relationship or logic. In fact, I have tried out many different logical ways to generate points for iterations in order to set up a particular conditions between the point and its curvatures and hopefully to create a stable and balance structure. Above is only one of the attempts. However, I think it is not successful enough to achieve my goal. The difficulty is that the intersection of the curves is always too localized at a specific area. Modification should be made for clearer logic and waited to be explored 3-dimensionally. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Times"&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Times"&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;p.s. Sorry for the belated post. but it's really hard to concentrate in front of the computer when you get to Barcelona!!!!! ;P&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-5985601711080558475?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/5985601711080558475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/04/alicestructure-defined-by-point.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/5985601711080558475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/5985601711080558475'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/04/alicestructure-defined-by-point.html' title='Alice_Structure defined by Point + Boundary'/><author><name>alice</name><uri>http://www.blogger.com/profile/13826062750165810811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_k6vtLLcz3OQ/SfjnYRbJftI/AAAAAAAAAXM/Fq0KVRg86LY/s72-c/recursive+1.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-5021792924350025669</id><published>2009-04-27T00:43:00.006+02:00</published><updated>2009-06-17T13:45:59.781+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='assignments'/><category scheme='http://www.blogger.com/atom/ns#' term='Alec'/><title type='text'>Relationship between 2D &amp; 3D ::: alec' in direct from Barcelona ;-)</title><content type='html'>&lt;span style="font-weight: bold; color: rgb(102, 102, 102);"&gt;Assignement 01A ::: Relationship between 3D and 2D.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;The principle of this recursion is simple. It is a question of interpreting in 2D, a 3D operation! So, the forms do not change topologicaly), it's the point of view of each element which change!&lt;br /&gt;&lt;br /&gt;In these examples, I used a simple rotation of every element, successively from 0, 15, 30, 45, 60, 75 and 90 ° on three axes of rotation, x, y and z! I also used a vertical movement for more visibility, but the plan remains unchanged. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_qqt7zCa-76A/SfTkCCmmWMI/AAAAAAAAAT4/RH5MkKxYpdg/s1600-h/Pr%C3%A9sentation+-+Carr%C3%A9.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 283px; height: 400px;" src="http://1.bp.blogspot.com/_qqt7zCa-76A/SfTkCCmmWMI/AAAAAAAAAT4/RH5MkKxYpdg/s400/Pr%C3%A9sentation+-+Carr%C3%A9.jpg" alt="" id="BLOGGER_PHOTO_ID_5329134982795778242" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_qqt7zCa-76A/SfTkCuyljZI/AAAAAAAAAUI/MpcKlRn_62M/s1600-h/Pr%C3%A9sentation+-+Trangle.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 283px; height: 400px;" src="http://2.bp.blogspot.com/_qqt7zCa-76A/SfTkCuyljZI/AAAAAAAAAUI/MpcKlRn_62M/s400/Pr%C3%A9sentation+-+Trangle.jpg" alt="" id="BLOGGER_PHOTO_ID_5329134994657217938" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_qqt7zCa-76A/SfTkCYH9iEI/AAAAAAAAAUA/qkE2hQgr_a0/s1600-h/Pr%C3%A9sentation+-+Circle.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 283px; height: 400px;" src="http://1.bp.blogspot.com/_qqt7zCa-76A/SfTkCYH9iEI/AAAAAAAAAUA/qkE2hQgr_a0/s400/Pr%C3%A9sentation+-+Circle.jpg" alt="" id="BLOGGER_PHOTO_ID_5329134988572854338" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_qqt7zCa-76A/SfTkCCmmWMI/AAAAAAAAAT4/RH5MkKxYpdg/s1600-h/Pr%C3%A9sentation+-+Carr%C3%A9.jpg"&gt;&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-5021792924350025669?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/5021792924350025669/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/04/relationship-between-2d-3d-alec-in.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/5021792924350025669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/5021792924350025669'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/04/relationship-between-2d-3d-alec-in.html' title='Relationship between 2D &amp; 3D ::: alec&apos; in direct from Barcelona ;-)'/><author><name>alec</name><uri>http://www.blogger.com/profile/09823278314767605002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://3.bp.blogspot.com/_qqt7zCa-76A/SPT1pm42sNI/AAAAAAAAAFw/26kHzdRhX_4/S220/2589578483_d2918fb00c.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_qqt7zCa-76A/SfTkCCmmWMI/AAAAAAAAAT4/RH5MkKxYpdg/s72-c/Pr%C3%A9sentation+-+Carr%C3%A9.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-1524884048926140877</id><published>2009-04-27T00:32:00.002+02:00</published><updated>2009-06-17T13:47:48.505+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='A+M'/><category scheme='http://www.blogger.com/atom/ns#' term='assignments'/><title type='text'>Assignment 01 - Andreea</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/_ZSYzPEUPVm4/SfThQ6kn7GI/AAAAAAAAAJo/NKmOMfYCbsk/s1600-h/scripting260409.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5329131939803163746" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 283px; CURSOR: hand; HEIGHT: 400px; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_ZSYzPEUPVm4/SfThQ6kn7GI/AAAAAAAAAJo/NKmOMfYCbsk/s400/scripting260409.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-1524884048926140877?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/1524884048926140877/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/04/assignment-01-andreea.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/1524884048926140877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/1524884048926140877'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/04/assignment-01-andreea.html' title='Assignment 01 - Andreea'/><author><name>alexandra virlan</name><uri>http://www.blogger.com/profile/07826702946109365185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/-Kxco3AGM9F4/TVkNwXHhRCI/AAAAAAAAAbk/8dMS0nu4xvA/s220/60961_1579924174077_1114837832_31660390_6247364_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ZSYzPEUPVm4/SfThQ6kn7GI/AAAAAAAAAJo/NKmOMfYCbsk/s72-c/scripting260409.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-6954826920264942797</id><published>2009-04-26T21:35:00.002+02:00</published><updated>2009-06-17T13:45:07.280+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Liu'/><category scheme='http://www.blogger.com/atom/ns#' term='assignments'/><title type='text'>Assignment 01</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_2gY_HsWGQR4/SfS3vR-SoNI/AAAAAAAAAaQ/aj72dWrdJ3I/s1600-h/scripting.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 283px;" src="http://2.bp.blogspot.com/_2gY_HsWGQR4/SfS3vR-SoNI/AAAAAAAAAaQ/aj72dWrdJ3I/s400/scripting.jpg" alt="" id="BLOGGER_PHOTO_ID_5329086281992544466" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-6954826920264942797?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/6954826920264942797/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/04/assignment-01_26.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/6954826920264942797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/6954826920264942797'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/04/assignment-01_26.html' title='Assignment 01'/><author><name>Liu, Kocheng</name><uri>http://www.blogger.com/profile/06568145659726503765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://2.bp.blogspot.com/_2gY_HsWGQR4/S2lJxVY9V0I/AAAAAAAAArI/ahtB3H3aRyc/S220/me1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_2gY_HsWGQR4/SfS3vR-SoNI/AAAAAAAAAaQ/aj72dWrdJ3I/s72-c/scripting.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-4977507117185955811</id><published>2009-04-26T16:52:00.000+02:00</published><updated>2009-06-17T13:47:48.505+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='A+M'/><category scheme='http://www.blogger.com/atom/ns#' term='assignments'/><title type='text'>assignment 01A</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/_ZSYzPEUPVm4/SfR_c3Y3nXI/AAAAAAAAAJg/UZwJbZ36AXo/s1600-h/assignment1.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5329024392967462258" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 282px; CURSOR: hand; HEIGHT: 400px; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_ZSYzPEUPVm4/SfR_c3Y3nXI/AAAAAAAAAJg/UZwJbZ36AXo/s400/assignment1.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-4977507117185955811?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/4977507117185955811/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/04/assignment-01a_26.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/4977507117185955811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/4977507117185955811'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/04/assignment-01a_26.html' title='assignment 01A'/><author><name>alexandra virlan</name><uri>http://www.blogger.com/profile/07826702946109365185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/-Kxco3AGM9F4/TVkNwXHhRCI/AAAAAAAAAbk/8dMS0nu4xvA/s220/60961_1579924174077_1114837832_31660390_6247364_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ZSYzPEUPVm4/SfR_c3Y3nXI/AAAAAAAAAJg/UZwJbZ36AXo/s72-c/assignment1.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-9102952725245830048</id><published>2009-04-26T15:01:00.002+02:00</published><updated>2009-06-17T13:49:04.804+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Anastasia'/><category scheme='http://www.blogger.com/atom/ns#' term='assignments'/><title type='text'>Fibonacci number spiral</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_1qBy3zIG0ec/SfRbvKImgeI/AAAAAAAAAhA/YI62P1PYKDQ/s1600-h/Recursion2.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 194px;" src="http://1.bp.blogspot.com/_1qBy3zIG0ec/SfRbvKImgeI/AAAAAAAAAhA/YI62P1PYKDQ/s400/Recursion2.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5328985124818551266" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_1qBy3zIG0ec/SfRbvGYveGI/AAAAAAAAAg4/bnj131rIx4s/s1600-h/Recursion1.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 194px;" src="http://2.bp.blogspot.com/_1qBy3zIG0ec/SfRbvGYveGI/AAAAAAAAAg4/bnj131rIx4s/s400/Recursion1.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5328985123812505698" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-9102952725245830048?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/9102952725245830048/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/04/fibonacci-number-spiral.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/9102952725245830048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/9102952725245830048'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/04/fibonacci-number-spiral.html' title='Fibonacci number spiral'/><author><name>Anastasia Globa</name><uri>https://profiles.google.com/103588731693715960502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-KXLHi4wdi4w/AAAAAAAAAAI/AAAAAAAABBE/ASpfZ48C_ow/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_1qBy3zIG0ec/SfRbvKImgeI/AAAAAAAAAhA/YI62P1PYKDQ/s72-c/Recursion2.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-6779326755118235601</id><published>2009-04-26T13:51:00.002+02:00</published><updated>2009-06-17T13:49:55.255+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Shi'/><category scheme='http://www.blogger.com/atom/ns#' term='assignments'/><title type='text'>Assignment 01</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/_rnqzRpyl1j4/SfRLGOU2fOI/AAAAAAAAAKQ/T2FNvA6YXgY/s1600-h/%E6%9C%AA%E6%A0%87%E9%A2%98-1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 283px; height: 400px;" src="http://1.bp.blogspot.com/_rnqzRpyl1j4/SfRLGOU2fOI/AAAAAAAAAKQ/T2FNvA6YXgY/s400/%E6%9C%AA%E6%A0%87%E9%A2%98-1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5328966829382991074" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-6779326755118235601?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/6779326755118235601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/04/assignment-01.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/6779326755118235601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/6779326755118235601'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/04/assignment-01.html' title='Assignment 01'/><author><name>SHI</name><uri>http://www.blogger.com/profile/15369141728731220921</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='22' src='http://1.bp.blogspot.com/_rnqzRpyl1j4/STJsXKRUqLI/AAAAAAAAAGw/OUiufM2sYXI/S220/1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_rnqzRpyl1j4/SfRLGOU2fOI/AAAAAAAAAKQ/T2FNvA6YXgY/s72-c/%E6%9C%AA%E6%A0%87%E9%A2%98-1.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-3499317473670824759</id><published>2009-04-25T20:53:00.003+02:00</published><updated>2009-06-17T13:49:32.809+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='assignments'/><category scheme='http://www.blogger.com/atom/ns#' term='Tudor'/><title type='text'>Recursive subdivision</title><content type='html'>Each first time the function divides a rectangle/square in 1/3 and each second time in 2/3&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_mg0pJcUsrJ0/SfNcqRGgr7I/AAAAAAAAAVw/GoJGq22LTyA/s1600-h/001.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 226px; height: 320px;" src="http://3.bp.blogspot.com/_mg0pJcUsrJ0/SfNcqRGgr7I/AAAAAAAAAVw/GoJGq22LTyA/s320/001.jpg" alt="" id="BLOGGER_PHOTO_ID_5328704665324400562" border="0" /&gt;&lt;/a&gt;One of the possibilities could be to either extract according to this diagram parts from a cube or add parts to a surface.&lt;br /&gt;&lt;br /&gt;Alexander &amp;amp; Tudor&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-3499317473670824759?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/3499317473670824759/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/04/recursive-subdivision.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/3499317473670824759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/3499317473670824759'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/04/recursive-subdivision.html' title='Recursive subdivision'/><author><name>Tudor</name><uri>http://www.blogger.com/profile/14766722343631674567</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_mg0pJcUsrJ0/SPP1rrTZ_0I/AAAAAAAAAAo/7XdqQ0U38fI/S220/io3.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_mg0pJcUsrJ0/SfNcqRGgr7I/AAAAAAAAAVw/GoJGq22LTyA/s72-c/001.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-590693959654000054</id><published>2009-04-25T17:45:00.000+02:00</published><updated>2009-06-17T13:46:38.481+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Grisha'/><category scheme='http://www.blogger.com/atom/ns#' term='assignments'/><title type='text'>Assignment 01A</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_HXZLYcrSPRg/SfMwLA8cbpI/AAAAAAAAANM/XGv_C__zjto/s1600-h/Untitled-1.jpg"&gt;&lt;img style="cursor: pointer; width: 400px; height: 400px;" src="http://2.bp.blogspot.com/_HXZLYcrSPRg/SfMwLA8cbpI/AAAAAAAAANM/XGv_C__zjto/s400/Untitled-1.jpg" alt="" id="BLOGGER_PHOTO_ID_5328655749899644562" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-590693959654000054?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/590693959654000054/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/04/assignment-01a_25.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/590693959654000054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/590693959654000054'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/04/assignment-01a_25.html' title='Assignment 01A'/><author><name>Grisha Zotov</name><uri>http://www.blogger.com/profile/05521528786515011570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='14' height='32' src='http://2.bp.blogspot.com/_HXZLYcrSPRg/Ss9Gxcu_CXI/AAAAAAAAAV8/W-6Ebb2f7vA/S220/meeee.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_HXZLYcrSPRg/SfMwLA8cbpI/AAAAAAAAANM/XGv_C__zjto/s72-c/Untitled-1.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-5564549255322186490</id><published>2009-04-24T13:40:00.001+02:00</published><updated>2009-06-17T13:43:12.342+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='announcements'/><title type='text'>Calendar</title><content type='html'>I created a Google Calendar for the course.&lt;br /&gt;&lt;br /&gt;As you can see, for the next two Mondays&lt;span style="font-weight: bold;"&gt; we won't have any classes&lt;/span&gt;. But that will mean that when everybody is back we will have extra Scripting classes, at least in the first 1 or 2 weeks.&lt;br /&gt;&lt;br /&gt;You can check the calendar on this blog's sidebar, or go to the &lt;a href="http://www.google.com/calendar/embed?src=tia9mfm4fce9l7lhcvaulg2dmc%40group.calendar.google.com&amp;amp;ctz=Europe/Berlin"&gt;calendar address&lt;/a&gt; to see it in its entirety.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-5564549255322186490?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/5564549255322186490/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/04/calendar.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/5564549255322186490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/5564549255322186490'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/04/calendar.html' title='Calendar'/><author><name>danrocha</name><uri>http://www.blogger.com/profile/04468836977853242830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-4612276926052483041</id><published>2009-04-23T17:19:00.001+02:00</published><updated>2009-06-17T13:43:12.343+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='announcements'/><title type='text'>Assignment 01A</title><content type='html'>&lt;p&gt;As discussed in last class, you are supposed to deliver a &lt;strong&gt;small set of diagrams&lt;/strong&gt; (like the ones from the post below), showing an idea of a recursive algorithm using &lt;strong&gt;basic 2D geometric shapes&lt;/strong&gt; (square, circle, triangle, straight line, pentagon etc). &lt;/p&gt;  &lt;p&gt;You should define a &lt;strong&gt;simple rule&lt;/strong&gt; and show in a diagram how the iteration of this rule is going to create complexity. Also, define &lt;strong&gt;initial state&lt;/strong&gt; and &lt;strong&gt;final condition&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;The results should be posted here on the blog by &lt;strong&gt;Saturday, 25.04,&lt;/strong&gt; so that I can take a look at it on Sunday and choose some to further develop in class.&lt;/p&gt;  &lt;p&gt;The goal of this first assignment is to create the basic graphical idea to be further explored and developed into a pavilion-like structure.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-4612276926052483041?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/4612276926052483041/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/04/assignment-01a.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/4612276926052483041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/4612276926052483041'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/04/assignment-01a.html' title='Assignment 01A'/><author><name>danrocha</name><uri>http://www.blogger.com/profile/04468836977853242830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-655124678221559068</id><published>2009-04-23T17:18:00.001+02:00</published><updated>2009-06-17T13:43:12.343+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='announcements'/><title type='text'>Recursion</title><content type='html'>&lt;p&gt;Our first topic this semester is &lt;strong&gt;recursion&lt;/strong&gt;. Here are some randomly collected notes about recursion:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Recursion is a way of thinking about and solving problems &lt;/li&gt;    &lt;li&gt;one of the central ideas of computer science &lt;/li&gt;    &lt;li&gt;Solving a problem using recursion means that the solution depends on solutions to smaller instances of the same problem &lt;/li&gt;    &lt;li&gt;Function called in itself &lt;/li&gt;    &lt;li&gt;Loops (for, while) are a way of creating recursive functions without the advent of calling the function inside itself &lt;/li&gt;    &lt;li&gt;A common method of simplification is to divide a problem into sub-problems of the same type. For example:      &lt;ul&gt;       &lt;li&gt;How do you move a stack of 100 boxes? &lt;/li&gt;        &lt;li&gt;Answer: you move one box, remember where you put it, and then solve the smaller problem: how do you move a stack of 99 boxes? &lt;/li&gt;        &lt;li&gt;Eventually, you're left with the problem of how to move a single box &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Here is another, perhaps simpler way to understand recursive processes:      &lt;ul&gt;       &lt;li&gt;Are we done yet? &lt;/li&gt;        &lt;li&gt;If so, return the results. Without such a termination condition a recursion would go on forever. &lt;/li&gt;        &lt;li&gt;If not, simplify the problem, solve the simpler problem(s), and assemble the results into a solution for the original problem. &lt;/li&gt;        &lt;li&gt;Then return that solution &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Source, among others: &lt;a title="http://en.wikipedia.org/wiki/Recursion_(computer_science)" href="http://en.wikipedia.org/wiki/Recursion_(computer_science)"&gt;en.wikipedia.org/wiki/Recursion_(computer_science)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;img height="263" src="http://magazine.art-signal.com/en/wp-content/media/asm2_img_cecil_balmond2.jpg" width="392" /&gt; &lt;/p&gt;  &lt;p&gt;The concept of recursion can be easily observed in the case of the &lt;strong&gt;Serpentine Pavilion&lt;/strong&gt;. You start with a simple rule of connecting the middle of one size of the square with the first third of the adjacent side:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_XBTenmxMJRs/SfCGrHEZePI/AAAAAAAAGUg/7YC1Si2kmko/diagram_01_rules%5B1%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="227" alt="diagram_01_rules" src="http://lh5.ggpht.com/_XBTenmxMJRs/SfCGrlbe8aI/AAAAAAAAGUk/ptTrhgBlZEo/diagram_01_rules_thumb.png" width="402" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;So instead of following a 1/2 to 1/2 rule, which would create a simple square spiraling inside itself, the algorithm follow a &lt;strong&gt;1/2 to 1/3 rule&lt;/strong&gt;, which creates a spiraling square with intersects with itself. This slight change in the rule ends up increasing the complexity of the final result and creates more support points for the structure of the building.&lt;/p&gt;  &lt;p&gt;The 1/2 to 1/3 rule is iterated only 7 times. By the dimensions of the pavilion (17x17m), this is enough to end up with efficient beam vs. holes sizes:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_XBTenmxMJRs/SfCGsFXDA-I/AAAAAAAAGUQ/ZE12fvqQnsQ/diagram_01_iterations20.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="1669" alt="diagram_01_iterations" src="http://lh4.ggpht.com/_XBTenmxMJRs/SfCGs11UbyI/AAAAAAAAGUU/UTy9FqAAXzs/diagram_01_iterations_thumb16.png" width="250" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;As the final step, all lines from all squares are &lt;strong&gt;extended&lt;/strong&gt;. Then the borders are &amp;quot;folded&amp;quot; down to form the box, so that the pattern/structure continues until the floor.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_XBTenmxMJRs/SfCGtX7IHJI/AAAAAAAAGUw/WhcVmbKgTQE/diagrams_final%5B8%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="373" alt="diagrams_final" src="http://lh3.ggpht.com/_XBTenmxMJRs/SfCGuG1-oDI/AAAAAAAAGU0/wKo1cz-mD5I/diagrams_final_thumb%5B7%5D.png" width="377" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The final result is beautiful, complex, and most important, extremely efficient structure-wise and construction-wise. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-655124678221559068?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/655124678221559068/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/04/recursion.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/655124678221559068'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/655124678221559068'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/04/recursion.html' title='Recursion'/><author><name>danrocha</name><uri>http://www.blogger.com/profile/04468836977853242830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_XBTenmxMJRs/SfCGrlbe8aI/AAAAAAAAGUk/ptTrhgBlZEo/s72-c/diagram_01_rules_thumb.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-7894428932274632443</id><published>2009-04-23T14:56:00.003+02:00</published><updated>2009-06-17T13:43:27.563+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='announcements'/><title type='text'>Week 1 - recap</title><content type='html'>Last Monday we had our first class, where I introduced the first part of the course. In the next days, we'll be working on the concept of recursion, creating complexity out of very simple rules.&lt;br /&gt;&lt;br /&gt;The basis for this idea can be found in the &lt;a href="http://www.serpentinegallery.org/2002/06/serpentine_gallery_pavilion_20_3.html"&gt;Serpentine Pavillion 2002&lt;/a&gt;, by &lt;span style="font-weight: bold;"&gt;Toyo Ito&lt;/span&gt; in collaboration with &lt;span style="font-weight: bold;"&gt;Cecil Balmond&lt;/span&gt;. As I showed in class, this impressive piece of architecture creates a whole new language of complexity and holistic design which parts from a simple recursive rule.&lt;br /&gt;&lt;br /&gt;We also started to create some fairly simple &lt;span style="font-weight: bold;"&gt;recursive functions&lt;/span&gt;, as well as an approach to the recursive squares as used at the Serpentine Pavillion.&lt;br /&gt;&lt;br /&gt;As a result of this first week, you are required to deliver a &lt;span style="font-weight: bold;"&gt;small assignment&lt;/span&gt;, as detailed in the next blog post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-7894428932274632443?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/7894428932274632443/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/04/week-1-recap.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/7894428932274632443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/7894428932274632443'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/04/week-1-recap.html' title='Week 1 - recap'/><author><name>danrocha</name><uri>http://www.blogger.com/profile/04468836977853242830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-952659230383609892</id><published>2009-04-20T02:15:00.001+02:00</published><updated>2009-06-17T13:43:12.346+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='announcements'/><title type='text'>Script editors</title><content type='html'>&lt;a href="http://code.google.com/p/diascripting/wiki/ScriptEditors"&gt;Another list&lt;/a&gt;, this time with Script Editors. It is highly recommended that you use a script editor to write your scripts.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-952659230383609892?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/952659230383609892/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/04/script-editors_19.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/952659230383609892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/952659230383609892'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/04/script-editors_19.html' title='Script editors'/><author><name>danrocha</name><uri>http://www.blogger.com/profile/04468836977853242830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-7322963741504086627</id><published>2009-04-20T02:13:00.001+02:00</published><updated>2009-06-17T13:43:23.889+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='announcements'/><title type='text'>Resources</title><content type='html'>&lt;a href="http://code.google.com/p/diascripting/wiki/UsefulResources"&gt;Here is a list&lt;/a&gt; with several resources to aid you in the scripting learning process. Make good use of it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-7322963741504086627?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/7322963741504086627/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/04/resources_19.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/7322963741504086627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/7322963741504086627'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/04/resources_19.html' title='Resources'/><author><name>danrocha</name><uri>http://www.blogger.com/profile/04468836977853242830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-2215729672542877026</id><published>2009-04-20T02:11:00.001+02:00</published><updated>2009-06-17T13:43:12.347+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='announcements'/><title type='text'>Setting up</title><content type='html'>As a first step, all students should perform the instructions contained in the setting up document from the former Dia Scripting wiki.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/diascripting/wiki/SettingUp"&gt;Click here&lt;/a&gt; to go to the document directly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-2215729672542877026?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/2215729672542877026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/04/setting-up_19.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/2215729672542877026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/2215729672542877026'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/04/setting-up_19.html' title='Setting up'/><author><name>danrocha</name><uri>http://www.blogger.com/profile/04468836977853242830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-81833950942798134.post-3447147855674224289</id><published>2009-04-20T02:04:00.001+02:00</published><updated>2009-06-17T13:43:20.542+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='announcements'/><title type='text'>Generative Scripting II - SS09</title><content type='html'>Today we start our &lt;span style="font-weight: bold;"&gt;Generative Scripting II &lt;/span&gt;course for the Summer Semester 09.&lt;br /&gt;&lt;br /&gt;From the syllabus:&lt;br /&gt;&lt;br /&gt;Starting with the premise that the student already has basic familiarity with scripting, this course will go one step further and look closely at the relationship of scripting and architecture.&lt;br /&gt;&lt;br /&gt;As in the course Generative Scripting I, it will be divided in parts. In each part, we will start with the analysis of one contemporary existing building which experiments with geometric algorithms&lt;br /&gt;to structure and organize its space. By studying, understanding and extracting the basic principles of these algorithms, we will develop our own variants.&lt;br /&gt;&lt;br /&gt;Each group of two students will be required to deliver a small assignment by the end of&lt;br /&gt;each part. The sum of these assignments will compose the final course grade.&lt;br /&gt;&lt;br /&gt;The classes will take place every Monday 14:30, at the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Marmorsaal&lt;/span&gt; in Building 01.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/81833950942798134-3447147855674224289?l=gs-ii.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gs-ii.blogspot.com/feeds/3447147855674224289/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gs-ii.blogspot.com/2009/04/generative-scripting-i-ss09_19.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/3447147855674224289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/81833950942798134/posts/default/3447147855674224289'/><link rel='alternate' type='text/html' href='http://gs-ii.blogspot.com/2009/04/generative-scripting-i-ss09_19.html' title='Generative Scripting II - SS09'/><author><name>danrocha</name><uri>http://www.blogger.com/profile/04468836977853242830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
