CloudNets
Investigations into Emergent Urbanism and Architectural Form Cities can appear to us as very real, material objects - we, as architects, tend to observe and manipulate forms, materials and appearances. Although we pay lip-service to the idea of program, very often we take this as given. We have a site, decide what program it should be and then concentrate on local organisation and form. An alternative model understands the city as a complex system that can be understood in terms of its distribution of valuable activities that are influenced and made possible by their relationships to one another. These relationships may be effective at a small scale - what is next door - or at a much larger scale, but how are the things that happen in this city different from another city some distance away? Consider, as a modest example, the difference between convenience stores and motorcycle shops. Convenience stores distribute themselves at equal distance from one another. Motorcycle shops are, by contrast, all next to each other. The difference is explained by the idea of search cost. Someone buying a motorcycle wants to shop around and compare - so a shop will do better business if next to another similar - despite the added competition. On the other hand, no one cares about comparing the price and quality of a litre of milk - so convenience stores are distributed to capture a territory or catchment without competition. This perspective sees cities as emergent phenomena - that is, simple local rules generate complex global ordered patterns. The CloudNets elective investigated these kinds of emergent relational phenomena through the use of various computational techniques to model aspects of these relationships and explored how they can lead to certain patterns within cities.
Square - Wombat
Scott Crowe & Patrick Eberle
All logical solutions with no design prejudice: The objective for this script was to take a programmatic-based analysis of the generation of a city and produce a system for the production of master-plans that could respond to both quantitative and qualitative input. There are many variables governing implementation that allow for more quantitative control over maximum volumes of programs within defined maximum space. However, the outcome of program dispersion across the site is largely due to qualitative objectives that designate public usage. This definition of public program and circulation values ensures a qualitative response within a system that produces infinite spatial types based on a process of logical analysis. This was originally designed for use at the scale of a city, but has been successfully tested within the tower profile as a case study. Commercial attaches itself to a point Adjacent to the Public for maximum accessibility to each building. Office is created as tower structures of either Medium or Small floor plates stacked vertically. They are created Near to Commercial to allow for the servicing of the users of these buildings. Residential likes to emerge neither near nor adjacent to any other program including itself. However, due to its construct as 33 cubic volumes they can become dense complexes. Car Parking forms below the Commercial or Office if near the ground plane and therefore accessible from the street. ClearSky is a cleaning up function that ensures that for a set number of points above public lane ways there is a clear zone of vacancy for light. PublicPlanes places a ground plane on the lowest Public points if they are stacked vertically above each other.
Sub SquareWombat() Sub SqaureWombat () ‘------------------Layer system: programs-----------------Call Rhino.AddLayer (“Program”, RGB(255,255,255))
Sets up a Layer system for each of the programs. Each program has a unique name and RGB colour that can be called. Using Layers speeds the processing required rather then using large arrays to store point collections. ‘-----------------Set maximum point array-----------------SetArray = Rhino.GetBoolean(“Do you need to set up an array?”,SetItems,SetDefaults)
This set up option is required when run for the first time. It establishes a point cloud for the programs to update as their respective functions are called. It also allows for block instances representing the various programs to align to. By using a point, object data is able to be stored on each point. In this case each point’s neighbours are stored either as “Adjacent” or “Near”. This data can be saved onto the object and once it has been stored it can be continually called without re-calculation. This data is essential for the each program function as all relationships between the programs are based on this proximity relationship. ‘-----------------Define the Public points-----------------PublicSelect = Rhino.GetBoolean(“How would you like to set your Public points?”,PublicItems,PublicDefaults)
Another set up option allowing for the selection of the Public program points in three different variations. The selection of the points denoted as Public is the main driver of the overall outcome, determining how the rest of the programs will respond. The three ways the points can be chosen is through user selection or through the proximity to a curve (street), or surface (wall). ‘-----------------Setup for screen capture----------------record = rhino.getboolean(“Do you want to record this Calcu lation?”,arrItems,arrDefaults) If record(0)=True Then
The last set up option is for the purpose of recording the process of the program distribution across the site. Four views from each corner of the site and a plan and front view are set up in a designated 3dm file to be rendered every time a program block instance is created on the site. These image files are saved in a user designated folder for the use in creating animations. ‘---------------Sequencial program functions--------------Call Institutional(strFilePath, strFileName, strView,imgcount,arrViews,record)
Institutional requires the user to select a start point and continues from here as a continuous building volume across the site. Call Commercial(strFilePath, strFileName, strView,imgcount,arrViews,record)
Commercial attaches itself to a point Adjacent to the Public for the maximum accessibility to each building. Call Office(strFilePath, strFileName, strView,imgcount,arrViews,record)
Office is created as tower structures of either Medium or Small floor plates stacked vertically. They are created Near to Commercial to allow for the servicing of the users of these buildings.
1 1
1 1
VAR_DIAGONAL_IMPORTANCE = 0.5 VAR_DIAGONAL_IMPORTANCE = 0.5 3 3
VAR_NORTH_INFLUENCE = 0.2 VAR_APT_COMM_CUTOFF 4.0 VAR_NORTH_INFLUENCE ==0.2 VAR_APT_COMM_CUTOFF = 4.0
2 2
2 2
VAR_DISTANCE_COLUMN_IMPORTANCE VAR_DIAGONAL_IMPORTANCE ==0.5 -0.1 VAR_DISTANCE_COLUMN_IMPORTANCE VAR_DISTANCE_HORIZONTAL_IMPORTANCE = -0.1 = 1 VAR_DISTANCE_HORIZONTAL_IMPORTANCE VAR_DISTANCE_DIAGONAL_IMPORTANCE= =1 0.7 VAR_DISTANCE_DIAGONAL_IMPORTANCE VAR_HEIGHT_INFLUENCE = 1.0 = 0.7 VAR_HEIGHT_INFLUENCE = 1.0 VAR_DISTANCE_COLUMN_IMPORTANCE VAR_DISTANCE_HORIZONTAL_IMPORTANCE =1 VAR_DISTANCE_DIAGONAL_IMPORTANCE ==0.7 VAR_HEIGHT_INFLUENCE = 1.0 VAR_DIAGONAL_IMPORTANCE==-0.1 0.5 VAR_DISTANCE_COLUMN_IMPORTANCE = -0.1 VAR_DISTANCE_HORIZONTAL_IMPORTANCE 1 VAR_DISTANCE_DIAGONAL_IMPORTANCE = 0.7 VAR_HEIGHT_INFLUENCE = 1.0 3 4 4 4 3 4
VAR_SHOPZ_INFLUENCE VAR_NORTH_INFLUENCE = 1.0 =VAR_SHOPZ_WEIGHT 0.2 VAR_SHOPZ_INFLUENCE = 0.9 VAR_APT_SPACE = 1.0 = VAR_SHOPZ_WEIGHT 5.0 VAR_APT_SPACE_WEIGHT = 0.9 VAR_APT_SPACE = 1.3 VAR_APT_COMM_DISLIKE = 5.0 VAR_APT_SPACE_WEIGHT = 1.6 = 1.3 VAR_APT_COMM_DISLIKE = 1.6 VAR_APT_COMM_CUTOFF = 4.0 VAR_SHOPZ_INFLUENCE = 1.0 VAR_SHOPZ_WEIGHT = 0.9 VAR_APT_SPACE VAR_APT_SPACE_WEIGHT = 1.3 VAR_APT_COMM_DISLIKE = 1.6 VAR_NORTH_INFLUENCE = 0.2 VAR_SHOPZ_INFLUENCE = 1.0 = 5.0 VAR_SHOPZ_WEIGHT = 0.9 VAR_APT_SPACE = 5.0 VAR_APT_SPACE_WEIGHT = 1.3 VAR_APT_COMM_DISLIKE = 1.6 VAR_APT_COMM_CUTOFF = 4.0
Site-Graph
James Goscinski
This project investigates the way cellular automata can be used to generate an organisation of program within a building. The purpose of this investigation is to illustrate whether a Cellular Automata model can generate an unexpected organisation of space and form for a relatively simple set of rules, through a deterministic process. The first part of this investigation examines a single structure. A 3-dimensional 9 x 5 x 5 graph is used to represent a 9 storey building. Each of the 225 spaces within the graph can be filled with one of three types of program – residential apartments (green), commercial office space (red) and retail shop space (gray) each comprising at least 37%, 37% and 10% of total building space, respectively. In addition, empty space can also be generated.
Site
Gra
ph -
3 bu
ildin
g sit e gr aph
The program of each ‘cell’ within the building is decided based on: the attributes of its neighbours and their orientation; a set of influencing principles and preferences, such as ‘retail space should be located near the ground’; and rules designed to ensure the model stays within the defined program space quotas. The 4 types of spaces are each assigned a variable which is accumulated and de-accumulated as rules are executed. After the rules have been executed, these variables are examined and the cell type is chosen based on the highest variable. To start, the model is seeded with random spaces. The rules are as follows: Each cell neighbour (up to 2 hops away) is examined and the type variables are accumulated or deaccumulated based on a directional weight. For example, to investigate a ‘vertical’ organisation of program, vertical neighbours are weighed higher, or alternatively horizontal neighbours are weighed negatively. Neighbours of neighbours are treated differently and are assigned different weights. Influences are applied: Residential apartments prefer northern aspect and high elevation, while shops prefer to exist close to the ground. Apartments are generated by neighbours of their own kind, but also enjoy empty space around them. Apartments and commercial office space do not like to be near one another and prefer an empty buffer between them. Weights are adjusted up when any of the three space types drop below their required quota. The second part of this investigation examines a site with three types of structures, a 15 storey tower, an 8 storey building, and a 4 storey building. The site is graphed as a whole - that is, individual buildings are represented as a regular graph (as in the previous investigation) but all three buildings are triangulated together. The purpose of this investigation is to see how our previous algorithm performs across multiple inter-related structures. This set of basic rules produces unexpected effects and complexity. Ribboning, layering, grouping and clustering is visible in the iterations. Types of spaces group together and move apart. In all experiments, a pattern or order becomes identifiable during the iterations, but unexpected results also become apparent. Some of the iterations stabilise, begin repeating or flip back and forth between opposite states.
Hito-ga-Hito-Yobu
Do While i < maxNum Set el = coll.Item(i) ‘-------For dead nodes: marked with an ellipse curve If el.load(“alivedness”) = “f” Then startPoints(i) = Array(el.x, el.y, el.z) Rhino.CurrentLayer(“dead”) Dim arrCenter, arrSecond, arrThird arrCenter = startPoints(i) Randomize() arrSecond = Array(el.x+(Rnd()*10), el.y, el.z) arrThird = Array(el.x, el.y+(Rnd()*5), el.z) Rhino.AddEllipse3Pt arrCenter, arrSecond, arrThird End If ‘-------For alive nodes: create vector field oriented radially around the station point If (node.iterationCount) > 0 Then ‘for alive nodes If el.load(“alivedness”) = “t” Then
Jessica In & Peter Charles
Hitogahitoyobu describes the Japanese cultural phenomena “people call people”. When a new noodle shop opens, people line up to try out the new product. Sometimes rent-acrowds are hired. Passers-by notice. The customers serve as advertising. If the line stays constant, more customers will come. This can be applied to different architectural programs that inhabit the city, forming patterns of constant growth and decay. Clusters and dispersions are formed. This investigation focussed on an area in central Tokyo, Shibuya. Initially studies were made into the programs that typically cluster or don’t cluster together. It was hoped to research possible local level phenomena that form, creating a city, and then change the rules that govern these phenomena to emerge into another city. Typically higher topography is of higher value in Tokyo, but Shibuya originally emerged from the crossing of a trade route with a river (the silent attractor) in a valley.
‘
VectObject = VectorField(startPoints(i), stationPoint) strObject = VectObject arrTargetPt1(0) = makePoints(strObject, 0) arrTargetPt1(1) = makePoints(strObject, 1) Rhino.Print (“targetPoint 1a is : “ + Rhino.Pt2Str(arrTargetPt1(0))) Rhino.Print (“targetPoint 1b is : “ + Rhino.Pt2Str(arrTargetPt1(1)))
The overlapping of 4 train lines has created a super-node. Property in the proximity currently gains highest pedestrian traffic and rental yields, outweighing the higher ground. Road networks radiate out from the station, forming a centrifugal field. Coffee shops & Video Stores occupy vantage points overlooking plazas, stacking vertically. Bars and Love Hotels occupy dark areas in back-streets and cluster together. Specialty music stores create their own precinct. Restaurants hide themselves behind screens. Convenience Stores are only needed 3 for every block. They reach saturation.
‘ VectorTemp = Rhino.ObjectsByType(4, True) End If ‘for alive nodes: if el.load(“alivedness”) = “t” Then
End If ‘-------loop through all the nodes. if node is already alive or dead, it remains unchanged. ‘-------If a new node has not been assigned a state, ‘alivedness’ is randomly assigned Set coll = node.allNodes() maxNum = coll.Count
Observations on the Ephemeral The apparently ephemeral phenomena can usually be traced to logical and tangible causes. Around the station, advertising billboards face directly onto the plazas from all angles. On main roads, buildings face the roads. Slopes are conducive to entertainment. Setbacks from main roads suit bars and love hotels. Muddy river banks, even when hidden from view, can’t have highrise development.
E3
E2
E1
ZONE A 0-200 ZONE B 200-300 ZONE C 300-500 ZONE D 500-700 ZONE E 700+
E2 E2
Different conditions, next to infrastructure, create different values. Roads, rivers, highways and footbridges become attractors and detractors. A road crossing over a river provides different conditions to a train line crossing a road. Property law and property value inform how small properties consolidate over time. Properties are forced to merge, and new buildings have greater setbacks.
E1
dead nodes
D2
D3
D1 D2
D2 E2
ZONE D
C1
C2
D3
ZONE C
C1 B1
C2
C2
proximity
B1
D2 D3
B2
C3
A2
elds B1 C1
The city was then set in motion, working with property laws, and property values as its guide for development. It reconfigures itself, reaching up and occupying less ground plane. The city evolves from dense honeycomb, into objects in a field, all facing a central point. Program is ambiguous, maintaining its stacked and scattered order, stretched vertically. It illustrates the values of today’s society.
6 nodes @ 1 hop 16 nodes @ 2 hops 27 nodes @ 3 hops
zone d
zone c
zone b
40
30
zone a
40
30 20 30 40
20
ZONE B ZONE A
B2
A1
- The 4th condition governs the conditions set out by the first 3. - Zones result from the overlapping of distances from the station. - Initial buildings are mapped, and their orientation set towards the station.
6 nodes @ 1 hop 16 nodes @ 2 hops 27 nodes @ 3 hops
ZONE E
C3
D1 D2
E3
4 major conditions were chosen: typology, orientation & distance station 1 Station Sphere offrom Influence road attractor vectors 2 Topography 3 Radial Vector Field that orientates buildings 4 Property Law and Property value advertising vector
ReDim dblAngleArr(maxNum) startPoints(i) = Array(el.x, el.y, el.z) Rhino.CurrentLayer(“VectorFieldLayer”)
30
i = 0 ‘reset count Do While i < coll.Count -1 Set el = coll.Item(i) If el.load(“alivedness”) = “t” Then ‘node is alive Call el.save(“alivedness”, “t”) Else If el.load(“alivedness”) = “f” Then Call el.save(“alivedness”, “f”) Else Randomize() If Rnd() < 0.5 Then ‘node is alive Call el.save(“alivedness”, “t”) Else ‘node is dead Call el.save(“alivedness”, “f”) End If End If End If ‘ i=0 ‘reset count ////////////ADD VECTOR CRV ARROWS FUNCTION//////////////////////////////// Function AddVector (vecDir, ptBase) If IsNull(ptBase) or Not IsArray(ptBase) Then ptBase = Array(0,0,0) End If Dim ptTip, CrvArrs, CrvArrsNormal ptTip = Rhino.PointAdd(ptBase, vecDir) Rhino.CurrentLayer(“VectorFieldLayer”) AddVector = Rhino.AddLine(ptBase, ptTip) CrvArrs = Rhino.CurveArrows(AddVector, 2) CrvArrsNormal = Rhino.CurveNormal (CrvArrs) End Function ‘////////////SORT DISTANCES FUNCTION//////////////////////////////// Function SortDistances(arrSort, switch) ‘ If IsArray(arrSort) Then ‘ arrSort = Rhino.SortNumbers(arrSort, True) ‘ End If ‘ SortDistances = arrSort(0) Dim strHolder, i, j If IsArray(arrSort) Then For i = (UBound(arrSort) - 1) To 0 Step -1 For j= 0 To i If arrSort(j) > arrSort(j+1) Then strHolder = arrSort(j+1) arrSort(j+1) = arrSort(j) arrSort(j) = strHolder End If ‘UCase