VIOLENT VOLUMES

The Hive WIP #2

The Hive WIP #2

 

The Hive WIP #2

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.

 

 

Share this post

Rhinoscript Etude


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

Complete script download

Share this post

Mapping Cemeteries

Park & Open space
Cemetery

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.

1. Michel Ragon, ‘The Space of Death’

Share this post

California Roll House

California Roll House

 

California Roll House, 2011

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.

Share this post

Beam me up, Mike!

Beam me up, Mike!

Beam me up, Mike!

Beam me up, Mike! , 2010

Scripted sculpture. 50 x 90 x 192 cm

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.

Share this post

Rhinoscript – select random objects

'---------------------------------------------------------
'
'	Select random objects by percentage from selection
'	2012.06.02 Chris Daniel Kim
'
'---------------------------------------------------------
arrObjects = Rhino.GetObjects("Pick objects")
dblPercentage = Rhino.GetReal("Set percentage", 50, 0,100)

NumItems = int(dblPercentage*UBound(arrObjects)/100)
Rhino.Print NumItems & " elements will stay."

arrObjectsCopy = arrObjects

Dim i,j,tmp

Randomize 'Shuffle
For i = 1 To UBound(arrObjects) - 1
	' Pick a random element.
	j = Int((UBound(arrObjects) - i + 1) * Rnd + i)
	' Swap.
	tmp = arrObjectsCopy(i)
	arrObjectsCopy(i) = arrObjectsCopy(j)
	arrObjectsCopy(j) = tmp
Next

'Cut the tail
Redim Preserve arrObjectsCopy(NumItems)

Rhino.SelectObjects (arrObjectsCopy)
Share this post

Voxelizer Rhinoscript

Voxel Chair black

Voxel Chair white

 

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 !

Share this post