All the stiffness of modeling environment and constraints in BIM modeling process sometimes give you frustration and less freedom in modeling but in the end it actually results more accurate, parametric (and therefore flexible) model. So the issue should be when to implement BIM after concept design stage.
I made this little script for an M.Arch course when I was in school three years ago.
It tessellates a nurbs surface in several layers, and extrudes one of the layer with another parameter.
It can be applied to generate a parametric building facade for specific site condition.
Printed out with resin 3d printer.
Below is the complete script.
Option Explicit
' 20080507 Chris Kim
Call Panel1()
Sub Panel1()
Dim idSurface : idSurface = Rhino.GetObject("Surface to frame", 8, True, True)
If IsNull(idSurface) Then Exit Sub
Dim intCountU : intCountU = Rhino.GetInteger("Number of iterations per direction", 10, 2)
If IsNull(intCountU) Then Exit Sub
Dim intCountV : intCountV = Rhino.GetInteger("Number of iterations per direction", 10, 2)
If IsNull(intCountV) Then Exit Sub
Dim intTessel : intTessel = Rhino.GetInteger("maximum degree of tesselation", 3, 2,10)
If IsNull(intTessel) Then Exit Sub
Dim arrSurfaceDmU : arrSurfaceDmU = Rhino.SurfaceDomain (idSurface, 0)
Dim arrSurfaceDmV : arrSurfaceDmV = Rhino.SurfaceDomain (idSurface, 1)
' common vars
Dim arrQuadPanelPoints(4), arrCenterOfPanel
Dim currentPlane, strCurrentQuadPanel
Dim recXspread,recYspread
Dim strSullivan2, strSullivan5, strSullivan7
Dim tempScale, arrTempPt
Dim arrStrTessel2Quads(3),arrTessel2Points
Dim i,j,k,l,m,n
' var for sullivan 2 process
Dim dblExtrusion
Dim arrProcess2Pt1 : arrProcess2Pt1 = Rhino.GetPointOnSurface (idSurface,"pick light effect point no.1 (positive louvers)")
Dim arrProcess2Pt1_2 : arrProcess2Pt1_2 = Rhino.GetPointOnSurface (idSurface,"effect area for point no.1")
Dim dblProc2Dist1 : dblProc2Dist1 = Rhino.Distance (arrProcess2Pt1, arrProcess2Pt1_2)
Dim dblCurrentProc2Dist1
Dim arrProcess2Pt2 : arrProcess2Pt2 = Rhino.GetPointOnSurface (idSurface,"pick light effect point no.2 (negative louvers)")
Dim arrProcess2Pt2_2 : arrProcess2Pt2_2 = Rhino.GetPointOnSurface (idSurface,"effect area for point no.2")
Dim dblProc2Dist2 : dblProc2Dist2 = Rhino.Distance (arrProcess2Pt2, arrProcess2Pt2_2)
Dim dblCurrentProc2Dist2
' Layers
Call Rhino.AddLayer ("panels_quad_t1",RGB(0,0,255),vbTrue)
For i = 2 to intTessel
Call Rhino.AddLayer ("panels_quad_t" & i, RGB(0,255,255))
Next
Call Rhino.AddLayer ("Sullivan2_result")
'---------------------------------------------
'
' first paneling
'
'---------------------------------------------
For i = 0 to arrSurfaceDmU(1)-arrSurfaceDmU(1)/intCountU Step arrSurfaceDmU(1)/intCountU
For j = 0 to arrSurfaceDmV(1)-arrSurfaceDmV(1)/intCountV Step arrSurfaceDmV(1)/intCountV
Call Rhino.EnableRedraw(False)
arrQuadPanelPoints(0) = Rhino.SurfaceEvaluate (idSurface, Array(i,j), 1)(0)
arrQuadPanelPoints(1) = Rhino.SurfaceEvaluate (idSurface, Array(i+arrSurfaceDmU(1)/intCountU,j), 1)(0)
arrQuadPanelPoints(2) = Rhino.SurfaceEvaluate (idSurface, Array(i+arrSurfaceDmU(1)/intCountU,j+arrSurfaceDmV(1)/intCountV), 1)(0)
arrQuadPanelPoints(3) = Rhino.SurfaceEvaluate (idSurface, Array(i,j+arrSurfaceDmV(1)/intCountV), 1)(0)
arrQuadPanelPoints(4) = arrQuadPanelPoints(0)
'current quad panel
strCurrentQuadPanel = Rhino.AddPolyline (arrQuadPanelPoints)
'center point of panel
arrCenterOfPanel = MidPoint(arrQuadPanelPoints(1),arrQuadPanelPoints(3))
Call Rhino.ObjectLayer (strCurrentQuadPanel, "panels_quad_t1")
Call Rhino.EnableRedraw(True)
Next
Next
'------------------------------------------------
'
' further Tessellation
'
'-------------------------------------------------
For j = 2 to intTessel
Dim arrSelectedQuads
Dim arrTessellated
arrSelectedQuads = Rhino.ObjectsByLayer ("panels_quad_t" & j-1) 'select panels from previous level
Rhino.Print "panels_quad_t" & j-1 & " panels are being tesselated"
If IsArray(arrSelectedQuads) Then
For k = 0 to UBound(arrSelectedQuads)
Call Rhino.EnableRedraw(False)
Dim arrCurrentQuadPanelPoints
Dim dblCurrentSrfGrade
dblCurrentSrfGrade = GetGradeInQuad(idSurface, arrSelectedQuads(k))
If dblCurrentSrfGrade > 90/intTessel*(j-1) Then
arrCurrentQuadPanelPoints = Rhino.PolylineVertices (arrSelectedQuads(k))
arrTessellated = TessellateQuad(arrCurrentQuadPanelPoints)
Call Rhino.ObjectLayer (Rhino.AddPolyline (arrTessellated(0)), "panels_quad_t" & j)
Call Rhino.ObjectLayer (Rhino.AddPolyline (arrTessellated(1)), "panels_quad_t" & j)
Call Rhino.ObjectLayer (Rhino.AddPolyline (arrTessellated(2)), "panels_quad_t" & j)
Call Rhino.ObjectLayer (Rhino.AddPolyline (arrTessellated(3)), "panels_quad_t" & j)
Rhino.DeleteObject (arrSelectedQuads(k))
End If
Call Rhino.EnableRedraw(True)
Next
End If
Next
'------------------------------------------------
'
' Layer purge
'
'-------------------------------------------------
For l = 0 to intTessel
Dim arrTempCheckLayer
arrTempCheckLayer = Rhino.ObjectsByLayer ("panels_quad_t" & l)
If Not IsArray(arrTempCheckLayer) Then
Rhino.DeleteLayer("panels_quad_t" & l)
Rhino.Print "panels_quad_t" & l & " is deleted"
End If
Next
'------------------------------------------------
'
' process for
' sullivan ornament element No.2
'
'-------------------------------------------------
For m = 1 to intTessel
Dim arrSullivan2
arrSelectedQuads = Rhino.ObjectsByLayer ("panels_quad_t" & m)
If IsArray(arrSelectedQuads) Then
Rhino.Print "Extruding level " & m
For n = 0 to UBound(arrSelectedQuads)
arrCenterOfPanel = GetQuadCenter(Rhino.PolylineVertices (arrSelectedQuads(n)))
'set condition
dblCurrentProc2Dist1 = Rhino.Distance(arrProcess2Pt1,arrCenterOfPanel)
dblCurrentProc2Dist2 = Rhino.Distance(arrProcess2Pt2,arrCenterOfPanel)
dblExtrusion = 0
If dblCurrentProc2Dist1 >= dblCurrentProc2Dist2 Then
' Panel is closer to point 1
If dblCurrentProc2Dist2
The distribution pattern of urban cemeteries in Hong Kong seems to conform to urban boundaries whereas designated public open spaces are integrated between blocks forming a green network. The negative images of cemetery as NIMBY (Not In My Back Yard) program and need of urban cemetery for ancestral worship seems to equilibrate on the boundaries of urban area.
Cemetery is an urban phenomenon. A city of the living always have a need of space for the dead too. As a city grows, the cemetery becomes a collection of accumulated layers over generations created by each era of the living society. And it is a valuable and important public site not just because it is a historical heritage but it relates living members of the city through generations. Through this process of layering, cemeteries in many different cultural contexts have been reflecting the society’s identity as an urban dual throughout history. Different attitude on death and socio-economical context of different cities have resulted its own typology of cemetery.
The necropolis is the reverse side of the metropolis. Which side is which depends on one’s point of view. For the cemetery, an idealized double of this city, appears at the same time as a perfect reproduction of the socio-economic order of the living.1
In comparison with western cemeteries like Pere-Lachaise in Paris, the reasons why such an important public institution, cemeteries in Hong Kong, are not well accepted as public spaces in our daily life is mainly due to Chinese attitude on death and desirable requirements for the cemeteries. Moreover, extreme urban situation driven by economic values have lead urban cemetery typology to more spatial-efficiency driven one without proper consideration of activities accommodated by cemeteries.
At times, the simplest form with least manipulation from its original form can offer visual amenities and adapted solution to the context. California Roll prefabricated house takes this methodology to create its morphological adaptation to its environment: desert. Homogeneous exterior material which provides high grade of energy efficiency and reflects heat from the sun covers the entire surface except for glass panels which is electronically controlled to change its transparency.
Modularization of every structure members and finish materials are maximized to provide mobility with rapid assembly and disassembly on site.
To sustain its challenging structural stand, carbon fibre truss frame underneath the exterior material holds the entire architecture. Hydraulic powered automatic doors and security system is used for main entrance door which allows less space to operate the door mechanism. California Roll house features these latest technologies applied to architecture which breaks the boundary of product or vehicle design and architectural design which brings more mobility to living spaces.
Plain surface on the ground extended from exterior surface provides paved area for outdoor activities which requires flat and artificial surface different from desert sand surface. As well as surface on the ground, inside of exterior shell is covered with fibre reinforced plastic panels.
Ground Floor Plan
Second Floor Plan
Second Floor Interior View
Modularized skylights and windows along the exterior surface can be placed at desired location to light its interior space to meet resident’s requirement from his own usage of the space.
Passive and subtle control of privacy of bedroom area is provided by curtain divider and bookshelf with translucent midpart. These parts allow the residents to have sense of privacy by delicate visual hints over as well as providing lights through.
Overall, the privacy in California Roll is controlled rather passively with resident’s awareness than tight blocking of spaces in-between.
Click below images to enlarge
Long Section A
Long Section B
Cross Section
Automatic main door mechanism diagram
Since the main entrance is on the sloped wall, the door mechanism should be designed in unconventional way. Adopting ideas from automotive design industry, hydraulic powered automatic door controlled by number lock panel is installed on the sloped wall as main entrance to minimize the space required for operation to avoid contact with user while in operation. When the door is fully open, the clearance height is up to 2 meters.
The door opens into two pieces, the upper piece lifts up over head, and the lower piece unfolds onto the floor for visitors to step on. When the door is completely closed, the material on the outside of door continues with the material of the exterior surface to achieve conformity and hide the entrance.
Beam me up, Mike! is a reorganized voxels of The statue of David by Michelangelo. By means of scripted modeling, the sculpture is voxelized in total 8 steps of refining cubes. The size of voxel cubes starts from 120mm of edge length and scales down to half each step. The top part (head of the statue) is in original shape as it represents ultimately refined voxels.
I made a voxelizer rhinoscript for a project I have in my mind. took me few days to find the
fastest algorithm but I think I ended up with common one.I tried few other ways to make
voxels but they always missed some voxels that should be made..
below is just the gist of the script
For dz = 0 to sizeZ
' check each level of contours
Rhino.EnableRedraw (False)
Rhino.Print "processing step " & dz & "/" & sizeZ
For dy = 0 to sizeY
For dx = 0 to sizeX
containment = 0
'Points to shoot
arrPtXY = Rhino.XformCPlaneToWorld (Array(dx*IntervalX+0.5*IntervalX, dy*IntervalY+0.5*IntervalY, 0.5*IntervalZ), arrGridPlane)
arrPtXZ = Rhino.XformCPlaneToWorld (Array(dx*IntervalX+0.5*IntervalX, 0.5*IntervalY, dz*IntervalZ+0.5*IntervalZ), arrGridPlane)
arrPtYZ = Rhino.XformCPlaneToWorld (Array(0.5*IntervalX, dy*IntervalY+0.5*IntervalY, dz*IntervalZ+0.5*IntervalZ), arrGridPlane)
'Projected points
arrXYProjects = Rhino.ProjectPointToMesh (arrPtXY, strMesh, arrPtZaxis)
arrXZProjects = Rhino.ProjectPointToMesh (arrPtXZ, strMesh, arrPtYaxis)
arrYZProjects = Rhino.ProjectPointToMesh (arrPtYZ, strMesh, arrPtXaxis)
'Testbox in Cplane coordinate
arrTestBox(0) = Array(dx*IntervalX, dy*IntervalY, dz*IntervalZ)
arrTestBox(1) = Array((dx+1)*IntervalX, dy*IntervalY, dz*IntervalZ)
arrTestBox(2) = Array((dx+1)*IntervalX, (dy+1)*IntervalY, dz*IntervalZ)
arrTestBox(3) = Array(dx*IntervalX, (dy+1)*IntervalY, dz*IntervalZ)
arrTestBox(4) = Array(dx*IntervalX, dy*IntervalY, (dz+1)*IntervalZ)
arrTestBox(5) = Array((dx+1)*IntervalX, dy*IntervalY, (dz+1)*IntervalZ)
arrTestBox(6) = Array((dx+1)*IntervalX, (dy+1)*IntervalY, (dz+1)*IntervalZ)
arrTestBox(7) = Array(dx*IntervalX, (dy+1)*IntervalY, (dz+1)*IntervalZ)
'See if the projected points are in the Textbox
If IsArray(arrXYProjects) Then
For i = 0 to UBound(arrXYProjects)
If IsPointInBox(Rhino.XformWorldToCPlane (arrXYProjects(i), arrGridPlane), arrTestBox) Then
containment = 1
End If
Next
End If
If IsArray(arrXZProjects) Then
If containment = 0 Then
For j = 0 to UBound(arrXZProjects)
If IsPointInBox(Rhino.XformWorldToCPlane (arrXZProjects(j), arrGridPlane), arrTestBox) Then
containment = 1
End If
Next
End If
End If
If IsArray(arrYZProjects) Then
If containment = 0 Then
For k = 0 to UBound(arrYZProjects)
If IsPointInBox(Rhino.XformWorldToCPlane (arrYZProjects(k), arrGridPlane), arrTestBox) Then
containment = 1
End If
Next
End If
End If
If containment = 1 Then
'Rhino.Print dx & " - " & dy & " - " & dz
arrMakeBox(0) = Rhino.XformCPlaneToWorld (arrTestBox(0), arrGridPlane)
arrMakeBox(1) = Rhino.XformCPlaneToWorld (arrTestBox(1), arrGridPlane)
arrMakeBox(2) = Rhino.XformCPlaneToWorld (arrTestBox(2), arrGridPlane)
arrMakeBox(3) = Rhino.XformCPlaneToWorld (arrTestBox(3), arrGridPlane)
arrMakeBox(4) = Rhino.XformCPlaneToWorld (arrTestBox(4), arrGridPlane)
arrMakeBox(5) = Rhino.XformCPlaneToWorld (arrTestBox(5), arrGridPlane)
arrMakeBox(6) = Rhino.XformCPlaneToWorld (arrTestBox(6), arrGridPlane)
arrMakeBox(7) = Rhino.XformCPlaneToWorld (arrTestBox(7), arrGridPlane)
Rhino.AddBox arrMakeBox
End IF
Next
Next
Rhino.EnableRedraw (True)
Next
still have a lot of tweeking to do..
for now, it has some bugs .. and incredibly slow for large number of blocks. but it does the job I need !