Intense Workshop, ”Complex Formations”
Roland Snooks (Kokkugia) + Martin Tamke (CITA)


De seneste års udvikling af digitale værktøjer tilbyder os nye måder at tænke design på. Arkitektur- og design-professionen har udviklet en lang række metoder til løsnings-findende kravstillelser af design-opgaver gennem alle tænkelige skaler. Disse strategier søger at svare på komplekse spørgsmål gennem processerne involveret i opbygning og drift af det byggede. Teknikker så som diagrammer, mapping og skitsering og endda mere direkte form-findende tilgange så som Gaudis hængede kæder, Behnischs elastiske membraner og sæbeboble-modellerne fra Frei Otto, hjælper til at forstå og definere rumlige strukturer og opsætninger af rammerne for arkitekturen.

Digitale værktøjer tilbyde nye strategier som svar på denne stigende kompleksitet i spørgsmålene omkring arkitektonisek omgivelser. Strategier og resultater kan derfor ikke længere bestå udelukkende af simple, mekaniske relationer, men er nødt til at operere og interagere på mange forskellige niveauer. Lagopbygning og indbyrdes afhængighed må fremadrettet karaterisere arkitektonisk design.

Workshop outline

Denne workshop vil udforske algoritmiske design-metoder der engagerer komplekse og ikke-linære systemer med det mål for øje at skabe påvirkelige fremkomster. Workshoppen vil har altså til formål at udvikle selv-aktiverende og selv-organiserende tekniker der er i stand til at generere komplekse formgivninger.

Denne forskning vil undersøge hvordan en egentlig arkitektonisk hensigt kan fungere på lokalt niveau og gennem interaktionen mellem regler defineret, på lavt niveau. På denne baggrund opstår systemiske geometrier og aggregeringer.

Workshoppen introducerer altså et sæt algoritmiske designteknikker, som vi vil søge at udvide gennem arbejdet med dem, for på denne facon forhåbentlig at lande et sted med en mere sammenhængende, generativ metode.

Disse strategier vil omfatte rekursion, betinget substitution og selvorganiseringsprincipper. Denne metode vil blive introduceret og udviklet gennem RhinoScript (scripting-sprog baseret på VBscript), som vil danne grundlag for et groft skitseret design af en fiktiv, rumlig installation. Et hypotetisk sted for projektet vil blive givet; Statens Museum for Kunst.

Således vil denne workshop blive behandlet som et scenarie for at undersøge, hvad der er af formgivningsmuligheder og påvirkninger gennem digitalt design / computerprogrammeret design, med de primære omdrejningspunkter vækst og selvorganiseringsprincipper / -algoritmer.

Link.
















Det følgende RhinoScript automatiserer navngivningsprocessing, så vi senere, med vores 'Substitution System Aggregation'-script kan identificerer samlingspunkterne i vores generative struktur:

' Script written by Roland Snooks (https://www.kokkugia.com)
' Script edited by Claus Rytter Bruun de Neergaard (https://www.clausclaus.com)

Call NamingObjects()
   
    Sub NamingObjects()
       
        Dim strObj

            For i = 0 To 2

                For j = 0 To 9

                    If j = 0 Then

                        strObj = Rhino.GetObject("select object " & CStr(i) & " block /                                 block instance", 4096)
                        Select Case i
               
                        Case 0
                            Rhino.SetObjectData strObj, "section", "type", "a"

                        Case 1
                            Rhino.SetObjectData strObj, "section", "type", "b"

                        Case 2
                             Rhino.SetObjectData strObj, "section", "type", "c"
   
                        End Select

                    Else

                        strObj = Rhino.GetObject("select object " & CStr(i) & " point " &                               CStr(j), 1)

                    End If

                Rhino.ObjectName strObj, "obj_" & CStr(i) & "_" & CStr(j)

            Next
       
        Next
   
    End Sub

I det næste script bruger vi så de objekter (blocks) som vi netop har navngivet. Objekterne bliver sat sammen på nye måder, og genererer såldes disse strukturer, der hele tiden bygger videre på sig selv, gennem generationer. Orientering og sammensætning bygger bl.a. på den navngivning vi udførte i forrige script.

' Script written by Roland Snooks (https://www.kokkugia.com)
' Script edited by Claus Rytter Bruun de Neergaard
‘ https://www.clausclaus.com

Option Explicit

Call Main()
Sub Main()

Dim i, j, b
Dim intGens
Dim arrStartLoc, arrTemp
Dim objArrSingle(), objArr(2)
Dim refPtsSingle(), refPts(2)
Dim strObj, strObjArr

' user input - gens + start loc
intGens = Rhino.GetReal("how many generations", 10)
arrStartLoc = Rhino.GetPoint("select a starting location")

' compile named objects into arrays
For i = 0 To 2
    ReDim objArrSingle(9)
   
    For j = 0 To 9
        arrTemp = Rhino.ObjectsByName("obj_" & CStr(i) & "_" & CStr(j) )
       
        If Not isArray(arrTemp) Then Exit Sub
       
        objArrSingle(j) = arrTemp(0)
       
        Next
   
    objArr(i) = objArrSingle
   
    Next
   
    ' reference points / base
    For i = 0 To 2
        ReDim refPtsSingle(2)
       
        For j = 1 To 3
            refPtsSingle(j-1) = Rhino.PointCoordinates(objArr(i)(j))
            Next
       
        refPts(i) = refPtsSingle
    Next

' make start object - "a"
strObjArr = Rhino.CopyObjects(objArr(0), refPts(0)(0), arrStartLoc)

' call recursive function substitute
objArr, refPts, strObjArr, intGens
End Sub

Function substitute(objArr, refPts, strObj, intGens)
    Dim objType, newObjArr, target, nextObj
   
    ' conditional - if - gens
    If intGens > 0 Then
   
        ' get type
        objType = Rhino.GetObjectData(strObj(0), "section", "type")

        ' rules based on type
        Select Case objType

        Case "a" ' a-b                                  
            target = 0 '''' 0 or 1
                               
            nextObj = 1 '''' 0 or 1 or 2 (a,b,c)

            ' orient the object - use as input to a recursive function call
            newObjArr = orient(strObj, refPts(nextObj), objArr(nextObj),                     target)
            substitute objArr, refPts, newObjArr, intGens-1

        Case "b" ' b-ca
           target = 1 '''' 0 or 1
       
            nextObj = 2 '''' 0 or 1 or 2 (a,b,c)
            newObjArr = orient(strObj, refPts(nextObj), objArr(nextObj),                     target)

            substitute objArr, refPts, newObjArr, intGens-1
            target = 0 '''' 0 or 1 nextObj = 0 '''' 0 or 1 or 2 (a,b,c)
            newObjArr = orient(strObj, refPts(nextObj), objArr(nextObj),                     target)

            substitute objArr, refPts, newObjArr, intGens-1

        Case "c" ' c-a
            target = 1 '''' 0 or 1
            nextObj = 0 '''' 0 or 1 or 2 (a,b,c)
            newObjArr = orient(strObj, refPts(nextObj), objArr(nextObj),                     target)

            substitute objArr, refPts, newObjArr, intGens-1
        End Select
    End If
End Function

Function orient(strObj, refPts, objArr, tarIndex)
    Dim tarArrPts(), i, newObjs ' decides on target

    If tarIndex = 0 Then  
        ' target 1 For i = 4 To 6
        ReDim Preserve tarArrPts(i-4) tarArrPts(i-4) =                                   Rhino.PointCoordinates(strObj(i))
   
    Next Else
        ' target 2 For i = 7 To 9
        ReDim Preserve tarArrPts(i-7) tarArrPts(i-7) =
            Rhino.PointCoordinates(strObj(i))

    Next

End If

' orients objs
newObjs = Rhino.OrientObjects(objArr, refPts, tarArrPts, 1)

For i = 0 To UBound(newObjs)
    Rhino.ObjectName newObjs(i), ""
Next

orient = newObj

End Function