Natural Systems Studio: Exploring the Architectural Utility of Scripting
LUKE HICKMAN
PREFACE
This journal is titled Natural Systems: Explorations into the Utility of Scripting for Architecture, because ‘utitlity’ in my view is the fundamental driving ethos behind Architecture and it is what separates the field from pure Art. In essence, Architects are primarily problem solvers and strategists first, before they are authors of aesthetic cultural products. This definition is not fixed when applied to individuals within the profession as diversity of the creative process is fundamental to the health of the Architectural culture as a whole. In addition, aesthetic and functional concerns often overlap and are co-dependant within design pathways.
RESEARCH 1) Hensel, M., Menges, A., & Weinstock, M. (2010). Emergent technologies and design : towards a biological paradigm for architecture / Michael Hensel, Achim Menges and Michael Weinstock. Abingdon, Oxon. : Routledge, 2010.
Why use and learn scripting?
Contemporary Architectural discourse from 1990’s has been continually bombarded with new digital tools and resultant from them, entirely new design perspectives (2). These new digital design tools are useful to Architects in multiple ways; including time saving devices, expanded perception of 3d space and form manipulation through a virtual environment and most arguably the most important way being; spontaneous outcomes from procedural and parametrically driven scripted design processes. This relatively new and small avant garde of architecture is exploring the frontier opened up by digital design platforms and scripting languages. This frontier promises a new design language capable of dealing with complexity, which will be integral to future architecture defined by a systems based, information loaded environments in a state of flux. The state of the field of scripting and generative processes integrating structural and material simulation is in its relative infancy (1). As well as being the language for complexity scripting provides the potential to bridge the creative divide between qualitative and quantitative data and open up new furtile achitectural domains.
Greg Lynn, Kleiburg housing project, Bijlmermeer, the Netherlands, 2006
It is necessary to be able to customise your own design tools. Greg Lynn explains his use of scripting as the inevitable outcome of the need to get the results your design intuition requries. “ Intuition is the moment when the principles and techniques of a discipline are so integrated that one is able to extrapolate, develop and extend them as an invention or innovation. “ (2) Rocker, I. M. (2006). Calculus-Based Form: An Interview with Greg Lynn. Architectural Design (London, England), 76(4), 88-95.
CONCEPT
RESEARCH
My initial concept ideas were stimulated by the below statments in Emergent Technologies and Design: Towards a Biological Paradigm for Architecture.(1)
This source discusses how Architecture should not impose form, but through stochastic principals (applied mathematics) and sourcing the “massive data” of the contemporary world, find new strategies that incorporate both “soft data” (qualitative cultural information) and objective data to design effective (performative) architecture.
“ As mutations to the known form of organisms occur naturally, so too have the small innovations, theoretical ‘errors’ and design mutations of ancient architectures produced the ‘populations’ or cities of buildings, and driven the historical evolution of architecture.”
Cynthia Ottchen proposes that there are two separate trends within architecture; the use of animation like software to create fluid dynamic shapes and morphogenic outcomes, and the productivity tool / BIM approach where documentation and project management is prioritized. Ottchen explains that a new way of thinking will arise to bridge this traditional divide between the “romantic/rational” portions of architecture.
“Other differences include the mode of inheritance, which in culture may be horizontal or oblique, as cultural practices concerned with material construction diffuse between distinct social groups.” pg 31 These two statements made me think if culture can be re-analysed as a natural system, what new models of human development and potential could be divined. If culture is just another complex system linked with the metabolism of nature, and architecture is the representation of cultural forces then a new architecture would be self referential of this change in perspective. My idea is to engage with a portion or slice of the cultural data stream and use this information to inform an architectural outcome. Scripting should provide a way to harness the massive redundant cultural code and utilize this database to invent procedure to enable spontaneous architectural ideas to emerge.
This new bridging theory will enable architecture to engage the complex world in an “effective” way defined by stochastic principals that through the raw power of data and computing capacity can origanate ‘fit’, adapted results.
PHOTOTROPHIC TOWER ITERATIONS Ottchen, C. (2009)
Source: Ottchen, C. (2009). The Future of Information Modelling and the End of Theory: Less is Limited More is Different. Architectural Design, 79(2), 22-27.
She describes a new role for the architect as a “multidisciplinary strategist”. “Massive data is the new meaning”
RESEARCH
RESEARCH
This post graduate research project set in Santurce/San Juan Puerto Rico was based on developing urban scale synthetic models of the stocks and flows of economic and social forces within an urban field of interest. The students used computational models to break hierarchic topologies and re- order and develop non-linear, inventive program and spatial relationships.
1.
The winning master plan for the studio work synthesized a broad spectrum of competing hierarchical parameters such as bodies of water, transport paths and flows and zoning regulations. This project shows that scripting can be a powerful tool in collecting and diagramming complex design problems particularly on an urban scale. Even though the figural result may be highly conceptual its use as a diagram is profound. Pg 37 -41 Web Morphogenesis is an example of a project that was inserted into the master plan. This project interestingly states that it is not form that follows function but the result of form in dialogue with function. With scripting both can compete and be manipulated non-hierarchically. It uses a “multi-agent based system working with curves, force fields and rules for a woven structure combined with rules for filling space through subdivision.�pg 49
1. Source: New Normal Post-Professional @ Penndesign 2010-2011 Publication, Winka Dubbeldam_director Roland Snooks, Ferda Kolatan University Of Puerto Rico
2.
1. Web Morphogenesis 2. Systemic Compulsion
2.
2.
1.
BACTERIAL WALKER
The aim of this sketch was to design a process whereby particles explored and clustered the inert environment, then were organised via a selection process and made to change in some way. The initial idea was for it to be a model of human expansion and settlement across a landscape. Once a certain amount of particles in a zone was met a new exploration team was sent off. These ideas were too advanced at the time of this journal entry. The end result used a random step action and a selection routine highlighting particles with a specific opacity.
code sample
//======================bacteria cluster================// // walker scouts the screen and clusters in zones prescribed by basic geometries // walker walkers reach max capacity in zone and then exit the zone for green pastures // “this zone is full walker find somewhere new” //skills learnt-- use name.variable to access a variable inside an array, arraylist or object // need to create an class with a particle system inside. // Meaning a class with an array to manage objects from another class. //---------------------------------------------global variables // if dot color equals (255,0,0) //then circles radiate from that point // with defined radius int totalframes= 3000; float c; float colormatch = c; float x; float y; float crad; //new arraylist WalkerSystem ws; int[] framenums; //----------------------------------------------setup void setup() { size(800, 200); background(0); ws = new WalkerSystem(); smooth(); }//-----------------------------------------end setup //-------------------------------------------draw void draw() { // background(0); ws.run(); //ws.path(); //ws.locatecolors(); //--------------------------------------------------image export for (int i = 0; i <totalframes; i = i+100) { if (frameCount == i) { saveFrame(“newoutput/walker-####.tif”); }} //-------------------------------------------------frame management if (frameCount > totalframes) { noLoop(); exit(); } } //--------------------------------------------------end draw
class Walker { int x; //object data int y; float c; int z; float opacity = 255; int r1 = 5; float crad= r1*2; boolean colormatch; Walker (int tempX,int tempY) { // constructor required x = tempX; // objects setups- data called y = tempY; // when object first created c = random(255); print(c); }
if (( x > width) || (x < 0)) { // reverts to near center pos x = width/2*z; } if (( y > height) || (y < 0)){ // reverts to near center pos y = height/2*z; } }//end method
void display() { //additional data -object functions noStroke(); if (opacity < 150) { opacity = 255; } fill(random(c),0,0,opacity--); ellipse(x,y,r1,r1); if(c>252){ stroke(0,255,0,opacity--); ellipse(x,y,r1*2,r1*2); colormatch = true; }} void step() { // randomly steps the object from center if hits edge int choice = int(random(6)); // the random choice of if (choice == 0) { //number between 0-3 determines step x= x + 10; } else if (choice ==1) { x= x -10; } else if (choice ==2) { y = y + 10; } else if (choice == 3){ y=y -10; } if (choice == 4) { /number between 0-3 determines step x= x + 20; } if (choice == 5) { //number between 0-3 determines step x= x - 20; } else { y = y+ 20;}
} // ------------------------end class
void fade() { opacity--; if (opacity < 0) { opacity = 255; } }// end method
LIFE AND DEATH This processing sketch was made under the parameters of learning to use arraylists and vectors. The particles randomly move through a set velocity variable and are contained within the screen boundaries. The complex visual representation is achieved via cross checking distances between individual particles so that a joining line can be drawn between them. This simple method instantly created a sense of architecture even if it is quite ‘dumb’. The sketch is made more interesting via the addition of two environmental zones, a life zone whereby a particle is added once crossed and a death zone where a particle is removed. Sliders were used to alter the size of these zones and get different behaviour.
code sample import controlP5.*; import toxi.geom.*; ArrayList spotcollection; ArrayList addList = new ArrayList(); ArrayList deleteList = new ArrayList(); int collectionsize = 100; float deathrad = 50; float liferad = 50; float distbetween = 50; Vec3D life2 = new Vec3D (width/2, height/2, 0); int totalframes= 3000; ControlP5 sliderdeath; ControlP5 sliderlife; void setup() { size(800, 200); background(0); stroke(255, 0, 0); sliderdeath = new ControlP5(this); sliderlife = new ControlP5(this); sliderdeath.addSlider(“deathrad”) .setPosition(20, 180) .setRange(0, 200) ; sliderdeath.addSlider(“liferad”) .setPosition(400, 180) .setRange(0, 50) ; spotcollection = new ArrayList(); // create empty array list //INITIALIZE for (int i = 0; i < collectionsize; i ++) { Vec3D origen = new Vec3D(random(width/2), random(height/2), 0); Spot mySpot = new Spot(origen);
spotcollection.add(mySpot); } }//------------------------------------end setup void draw () { background(0); //call functionality addList = new ArrayList(); deleteList = new ArrayList(); if (mousePressed) { Vec3D p = new Vec3D(mouseX, mouseY, 0); Spot newSpot = new Spot(p); spotcollection.add(newSpot); } for (int i = 0; i < spotcollection.size(); i ++) { Spot ms = (Spot) spotcollection.get(i); // call a collection of spots from the whole array. // println(ms); // run grouped functions from the Spot class ms.run(); ms.die(); ms.live(); } if (spotcollection.size() > 500 ) { noLoop(); } //run the remove code //loop through all the objects that need to be removed, and delete //from the arraylist using the .remove() method for (int i = 0; i < deleteList.size(); i ++) { Spot msd = (Spot) deleteList.get(i); // when you take something out of a list //need to give it a new name so the comp knows what it is. int spotIndex = spotcollection.indexOf(msd); //get the index of the objects //called from the deleteList //remove objects at index which is //defined by variable just added. spotcollection.remove(spotIndex);
} //then run the add code //ditto, loop through the stuff in the add list, //and add to the //spotcollection list for (int i = 0; i < addList.size(); i ++) { Spot msa = (Spot) addList.get(i); spotcollection.add(msa); } //-----------------------------------image export for (int i = 0; i <totalframes; i = i+100) { if (frameCount == i) { saveFrame(“newoutput/life&death-####.tif”); } } }//-----------------------------------------end draw
CULTURE GENOTYPE
This sketch was started from the idea that in the future Culture as a living instance or suspended artifact could be analysed and mapped in all its scope. This sketch uses a random walker that was to have varying characteristics and interactive behaviors like explore, cluster, kill and breed to simulate the growth of cultural elements and their interconnectedness. At the time of this journal the sketch was working upon the principals of explore and cluster. The cluster behaviour simulated convergent cultural elements and the exploring behaviour cultural modes of distinction. The explore behaviour fed back into the system shocking the clustered elements with a greater acceleration once a certain escape distance was reached.
code sample
// name of class class Walker { float xstep = random(-1, 1); float ystep = random(-1, 1); float zstep = random(-1, 1); Vec3D loc = new Vec3D(); Vec3D vel = new Vec3D(xstep, ystep, zstep); Vec3D acc = new Vec3D(); int cubesize; float neighbourdistance; // used for search range of attraction float maxspeed = 1; //limits accumulated velocity int isov; // used to defined selection step range of attractor points out of the arraylist boolean clustergo = true; boolean explorergo = true; // constructor Walker (Vec3D _loc, int _cubesize, float _nd,int _isov) { loc = _loc; cubesize= _cubesize; neighbourdistance = _nd; isov = _isov; } // main walker characteristic set of functions void tendancies() { display(); update(); explore(); //parametric selection or (probability) of population avoid clusters, accelerate away cluster(); //parametric selection (probability) accel towards each other //kill(); //parametric selection (probability) if touch each other one is removed //breed(); //parametric selection (probability) if certain cluster size reached breads //tracepaths(); // run a trace line through selection of points //web(); } void explore () { if (explorergo) { for (int i = 0; i < Ws.size(); i++) { Walker explorer = (Walker) Ws.get(i); Vec3D kickstart = new Vec3D (random(-10, 10), random(-10, 10), random(-10, 10)); float bounds = loc.distanceTo(explorer.loc); if ( bounds > 50) { acc.addSelf(kickstart); } }}}
void cluster () { //create a time switch so only happens once each cycle if (frameCount == 100 && clustergo) { for (int i = 0; i < Ws.size(); i = i + isov) { Walker other = (Walker) Ws.get(i); float clusterdist = loc.distanceTo(other.loc); //if within range of pull then particles drift together if (clusterdist > 0 && clusterdist < neighbourdistance) { acc.addSelf(other.loc); acc.clear(); clustergo = false; //switch off println(“clustered”); } } }} void display() { noFill(); stroke(255, 0, 0); strokeWeight(.5); //translate(0,0,zrange); point(loc.x, loc.y, loc.z); } void update() { loc.addSelf(vel); // dont forget to use right syntax “addself” with toxic lib vel.addSelf(acc); //limit speed vel.limit(maxspeed); //acc.clear(); //creates the box sides as the boundaries for the walkers if (loc.x >= cubesize/2) { loc.x= (cubesize/2)-1; vel.x*= -1; } else if (loc.x <= -cubesize/2) { loc.x = -((cubesize/2)-1); vel.x*= -1; } if (loc.y >= cubesize/2) { loc.y = (cubesize/2)-1; vel.y*= -1; } else if (loc.y <= -cubesize/2) { loc.y = -((cubesize/2)-1);
vel.y*= -1; } if (loc.z >= cubesize/2) { loc.z = (cubesize/2)-1; vel.z*= -1; } else if (loc.z <= -cubesize/2) { loc.z = -((cubesize/2)-1); vel.z*= -1; }} }//------------------------end class