Dec
08

Colony

This is still under a lot of progress. Just exploring ways to randomly populate a surface with mesh objects in this case with bikes and tanks.

Nov
24

Erdos Museum – MAD

One of the first buildings that will be finished that I worked on. A real physical mesh that can’t be spun around by a click of a mouse. Can’t believe it’s actually standing :)

Photos by Shang Li

Nov
14

NY – Korea

These are some polaroid shots by an artist friend from New York. He’s been living in Korea for a little more than a year now. Enjoy what a New Yorker sees in Korea.

All photos by Duke Donohue.

Oct
18

Box – Sphere

Just a random study. Each cell is a a solid box carved by a sphere that is changing in shape performed by BooleanDifference in Rhino.

Oct
12

Learning through Repetition?

It’s been interesting to see how Korean students are almost always forced to memorize infinite amount of information as part of their education. If one fails to do so, unwanted consequences ranging from lower test scores to physical punishments follow. In efforts to compete and be successful in this system, the students often choose a path that maximizes their ability to memorize facts: learning through repetition. From this a type of art emerge, the process of learning is expressed through blank pieces of paper, ink, and time. The students refer to this as Ggamji meaning black paper.
 

 

It’s interesting to find that Koreans from few hundred years ago also had very similar ways of learning. These are scans of old books that you can easily buy all over Korea. These are traces of students from the past copying their textbooks over and over to memorize the contents. It’s a funny feeling buying thousands of hours of one’s effort to learn with just a few bucks.

 

 

Aug
01

Korean Mud

The west shoreline of Korea got some amazing tidelands. Miles and miles of mud. These pictures are from Gwanghwa Island, truly an awesome place.

Pictures by Yang Min Jong

Jul
28

Facade

Some images of an on-going facade design. Same-sized fins. Varied rotations.
Under progress, progress, and more progress.


Jun
28

Hahoe Folk Village

I’m always impressed by the way traditional architects build. Hahoe is one of these preserved areas where people still live in the old Korean spaces. Although I’m a huge fan of the digital technology for all its advantages, precise calculations or heavy-duty machines are obviously not the most important elements in creating masterful designs. I feel as if I have become a little too computer driven. I love the fact that all the houses, the streets, and the natural gardens at Hahoe are so beautifully scaled for small daily activities. There is no overwhelming sense of sublime architecture. The wooden structures, stone walls, and paper windows are all very human in size, proportion, and arrangements. It’s amazing how everything manages to humbly blend into the natural surroundings.

Read the rest of this entry »

Jun
25

Magok Process

This is the recent competition that we finished recenlty. Unfortunately, most of the bigger Korean companies ended up winning the competition. These are the pages that we submitted.

Click to View all Pages

MAGOK PROCESS (Albu, Kim, Rui, Yam, Yin)

Jun
18

Two Surface Space Frame (Rhino Explicit History)

space frame

Ah so, the new version of the Explicit History plug-in for Rhino is out. http://grasshopper.rhino3d.com. It’s going to be a cool new toy to play with :)

This is another way of creating space frames using U/V divisions from two surfaces. Almost the same thing as the previous post. Very simple.

crtli_gh_space_frame.wrm
crtli_gh_space_frame.3dm

Jun
17

Two Surface Space Frame (MEL)

This could be done with many different softwares/methods. Some time last year, I was looking at MEL to write this script that uses two different surfaces to simulate a space frame according to U/V divisions. This can now be easily performed with just a few steps using Grasshopper (Explicit History Plug-in) in Rhino.

//
// Script written by Howard Jiho Kim | kimjiho@gmail.com | crtl-i.com | 2007
//
// ex.
// spFrSurface(srfName1, srfName2, U, V)
// spFrSurface(“nurbsPlane1″, “nurbsPlane2″, 10, 10)
//

// HORIZONTAL MEMBERS!!

global proc spFrSurface(string $nurb, string $nurb2, int $u, int $v)
{
gridSurface($nurb, $u,$v);
gridSurface($nurb2, $u,$v);

float $u_inc = 1.0/$u;
float $v_inc = 1.0/$v;
float $cv[], $cv2[], $cv3[];

float $i2, $k2;

// get U information

$u = $u + 1;
$v = $v + 1;

for($i=0;$i<$u;$i++)
{
for($k=0;$k<$v;$k++)
{

$i2 = $u_inc * $i;
print (“u:” + $i2 + ” | “);
$k2 = $v_inc * $k;
print (“v:” + $k2 + ” | “);
$cv = `pointOnSurface -u $i2 -v $k2 -position $nurb`;
print( $cv[0] +” “+ $cv[1] +” “+ $cv[2]  + ” | “);

$cv2 = `pointOnSurface -u $i2 -v $k2 -position $nurb2`;
print( $cv2[0] +” “+ $cv2[1] +” “+ $cv2[2] +”\n”);

curve -d 1 -p $cv[0] $cv[1] $cv[2] -p $cv2[0] $cv2[1] $cv2[2] -k 0 -k 1;

// print CV

//$x[$k] = $cv[0];
//$y[$k] = $cv[1];
//$z[$k] = $cv[2];

}

//$curveName[$i] = `curve -p $x[0] $y[0] $z[0] -p $x[1] $y[1] $z[1] -p $x[2] $y[2] $z[2] -p $x[3] $y[3] $z[3] -p $x[4] $y[4] $z[4] -p $x[5] $y[5] $z[5] -p $x[6] $y[6] $z[6] -p $x[7] $y[7] $z[7]`;
}
}

// LONGITUDINAL MEMBERS
global proc gridSurface(string $nurb, int $u, int $v)
{
float $u_inc = 1.0/$u;
float $v_inc = 1.0/$v;
float $cv[], $cv2[], $cv3[];

float $i2, $k2;

// get U information

$u = $u + 1;

for($i=0;$i<$u;$i++)
{
for($k=0;$k<$v;$k++)
{

$i2 = $u_inc * $i;
print (“u:” + $i2 + ” | “);
$k2 = $v_inc * $k;
print (“v:” + $k2 + ” | “);
$cv = `pointOnSurface -u $i2 -v $k2 -position $nurb`;
print( $cv[0] +” “+ $cv[1] +” “+ $cv[2]  + ” | “);

$k3 = $v_inc * ($k+1);

$cv2 = `pointOnSurface -u $i2 -v $k3 -position $nurb`;
print( $cv2[0] +” “+ $cv2[1] +” “+ $cv2[2] +”\n”);

curve -d 1 -p $cv[0] $cv[1] $cv[2] -p $cv2[0] $cv2[1] $cv2[2] -k 0 -k 1;

// print CV

//$x[$k] = $cv[0];
//$y[$k] = $cv[1];
//$z[$k] = $cv[2];

}

//$curveName[$i] = `curve -p $x[0] $y[0] $z[0] -p $x[1] $y[1] $z[1] -p $x[2] $y[2] $z[2] -p $x[3] $y[3] $z[3] -p $x[4] $y[4] $z[4] -p $x[5] $y[5] $z[5] -p $x[6] $y[6] $z[6] -p $x[7] $y[7] $z[7]`;
}

// get U information

$v = $v + 1;
$u = $u – 1;

for($i=0;$i<$v;$i++)
{
for($k=0;$k<$u;$k++)
{

$i2 = $u_inc * $k;
print (“u:” + $i2 + ” | “);
$k2 = $v_inc * $i;
print (“v:” + $k2 + ” | “);
$cv = `pointOnSurface -u $i2 -v $k2 -position $nurb`;
print( $cv[0] +” “+ $cv[1] +” “+ $cv[2]  + ” | “);

$i3 = $u_inc * ($k+1);

$cv2 = `pointOnSurface -u $i3 -v $k2 -position $nurb`;
print( $cv2[0] +” “+ $cv2[1] +” “+ $cv2[2] +”\n”);

curve -d 1 -p $cv[0] $cv[1] $cv[2] -p $cv2[0] $cv2[1] $cv2[2] -k 0 -k 1;

// print CV

//$x[$k] = $cv[0];
//$y[$k] = $cv[1];
//$z[$k] = $cv[2];

}

//$curveName[$i] = `curve -p $x[0] $y[0] $z[0] -p $x[1] $y[1] $z[1] -p $x[2] $y[2] $z[2] -p $x[3] $y[3] $z[3] -p $x[4] $y[4] $z[4] -p $x[5] $y[5] $z[5] -p $x[6] $y[6] $z[6] -p $x[7] $y[7] $z[7]`;
}
}

Jun
13

Seoul Golmok


photo by Yann Arthus-Bertrand

I’ve been back in Korea for about a week now looking for new things to do. This photo has caught my attention and now I have a new world to explore in my home land. I have no idea where these old streets of Seoul will take me to. But, these are some extremly complex spaces created over a long period of time for living. It’s incredible… Unfortunately, most of them are being replaced with tall apartment buildings. I’m looking to see if there are any possibilities of renting a room in these areas.

 

Jun
09

Polyline Network Surface

poly network surface

This is a handy script for those that use NetworkSrf extensively. NetworkSrf is probably one of the coolest things that Rhino offers for nurbs modelling. Just make some polylines in a way that has U/V organization and hit the script.

Option Explicit
‘Script written by Howard Jiho Kim
‘Script version Monday, March 10, 2008 12:46:21 PM

Call Main()
Sub Main()

Dim strObject, strObject2, arrObjects
Dim netCrv(100)
Dim i
Dim arrNew
i=0

arrObjects = Rhino.GetObjects(“Pick some curves”, 4)

If IsArray(arrObjects) Then

For Each strObject In arrObjects

If Rhino.IsPolyline(strObject) Then
netCrv(i) = SubDividePolyline(strObject)
Print netCrv(i)
Rhino.SelectObject netCrv(i)
i=i+1
End If

Next

End If

Rhino.Command(“NetworkSrf”)

End Sub

Function SubDividePolyline(strObject)
Dim arrV
arrV = Rhino.PolylineVertices(strObject)
Dim arrSubD() : ReDim arrSubD(2 * UBound(arrV))
Dim i

For i=0 To UBound(arrV)-1

arrSubD(i*2) = arrV(i)
arrSubD(i*2+1) = Array( (arrV(i)(0) + arrV(i+1)(0))/ 2.0, _
(arrV(i)(1) + arrV(i+1)(1))/ 2.0, _
(arrV(i)(2) + arrV(i+1)(2))/ 2.0)
Next

arrSubD(UBound(arrSubD)) = arrV(UBound(arrV))
SubDividePolyline = Rhino.AddCurve(arrSubD)

End Function

Jun
05

Trancoso Bus Terminal

Sorry for the late update and also for not replying to some e-mails/comments. I’ll get to them soon. Also I’m not sure why, but my blog was blocked by the Chinese government for a while. I couldn’t access it from China. Now I’m back in Korea, so it’s all good.. but anyways-

We’ve been working on a few different projects lately. This one is a bus terminal in Trancoso, Portugal. Y’s first design. The physical model came out quite nicely. It was a huge chunk of plexi glass that was milled out of a CNC machine based on a nurbs-model built in Rhino and Maya.

We also finished a competition recently for which we are now waiting to hear some results. I will post some images of the competition in the near future.

Trancoso Bus Terminal
Trancoso Bus Terminal
physical model

Trancoso Bus Terminal
night render

 

 Some earlier images from the form finding process

Trancoso Bus Terminal

Trancoso Bus Terminal

Milling process

Trancoso Bus Terminal
maya sub-d model of the base brought into rhino for final check-up. the entire base was made of transparent acrylic. red/green indicates which parts to be frosted.

Trancoso Bus Terminal
iges model brought into a program before the information was sent to the machine

Trancoso Bus Terminal
the machine working hard

Trancoso Bus Terminal
crazy milling factory

Trancoso Bus Terminal
before the paint job

Trancoso Bus Terminal
the final look

and lastly, here’s a render of the space underneath the roofTrancoso Bus Terminal

Mar
24

Array/Orient Objects based on Two Surfaces

I’ve been trying to explore more with Rhino Explicit History and also with RhinoScript. Here’s a simple one that arrays basic object onto a surface and orients them to a target surface. It doesn’t deform the base object in any ways. It could be a useful tool in trying to create gradient patterns using just rotations without changing the shape of the basic components (so the fabrication process is more efficient). RhinoScript is still quite new to me. I started with the Honeycomb script that Andrew Kudless wrote few years ago. The code still needs to be more optimized and cleaned up. But, the code works nonetheless.

—-

Option Explicit
‘by Andrew Kudless | andrew@materialsystems.org | april, 2005
‘Edited by Howard Jiho Kim | kimjiho@gmail.com | March, 2008

Sub OrientObjTwoSurfaces()

Dim orientObj
Dim orientPoint(2)

Dim sourceSurf, sourceSurf2
Dim uDiv, vDiv, maxDiv
Dim uArray, vArray
Dim i,j, index

‘surface 1 variables
Dim uMax, vMax
Dim uInc, vInc
Dim uStart, vStart

‘surface 2 variables
Dim u2Max, v2Max
Dim u2Inc, v2Inc
Dim u2Start, v2Start

‘surface points variables
Dim arrParam(1), arr2Param(1), arrPoint, arr2Point
Dim surface1Points(), surface2Points()

‘Rhino.EnableRedraw vbFalse

orientObj = Rhino.GetObject (“Select the Object to Orient”)
If IsNull(orientObj) Then Exit Sub

orientPoint(0) = Rhino.GetPoint(“Select Point 1 to Orient”)
If IsNull(orientPoint(0)) Then Exit Sub
orientPoint(1) = Rhino.GetPoint(“Select Point 2 to Orient”)
If IsNull(orientPoint(1)) Then Exit Sub
orientPoint(2) = Rhino.GetPoint(“Select Point 3 to Orient”)
If IsNull(orientPoint(2)) Then Exit Sub

uDiv = Rhino.GetInteger (“Enter the number of divisions in the U direction”)
If IsNull(uDiv) Then Exit Sub

vDiv = Rhino.GetInteger (“Enter the number of divisions in the V direction”)
If IsNull(vDiv) Then Exit Sub

‘Get inputs
sourceSurf = Rhino.GetObject (“Select the base Surface”, 8)
If IsNull(sourceSurf) Then Exit Sub

‘Get inputs
sourceSurf2 = Rhino.GetObject (“Select a target Surface”, 8)
If IsNull(sourceSurf2) Then Exit Sub

ReDim uVal(uDiv)
ReDim vVal(vDiv)

ReDim u2Val(uDiv)
ReDim v2Val(vDiv)

uMax = Rhino.SurfaceDomain (sourceSurf, 0)
vMax = Rhino.SurfaceDomain (sourceSurf, 1)

uInc = uMax(1)/uDiv
vInc = vMax(1)/vDiv

For i = 0 To uDiv
uVal(i) = i * uInc
Rhino.Print “uVal(” & i & “):” & uVal(i)

Next

For i = 0 To vDiv
vVal(i) = i * vInc
Rhino.Print “vVal(” & i & “):” & vVal(i)
Next

u2Max = Rhino.SurfaceDomain (sourceSurf2, 0)
v2Max = Rhino.SurfaceDomain (sourceSurf2, 1)

u2Inc = u2Max(1)/uDiv
v2Inc = v2Max(1)/vDiv

For i = 0 To uDiv
u2Val(i) = i * u2Inc
Rhino.Print “u2Val(” & i & “):” & u2Val(i)
Next

For i = 0 To vDiv
v2Val(i) = i * v2Inc
Rhino.Print “v2Val(” & i & “):” & v2Val(i)
Next

Rhino.Print “Calculating Array…”

‘Find which direction has more points
If uDiv >= vDiv Then
maxDiv = uDiv
Else
maxDiv = vDiv
End If

‘ARRAY POINS on SURFACE1
Dim targetPoint(2)
Dim p1, arrVector, NewLine, NewLine2, line1, line2, line3, arrXform
Dim arrPlane, arrRotated

For i=0 To uDiv

For j=0 To vDiv
arrParam(0) = uVal(i)
arrParam(1) = vVal(j)
arrPoint = Rhino.EvaluateSurface(sourceSurf, arrParam)
line1 = Rhino.AddPoint(arrPoint)
targetPoint(0) = Rhino.PointCoordinates(line1)

arr2Param(0) = uVal(i)
arr2Param(1) = vVal(j)
arr2Point = Rhino.EvaluateSurface(sourceSurf2, arr2Param)
line2 = Rhino.AddPoint(arr2Point)
targetPoint(2) = Rhino.PointCoordinates(line2)

NewLine = Rhino.AddLine (arrPoint, arr2Point)

arrVector = Rhino.VectorCreate(arr2Point, arrPoint)
Rhino.ViewCPlane , Rhino.PlaneFromNormal(arrPoint, arrVector)

arrPlane = ViewCPlane
arrRotated = RotatePlane(arrPlane, 90, arrPlane(1))
Rhino.ViewCPlane , arrRotated

arrPlane = ViewCPlane

NewLine2 = Rhino.RotateObject(NewLine, arrPlane(0), 90.0, ,True)

arrPoint = Rhino.CurveEndPoint(NewLine2)
line3 = Rhino.AddPoint(arrPoint)
targetPoint(1) = Rhino.PointCoordinates(line3)

If IsArray(orientPoint) Then
If IsArray(targetPoint) Then
Rhino.OrientObject orientObj, orientPoint, targetPoint, 1
End If
End If

Rhino.DeleteObject (line1)
Rhino.DeleteObject (line2)
Rhino.DeleteObject (line3)
‘Rhino.DeleteObject (NewLine)
Rhino.DeleteObject (NewLine2)

Next
Next

‘Rhino.EnableRedraw vbTrue
End Sub

OrientObjTwoSurfaces
Rhino.Print “Array Complete”