89
1 design 9: digital methodologies process book andrew cook matthew fisher kevin ryan arch-507 | professor ku | fall 2014

D9 Process Book_Expedition Mars

Embed Size (px)

Citation preview

  1. 1. 1 design 9: digital methodologies process book andrew cook matthew fisher kevin ryan arch-507 | professor ku | fall 2014
  2. 2. 01 37 55 13 41 23 63 This process book is a documentation of our collective understanding of digital design, generative coding, and problem solving in unfamiliar environments. Its purpose is to both chronicle our design process and give an empathetic view into our project understanding. We hope it invokes and inspires readers to push the boundaries of their own worldview. - The Team
  3. 3. 3 python codingprogression + (dis)order. classes + functions. repetition + recursion. algorithms. concept. narrative. resources. site. technology. previous attempts. expedition mars it . 1 it . 2 iteration 1 iteration 2 final ex . 1 ex . 2 exploration 1 exploration 2 it . f
  4. 4. This is a series of explorations of the Python scripting component in the Rhinoceros 3D modeling program. These exercises explore concepts relating to self-organization, emergence, and generative design.
  5. 5. 1 python codingprogression + (dis)order. classes + functions. repetition + recursion. algorithms.
  6. 6. import math import random import rhinoscriptsyntax as rs #setting range min = 0. max = 90. int = 8. #creating unit through range interval for x in rs.frange(min, max, int): for y in rs.frange (min, max, int): wave1 = rs.AddSphere ([0,0,0], 1) z = 60*math.cos(math.radians(x+y)) rs.ScaleObject(wave1,[0,0,0],[4,4,4]) rs.MoveObject(wave1,[x, y, z]) #remaining sides of finished product wave2 = rs.RotateObject (wave1, (0,0,0), 90, axis=None, copy=True) wave3 = rs.RotateObject (wave2, (0,0,0), 90, axis=None, copy=True) wave4 = rs.RotateObject (wave3, (0,0,0), 90, axis=None, copy=True) #flipping object rs.RotateObject([wave1, wave2, wave3, wave4], (0,0,0), 180, [1,1,0], False) import rhinoscriptsyntax as rs import math corners=([0,0,3],[3,0,3],[3,3,3],[0,3,3],[1.49,1.49,0], [1.51,1.51,0],[1.51,1.49,0],[1.49,1.51,0]) dblA=0 dblB=90 dblStep=3 for x in rs.frange(dblA,dblB,dblStep): for y in rs.frange(dblA,dblB,dblStep): box=rs.AddBox(corners) z=40*math.sin(math.radians(x+y)) rs.ScaleObject(box,[0,0,0],[1,1,1]) rs.MoveObject(box,[x,y,z]) box2=rs.RotateObject(box,[0,0,0],90,None,True) points=([0,0,3],[0,3,3],[1.5,1.5,0],[0,0,3]) polyline=rs.AddPolyline(points) srf1=rs.AddPlanarSrf(polyline) points2=([0,0,3],[3,0,3],[1.5,1.5,0],[0,0,3]) polyline2=rs.AddPolyline(points2) srf2=rs.AddPlanarSrf(polyline2) points3=([3,3,3],[3,0,3],[1.5,1.5,0],[3,3,3]) polyline3=rs.AddPolyline(points3) srf3=rs.AddPlanarSrf(polyline3) points4=([3,3,3],[0,3,3],[1.5,1.5,0],[3,3,3]) polyline4=rs.AddPolyline(points4) srf4=rs.AddPlanarSrf(polyline4) points5=([0,0,3],[3,0,3],[3,3,3],[0,3,3],[0,0,3]) polyline5=rs.AddPolyline(points5) srf5=rs.AddPlanarSrf(polyline5) box=rs.JoinSurfaces([srf1,srf2,srf3,srf4,srf5]) rs.DeleteObject(srf1) rs.DeleteObject(srf2) rs.DeleteObject(srf3) rs.DeleteObject(srf4) rs.DeleteObject(srf5) A b
  7. 7. 3 progression + (dis)order A b
  8. 8. import math import random import rhinoscriptsyntax as rs class lotus: #defining variables for output def __init__(self, _min, _max, _int, _amp, _rot): self.min = _min self.max = _max self.int = _int self.amp = _amp self.rot = _rot self.quarterList = [] self.petList = [] #creating first petal def bloom (self): for x in rs.frange (self.min, self.max, self.int): for y in rs.frange (self.min, self.max, self.int): pet1 = rs.AddSphere ([0,0,0], random.uniform(0,1)) z = self.amp*math.cos(math.radians(x+y)) scale = rs.ScaleObject(pet1,[0,0,0],[4,4,4]) full = rs.MoveObject(scale,[x, y, z]) self.quarterList.append(full) #arraying petals def flower (self): for i in range (len(self.quarterList)): pet2 = rs.RotateObject (self.quarterList[i], (0,0,0), self.rot, axis=None, copy=True) pet3 = rs.RotateObject (pet2, (0,0,0), self.rot, axis=None, copy=True) pet4 = rs.RotateObject (pet3, (0,0,0), self.rot, axis=None, copy=True) petall = rs.BooleanUnion([self.quarterList[i], pet2, pet3, pet4], True) self.petList.append(petall) #mirror flower to bloom upward def flip (self): for i in range (len(self.petList)): rs.RotateObject(self.petList[i], (0,0,0), 180, [1,1,0], False) lf = lotus(0, 90, 8, 60, 90) lf.bloom() lf.flower() lf.flip() import rhinoscriptsyntax as rs import math import random class myClass(): def __init__(self, _min, _max, _step): self.min = _min self.max = _max self.step = _step self.corners = ([0,0,3],[3,0,3],[3,3,3],[0,3,3],[1.49,1.49,0],[1.51,1.51,0],[1.51,1.49,0],[1.49,1.51,0]) #create form and replicate along sine curve def form(self): for x in rs.frange(self.min, self.max, self.step): for y in rs.frange(self.min, self.max, self.step): pyramid = rs.AddBox(self.corners) z = 40*math.sin(math.radians(x+y)) rs.ScaleObject(pyramid,[0,0,0],[1,1,1],True) rs.MoveObject(pyramid,[x,y,z]) field = rs.MoveObject(pyramid,[random.uniform(0,10),random.uniform(0,10),0]) field2 = rs.RotateObject(field,[0,0,0],90,None,True) obj = myClass(0,120,6) #references def __init__() obj.form() #references def form(self): A b
  9. 9. 5 classes + functions A b
  10. 10. import rhinoscriptsyntax as rs import random plane = rs.WorldXYPlane() boundary = rs.AddRectangle(plane, 30, 30) def splash (origin, wave, ripple, subside): displacement = rs.CurveRadius(wave, origin) if displacement < subside: rad = rs.CurveRadius(wave,[5,5,0]) radsca = rad*ripple new = rs.AddCircle(origin,radsca) splash(origin, new, ripple, subside) def main(): origin = rs.AddPoint(random.uniform(0,30),random. uniform(0,30),0) wave = rs.AddCircle(origin,1) ripple = rs.GetReal(Offset Scale,1.25) subside = rs.GetReal(Maximum Distance, 20) splash(origin, wave, ripple, subside) for i in range (0,7,1): main() import rhinoscriptsyntax as rs import math import random rs.EnableRedraw(False) class Base: def __init__(self,i,Mfun,num,Angle): self.i = i self.Mfun = Mfun self.num = num self.Angle = Angle self.RoCirc = None self.Ro2Circ = None self.Center = None self.Center2 = None self.pt1 = (-self.i/2,-self.i/2,0) self.pt2 = (self.i/2,-self.i/2,0) self.pt3 = (self.i/2,self.i/2,0) self.pt4 = (-self.i/2,self.i/2,0) self.Border = rs.AddCurve([self.pt1,self.pt2,- self.pt3,self.pt4,self.pt1],1) self.PtList = [] self.RecList = [] self.CircList = [] self.CoordList = [] self.Circle = rs.AddCircle([0,0,0],40) def Crv (self): for r in range (0,150): Circ = rs.AddCircle((0,0,0),1) rs.MoveObject(Circ, (r/2,r/2,0)) if (self.Mfun == 1): x = math.sin(2*r) elif (self.Mfun == 2): x = math.cos(2*r) elif (self.Mfun == 3): x = math.tan(r) self.RoCirc = rs.RotateObject(Circ,(0,0,0),self.Angle*x,None) self.Center = rs.CircleCenterPoint(self.RoCirc) CentPoint = rs.AddPoint(self.Center) self.Ro2Circ = rs.RotateObject(self.Ro- Circ,(0,0,0),180,None,True) self.Center2 = rs.CircleCenterPoint(self.Ro2Circ) CentPoint2 = rs.AddPoint(self.Center2) self.CircList.append([self.RoCirc,self.Ro2Circ]) self.PtList.append(CentPoint) self.PtList.append(CentPoint2) Del1 = rs.PointInPlanarClosedCurve(CentPoint,self.Circle) Del2 = rs.PointInPlanarClosedCurve(CentPoint2,self.Circle) self.RecList.append([Del1,Del2]) self.CoordList.append([self.Center,self.Center2]) if (Del1 == 0): self.Recursion(num) print running rs.DeleteObject(self.Circle) def Recursion(self, num): if (num self. MaxVelocity velocityConditionZ = abs(self.VelocityZ) > self. MaxVelocity if velocityConditionX or velocityConditionY: maxValue = max(abs(self.VelocityX), abs(self. VelocityY)) scaleFactor = self.MaxVelocity / maxValue self.VelocityX = self.VelocityX * scaleFactor self.VelocityY = self.VelocityY * scaleFactor #X Y and Z boundaries def checkBounds(self): boundX = 100 boundY = 100 boundZ = 10000 if self.X < 0 and self.VelocityX < 0: self.VelocityX = -self.VelocityX if self.X > boundX and self.VelocityX > 0: self.VelocityX = -self.VelocityX if self.Y < 0 and self.VelocityY < 0: self.VelocityY = -self.VelocityY if self.Y > boundY and self.VelocityY > 0: self.VelocityY = -self.VelocityY if self.Z < 0 and self.VelocityZ < 0: self.VelocityZ = -self.VelocityZ if self.Z > boundZ and self.VelocityZ > 0: self.VelocityZ = -self.VelocityZ def updateBird(self, NearBirds): self.stayClose(NearBirds) self.matchVelocity(NearBirds) self.avoidCollision(NearBirds) self.checkBounds(); self.checkMaxVelocity() point = self.updatePosition() self.drawBird() return point class Flock(): def __init__(self): self.AllBirds = [] self.NearBirds = [] self.NumBirds = 2 self.Repeat = 150 def generateInitialBirds(self): for i in range(self.NumBirds): b = Bird() self.AllBirds.append(b) def runFlocking(self): for bird in self.AllBirds: BirdPath = [] for i in range(self.Repeat): self.findNearBirds(bird) pathPoint = bird.updateBird(self.NearBirds) BirdPath.append(pathPoint) Path = rs.AddCurve(BirdPath) def findNearBirds(self, bird): self.NearBirds = [] for newBird in self.AllBirds: if bird == newBird: pass else: distance = bird.getDistance(newBird) if distance < 600: self.NearBirds.append(newBird) else: pass def main(self): self.generateInitialBirds() self.runFlocking() f = Flock() f.main() loft = rs.AddLoftSrf(rs.GetObjects(filter=4)) import random import math import rhinoscriptsyntax as rs class Bird(): def __init__(self): self.X = random.randint(0,100) self.Y = random.randint(0,100) self.Z = 0 self.VelocityX = random.randint(1,10) / 10.0 self.VelocityY = random.randint(1,10) / 10.0 self.VelocityZ = random.randint(1,10) / 10.0 self.MaxVelocity = 5 def drawBird(self): point = [self.X, self.Y, self.Z] rs.AddPoint(point) def getDistance(self, otherBird): distX = self.X - otherBird.X distY = self.Y - otherBird.Y distZ = self.Z - otherBird.Z result = math.sqrt(distX * distX + distY * distY + distZ * distZ) return result def stayClose(self, nearBirds): diff_X = 0 diff_Y = 0 diff_Z = 0 avgX = 0 avgY = 0 avgZ = 0 for otherBird in nearBirds: diff_X = diff_X + (self.X - otherBird.X) diff_Y = diff_Y + (self.Y - otherBird.Y) diff_Z = diff_Z + (self.Z - otherBird.Z) avgX = diff_X/ len(nearBirds) avgY = diff_Y/ len(nearBirds) avgZ = diff_Z/ len(nearBirds) self.VelocityX = self.VelocityX - (avgX / 100) self.VelocityY = self.VelocityY - (avgY / 100) self.VelocityZ = self.VelocityZ - (avgZ / 100) def matchVelocity(self, nearBirds): diff_X = 0 diff_Y = 0 diff_Z = 0 avgX = 0 avgY = 0 avgZ = 0 for otherBird in nearBirds: diff_X = diff_X + otherBird.VelocityX diff_Y = diff_Y + otherBird.VelocityY diff_Z = diff_Z + otherBird.VelocityZ avgX = diff_X / len(nearBirds) avgY = diff_Y / len(nearBirds) avgZ = diff_Z / len(nearBirds) self.VelocityX = self.VelocityX + (avgX / 40) self.VelocityY = self.VelocityY + (avgY / 40) self.VelocityZ = self.VelocityZ + (avgZ / 40) def avoidCollision(self, nearBirds): distanceX = 0 distanceY = 0 distanceZ = 0 minDistance = 30 for otherBird in nearBirds: distance = self.getDistance(otherBird) if distance < minDistance: diff_X = (self.X - otherBird.X) if diff_X >= 0: diff_X = math.sqrt(minDistance) - diff_X else: diff_X = -math.sqrt(minDistance) - diff_X distanceX = distanceX + diff_X diff_Y = (self.Y - otherBird.Y) if diff_Y >= 0: diff_Y = math.sqrt(minDistance) - diff_Y else: diff_Y = -math.sqrt(minDistance) - diff_Y distanceY = distanceY + diff_Y diff_Z = (self.Z - otherBird.Z) if diff_Z >= 0: diff_Z = math.sqrt(minDistance) - diff_Z else: diff_Z = -math.sqrt(minDistance) - diff_Z distanceZ = distanceZ + diff_Z self.VelocityX = self.VelocityX - (distanceX / 5) self.VelocityY = self.VelocityY - (distanceY / 5) self.VelocityZ = self.VelocityZ - (distanceZ / 5) def updatePosition(self): self.X = self.X + self.VelocityX self.Y = self.Y + self.VelocityY self.Z = self.Z + self.VelocityZ pos = rs.AddPoint(self.X, self.Y, self.Z) return pos def checkMaxVelocity(self): velocityConditionX = abs(self.VelocityX) > self. MaxVelocity A
  11. 15. 11 algorithms: flocking, cellular automata A
  12. 16. Expedition Mars is our response to build a tower in an extreme environment with limited resources to create a sustainable future for humanity. The project is meant both to preserve and develop the Earth-like environment. It is based on research of the past and proposes design responses for the future.
  13. 17. 13 expedition marsconcept. narrative. resources. SITE. technology. previous attempts.
  14. 18. POPULATION:POPULATION: 7,000,000,000 10,000,000 .14% REMAINS 2015 2025
  15. 19. 15 Mission_ We will colonize in interstellar territory on Mars by creating a sustainable living environment. As a response to the potential extinction of the human race, establishing a codependent network of communities will ensure the preservation of humans. Attempts to terraform are necessary to adapt to the harsh Martian environment. With limited time to plan, utilization and recycling of natural resources on Mars is critical in developing stability over time. Seek immediate refuge on an adjacent planet concept + narrative
  16. 20. CO2 O2 N2 NITROGEN USE: USE: USE: USE: USE: USE: WATER OXYGEN MARS SOIL CARBON DIOXIDE SUNLIGHT PHOTO- SYNTHESIS ENERGY BREATHING CONSTRUCTION BREATHING HYDRATION 96% PLENTIFUL PLENTIFUL.13% 2.7% POTENTIALLY PLENTIFUL
  17. 21. 17 resources + site MARS SITE HEBES CHASMA 5000 15000 40000 FT FTSITE GLOBAL TEMPERATURE 70 F -100 F -195 F 2500 7500 15000
  18. 22. D-SHAPE PRINTER | MONOLITE UK MARS ONE | NASA MARS ROVERS | NASA SOJOURNER OPPORTUNITY CURIOSITY
  19. 23. 19 technology MARCOPOLO LIFE-SUPPORT LANDER | NASA WATER PROCESSING LIQUEFICATION WATER CLEANUP POWER PRODUCTION POWER DISTRIBUTION ATMOSPHERIC PROCESSING SOIL PROCESSING
  20. 24. EDEN PROJECT | NICHOLAS GRIMSHAW LUNAR HABITATIONS | NORMAN FOSTER MARS ONE | NASA; KRISTIAN VON BENGTSON
  21. 25. 21 previous attempts MARS ONE LIFE SUPPORT | NASA; KRISTIAN VON BENGTSON MARS ONE LIFE SUPPORT | NASA; KRISTIAN VON BENGTSON
  22. 26. This iteration focused on creating a self-sustaining tower that is based largely on preexisting technology. We explored the potential for a productive tower to support a dependent population. The tower produces resources without direct human intervention by focusing on atmospheric production, solar gathering, and agricultural revival.
  23. 27. 23 iteration 1it . 1
  24. 28. MARS COLONIZATION | ZA ARCHITECTS
  25. 29. 25 component precedents IT.1 ASM HEADQUARTERS | SYNERGETICS, INC.
  26. 30. TOWER DOME TUNNEL
  27. 31. 27 SOLAR GATHERING GAS EXTRACTOR FAILSAFE PRESSURE GAUGE ICE HARVESTER HYDROPONICS VERTICAL FARM ING CO2 RECYCLING CENTRAL CORE EXPOSED PROTECTED components + program IT.1
  28. 32. INTERNATIONAL SPACE STATION CONSTRUCTION
  29. 33. 29 tower construction IT.1 SOLAR STORAGE SOLAR STORAGE GAS EXTRACTOR VERTICAL FARMING CENTRAL CORE LAND EXTEND CONSTRUCT SOLAR APPLICATIONSKIN APPLICATION
  30. 34. a b c
  31. 35. 31 tower section b d d c DWELLING UNITS CENTRAL CORE FAIL SAFE PRESSURE GAUGE GAS EXTRACTOR VERTICAL FARMING CIRCULATION TOWER GAS EXTRACTOR SOLAR GATHERING a IT.1
  32. 36. 4500FEET 6FEET M AGNIFIED 100x MT EVEREST PROJECT BURJKHALIFA
  33. 37. 33 ON SITE LAYERS PREFABRICATED LAYERS HIGHLY RADIATION RESISTANT SOLAR PANEL ALUM INUM SHEATHING TITANIUM STRUCTURE KEVLAR PANEL M ARTIAN CONCRETE FINISH LAYER scale + materiality IT.1
  34. 38. YEAR 2020 YEAR 2520
  35. 39. 35 terraforming IT.1 YEAR 3020
  36. 40. This iteration explored the application of a 3D printer as a method of producing structure. It incorporated both a standardized and responsive method of construction. By housing the program directly within the vertical structure, the result was a purely functional tower.
  37. 41. 37 exploration 1ex . 1
  38. 42. SOLAR PANEL INTEGRATION
  39. 43. 39 GENERATOR GAS EXTRACTION GAS EXTRACTION SOLAR COLLECTION PRODUCTIONCORE/PRINT CORE LAUNCH PROGRAM DISTRIBUTION SCALE STUDY ex.1production tower exploration
  40. 44. This iteration was an experimental modular form through a Voronoi pattern. In order to make use of the materials available, we introduced an industrial program. This allowed us to express the design in a more provocative form. To support a growing population, we explored the potential for expansive architecture.
  41. 45. 41 iteration 2it . 2
  42. 46. 43CORE INDUSTRY INDUSTRY AGRICULTURE AGRICULTURE EXPANSION CORE TRANSPORTATION, UTILITY DISTRIBUTION MATERIAL CONSTRUCTION, RESOURCE SYNTHESIS FARMING, MASS VEGETATION PRODUCTION WATER STORAGE, EXTERNAL CONNECTIVITY INDUSTRY AGRICULTURE EXPANSION 1 2 3 4 1 2 3 4 parti + program IT.2
  43. 47. 2722 FT.INITIAL 900 FT. BURJ KHALIFA COMCAST CENTEREMPIRE STATE 1454 FT. 974 FT. MAX EXPANSION 7500 FT.
  44. 48. 45 scale + program distribution IT.2 CORE INDUSTRY AGRICULTURE
  45. 49. 100 FT 300 FT 600 FT
  46. 50. 47 site + tower plans IT.2 0 25 75 150 AGRICULTURE INDUSTRY CORE 2500 FT 7500 FT 15000 FT
  47. 51. 49 circulation + sections IT.2
  48. 52. 51 materiality IT.2 MARTIAN CONCRETE IRON MULLIONS PLENTIFUL DIRT AGGREGATE PLENTIFUL MATERIAL RADIATION PROTECTION LEAD GLASS
  49. 53. import rhinoscriptsyntax as rs import random class Points(): def __init__(self,X): self.X = X self.square = rs.AddCurve(([-5.5,5.5,0],[5.5,5.5,0], [5.5,-5.5,0],[-5.5,-5.5,0],[-5.5,5.5,0]),1) def main(self,X): self.arrX=[] self.arrY=[] self.ptListIN = [] self.ptListOUT = [] self.POINTLIST = [] gridpts = rs.AddPoints([[-5,5,0],[0,5,0],[5,5,0],[-5,0,0], [0,0,0],[5,0,0],[-5,-5,0],[0,-5,0],[5,-5,0]]) self.POINTLIST.append(gridpts) for i in range (100): sv=0 while True: rx=random.randint(-20,20) ry=random.randint(-20,20) overlap = False for j in range (i): diffx=abs(self.arrX[j]-rx) diffy=abs(self.arrY[j]-ry) if(diffx