Wednesday, December 22, 2010

Surfacing With Planar Polygons

The last project in the Digital Fabrication course at U of M was to panel a surface. Out team choose planar polygons as the method. The team was myself, Bob Bradfield, Bruce Findling, and Clay Montgomery.

Here's the surface that we paneled. To get an idea of scale the gray base is 60"x24".

Here are a few photos of the resulting surface paneled in 24 gauge steel:

Each piece is a tabbed, water jet cut polygon. The under side was left to rust. The upper surface has been sanded to a bright finish:

The tabs are perforated where they meet the polygon to allow easy folding. This makes interesting patterns along the edges:

 Each polygon is spot-welded to the tabs of its neighbors.

This section discusses the technique used to generate the polygons and prepare them for fabrication. The entire process was generated using code written in RhinoScript (essentially Visual Basic for Rhino).

The first part of the algorithm is to generate a single polygon. This is accomplished one vertex at a time. The user chooses a surface to panel and enters the number of sides for the polygons. They also enter a maximum allowable deviation from the surface. That is, what is the maximum amount that the planar polygon is allowed to rise above or fall below the curved surface.
To get a vertex the code steps along a straight line on the surface and measures the distance along the way. As soon as the distance from the surface is exceeded that point is fixed.

Doing this through 360 degrees generates a planar polygon with the specified number of sides. In this case the polygon is fairly symmetric because it was chosen in an area of relatively uniform curvature. 

Next, we need to generate more polygons. This is done by projecting out from the center of the original polygon through the midpoint of each edge. The user can specify the amount as a ration of the polygon radius. From the projected point a new polygon is generated.

This is done through each edge of the source polygon. And here's the result. You can't build that!

So the code checks for intersections with other polygons. It won't generate points inside another polygon and also snaps to the edges of existing ones.

The propagation continues in this manner. Note that the polygons are also clamped to keep them relatively uniform - you can see this as some of the points lie outside of the actual polygon that was generated. 

With the points not shown the paneling looks like this:

Sample Surfaces
Here are a few sample surfaces:

Merge Panels
The next step is to merge the panels so they are pulled tightly together. The step iterates over every vertex of every polygon and compares it to the other vertices. It moves the vertex a portion of the way closer to the nearest vertex. It does this a user specified number of times. You can see that number listed in the diagram below. By the 25th iteration the polygons are merged closer together to prevent overlap and give more area for welding adjacent polygons. 

Remove Coincident and Collinear Points
The next operation is to remove extra vertices which are coincident or nearly so. Also removed are verts which are colinear or nearly so. This is done so wider tabs are generated. 

Generating Tabs
The next step is to generate the tabs on the sides of the polygon which allows them to be connected to one another. They are generated using an offset surface. 

 The surface is offset more towards the center of the span and less at the edges:

The technique starts by finding the closest point on the surface to the midpoint of each edge. The vector between the midpoint and the closest point is copied over to the corners of the edge and lengthened. These vectors are then intersected with the surface. The intersection points are shown as yellow dots below:

This is done for each edge of the polygon. The verts are connected by lines which form the bottoms of the planar tabs. However we want to make adjacent tabs match up at their corners.

To do this we calculate the intersection of each edge with the adjacent edge. Of course two lines in space do not necessarily intersect at a point. So we find the closest line segment which connects the lines and then take the midpoint of that line. Those points are shown as green dots below.

Those new corner points are then used as the ends of the tabs. Doing this introduces a very small break from planarity however it is insignificant in practice.

The resulting polygon is shown in yellow. The blue lines indicate the tabs after being rotated into a plane. This closed polygon is then used for fabrication on the water jet. 

Layout for Fabrication
The next step is to generate tabs for every polygon and project them onto the ground plane so they can be cut from the water jet. Here the polygons are shown on each tab:

 These are oriented onto the ground plane and arrayed. Here are the 158 polygons in a 10"x10" grid.

Here's a close-up look at each polygon. The tabs are a single closed polyline. The original planar polygon has been redraw as a perforated line. The water jet cuts these perforations for easier folding. 

Each polygon is group together for easier dragging inside Rhino. This makes it easy to generate the sheets for cutting on the water jet.

Finally, each polygon is numbered on the 3D model. These correspond to the numbers on the sheet to guide fabrication.
Fabrication begins by cutting sheets of 24 gauge steel on the abrasive watejet cutter. The parts are then cut from the sheets with a dremel tool and organized into piles of 10 polygons, 0-9, 10-19, etc. 

This is the first polygon generated by the code. It is nearly symmetrical because it was unaffected by intersection with other polygons and was positioned on a portion of the surface with nearly uniform curvature. 

Here's the spot welder used to attach the polygons together: 

Wooden forms were used to aide in the shaping the curvature of the span as well as where the form meets the ground.