# Exoskeleton (2014)

Created in collaboration with Daniel Piker, Exoskeleton is a grasshopper plug-in designed for for converting networks of connected lines into thickened, wireframe meshes. The algorithm it relies on is relatively simple, and though the outline for the strategy used here was arrived at independently by Daniel, soon after implementation it was found to have been described in detail here by Vinod Srinivasan, Esan Mandal and Ergun Akleman. The algorithm manages the intersections between multiple struts at a given node through the use of a convex hulling strategy. A convex hull is a triangulated polyhedron that operates as the minimal geometry for intersecting with or enclosing a collection of points in Euclidean Space. There are a number of algorithms available for computing the convex hull of a set of points (Exoskeleton relies on the “gift-wrapping” algorithm described here). This particular algorithm iterates through the supplied collection of points, starting with four arbitrarily in the formation of a mesh tetrahedron, and incrementally determines if a new test point falls inside the boundary space of those already captured in the hull. If the new point falls outside of the hull, then the hull algorithm first identifies all faces which can “see” the point. This refers to all faces for which the angle of vector of the point to the face center when measured against the vector of the face normal is less than or equal to 90 degrees. It removes any face that can “see” the point and then expands a collection of new triangulated faces from the newly naked edges with the new point operating as the third vertex. Once the algorithm has processed each point thus, only a minimal, convex polyhedron remains.

Exoskeleton operates by arraying around each connecting node a series of points. These points are in turn polar-arrayed at a minimum calculated offset from the centre along the normal vector of each strut that enters a node such that every point is ensured to be included in the final hulled geometry. These polar arrays along each strut within the newly created hull define polygon edges. The faces interior to these polygons are removed, and then the newly naked edges are stitched to the naked edges of a polygon of the same edge count on the other side of the strut.

Exoskeleton allows for variably dimensioned struts by tapering the size of polygons from one end of a strut to another. All nodes must first be determined by the “worst-case” offset required for generating a convex hull. So if there are any particularly acute angle going into a node, then all polygons must be offset by enough value in order for the hull to be convex and maintain connectivity along struts. Without additional operations, this makes for some really big nodes. Here, once the script has solved the convex hull – the “worst-case” scenario – it allows for struts to “shrink” toward the center into non-convex hulls based on the targeted node offset and per-strut calculations of minimum offsets. This allows for only the most acute angles in a node to have significant offsets, and all others to remain relatively tight to the node center.

Ongoing development of Exoskeleton is tied to extending its capacity from wireframes to curve-driven processes. This requires a significant transformation for how nodes are processed. With wireframe models, at each node a worst-case scenario is calculated according to angles and radii of associated struts.

In a curve-based approach, there is a non-linear process for identifying the worst-case scenario for a successful convex hull. The approach that is currently being investigated looks at each node and samples each associated curve in relation to its neighbors to establish a hulling geometry.

This polygonal geometry is then projected forward from the node center until they achieve a minimum offset for hulling. After hulling, these are then “shrunk” back along each curve through a sampling process that tests for adjacency and ensures that each node is shrunk as much as possible. Additionally, the goal for the solver is for it to identify not only direct adjacencies as in a wireframe network, but also proximity between input curves, and allow for nodes to form along these lines according to tolerances defined by users.

One consequence of this process lies in considering how multiple intersections at different thickness and tolerance should be resolved. The possibility for generating “super-nodes” exists, which allows for hulls at multiple intersections to combine according to user input and geometric constraints.