Cris
Cris
www.studiofathom.com
www.fequalsf.com
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Contents
1. Abstract
2. Terminology
a. Key words
b. Anotomy of a lattice
3. Overview of tools
a. Voxelize
1. Voxelize
2. Morph Between Surfaces
3. Voxel Morph Value
4. Voxel Morph Attractor
5. Mesh Offset
6. Mesh Offset Value
7. Mesh Offset Attractor
8. Surface Offset Value
9. Surface Offset Attractor
b. Populate
1. Cell Type
2. Cell Selector
3. Cell Fill
4. Cell Shell Fill
5. Tween Cell Fill
6. Cell Morph Value
7. Cell Morph Attractor
8. Voronoi Fill
c. Clean Up
1. Trim Lattice
2. Trim Shell
3. Remove Floating
4. Remove Short
5. Remove by Valence
6. Remove Duplicate Curves
d. Modify
1. Lattice Connections
2. Morph Lattice to Skin
3. Morph Shell to Skin
e. Thicken
1. Lattice Thickness Value
2. Lattice Thickness Attractor
3. Shell Thickness Value
4. Shell Thickness Attractor
4. Examples
a. Uniform Beams
b. Uniform Shells
c. Conformal Shells
d. Confroma Beams
Abstract
Crystallon is an open source project for creating lattice structures using Rhino and Grasshopper3D. It was
developed at FATHOM (www.studiofathom.com) by Aaron Porterfield (www.fequalsf.com) as an alternative to
commercially available software for lattice design. The obvious advantage is the ability to generate lattice
structures within Rhino’s design environment without exporting to 3rd party software, but the extended
advantages include the modularity and ability to combine other powerful tools available for Grasshopper3D. The
decision to release it as open source was not only to share it with the community, but to further the development
through it’s users. We realize not all users will have the same applications and needs, so we hope to receive
feedback and improvements from users with unique case studies. Each tool is left as a cluster which can be
opened and modified at will, in the spirit of open source. We hope the community will continue to develop and
contribute through the use of the Grasshopper forums and Github.
V1.0 -- This is the first initial release and we will begin bug fixes immediately as they are reported. Future plans
are to include utilities for import and export between more robust simulation software packages which will be
included in the next release. Enjoy :)
Key Words
Voxel
noun
Unit Cell
noun
Lattice
noun
Unit Cells
Node Vertice
Beam Face
Voxels
Lattice Skin
Solid Skin
Lattice
Overview of Tools
Voxelize
This group of tools is for generating and and modifying the set of
voxels which will be used to populate with unit cells to create a lattice
structure.
Voxelize
Description:
Inputs:
Fill Completely (FC) - [boolean] - If true, Voxels will fill entire volume. If false, only Voxels
with their centroid within the volume will be kept.
Outputs:
Description:
Conformal fill of voxels between two or more surfaces. Creates equal divisions between
any number of surfaces with voxels lofted between them.
Inputs:
Outputs:
Description:
Inputs:
Distance Influence (DI) - [boolean] - If true the distance between the points
and voxels will affect the magnitude
Outputs:
Description:
Inputs:
Outputs:
Description:
Offset mesh triangles into voxels. This subdivides a trangulated mesh so that each
triangle becomes (3) 4-sided polygons, then offsets each point normal to the mesh
surface to create a voxel on the surface.
Inputs:
Outputs:
Quad Mesh (M) - [mesh] - Quad mesh generated from the input mesh
Offset Quad Mesh (M) - [mesh] - Offset quad mesh generated from the input mesh
Mesh Offset Value
Description:
Offset mesh triangles into voxels with a point cloud and corrosponding
values.
Inputs:
Distance Influence (DI) - [boolean] - If true the distance between the points
and voxels will affect the magnitude
Outputs:
Quad Mesh (M) - [mesh] - Quad mesh generated from the input mesh
Offset Quad Mesh (M) - [mesh] - Offset quad mesh generated from the input
mesh
Mesh Offset Attractor
Description:
Inputs:
Lower Limit (Li) - [number] - Smoothing of the surface closest to the attractor
Outputs:
Quad Mesh (M) - [mesh] - Quad mesh generated from the input mesh
Offset Quad Mesh (M) - [mesh] - Offset quad mesh generated from the input
mesh
Surface Offset Value
Description:
Inputs:
Distance Influence (DI) - [boolean] - If true the distance between the points and
voxels will affect the magnitude
Outputs:
Description:
Inputs:
Lower Limit (Li) - [number] - Smoothing of the surface closest to the attractor
Outputs:
This group of tools is for populating voxels with specific unit cells
(beams or shells) or an entire volume with a voronoi (stochastic)
lattice.
Cell Type
Description:
Preset unit cells. There are currently 21 preset unit cells to choose from. 6 are shell
unit cells (3 open and 3 closed cell) and 2 examples of ‘tween’ cells that can morph
between each other.
Inputs:
Outputs:
Unit Cell (U) - [curves / mesh] - Single unit cell to populate voxels
Cell Selector
Description:
Outputs:
Description:
Fill voxels with unit cells. Use the Unit Cell Selector and Cell Type to choose from preset
cells or create your own (as long as it has cubic symmetry).
Inputs:
Unit Cell (U) - [curves / mesh] - Single unit cell to populate voxels
Outputs:
Description:
Fill voxels with shell unit cells. Use the Unit Cell Selector and Cell Type to choose
from preset cells or create your own (as long as it has cubic symmetry).
Inputs:
Unit Cell (shell) (U(s)) - [mesh] - Single unit cell to populate voxels
Outputs:
Lattice (shell) (L(s)) - [mesh] - Joined mesh that makes up the lattice
Tween Cell Fill
Description:
Fill voxels with morphed unit cells. Use one of the ‘Cell Morph’ tools to create values for
each voxel then use two ‘tween’ type unit cells to morph betwen. Values range from 0
(unit cell 1) to 1 (unit cell 2).
Inputs:
Values (Va) - [number] - List of values from 0-1 (flattened) corresponding to each voxel
Outputs:
Description:
Inputs:
Distance Influence (DI) - [boolean] - If true the distance between the points and voxels
will affect the magnitude
Outputs:
Values (Va) - [number] - List of values from 0-1 corresponding to each voxel
Cell Morph Attractor
Description:
Inputs:
Outputs:
Values (Va) - [number] - List of values from 0-1 corresponding to each voxel
Voronoi Fill
Description:
Fill a volume with randomized voronoi cells. Use attractors to vary the density.
Inputs:
Number of points (N) - [number] - The initial number of random points to fill the volume
Use Attractor (UA) - [boolean] - If true, points will be filtered by distance to attractor(s)
Enable Voronoi (EV) - [boolean] - If true, voronoi cells will be generated (can be very
slow)
Outputs:
Voronoi Lattice (L) - [curves] - List of curves that make up the voronoi lattice
Voronoi Lattice Skin (L) - [curves] - List of curves that make up the voronoi skin
Preview Points (P) - [points] - Preview of points that will make up the voronoi lattice
Clean Up
Description:
Trim lattice with a closed volume (mesh or brep). This will trim the lattice curves to within
the boundary of a closed volume.
Inputs:
Geometry (G) - [brep / mesh] - Geometry to trim with (closed brep or mesh)
Outputs:
Trimmed Lattice (L) - [curves] - Lattice curves that have been trimmed
Untrimmed Lattice (L) - [curves] - Lattice curves that have not been trimmed (Typically
removes curves with valence 1)
Trim Shell
Description:
Trim shell lattice with a closed volume (mesh or brep). This will trim a shell by
removing the mesh vertices that are outside of the boundary of a closed mesh or
brep. Subdividing the mesh of the shell to add more vertices before trimming will
make a more accurate trim but will take longer.
Inputs:
Geometry (G) - [brep / mesh] - Geometry to trim with (closed brep or mesh)
Outputs:
Description:
Remove disconnected curves. This will remove curves that have no connections to other
curves. To reduce time, use this tool on only the ‘Trimmed Lattice’ output of the Trim
Lattice tool.
Inputs:
Outputs:
Description:
Remove curves by length. To reduce time, use this tool on only the ‘Trimmed Lattice’
output of the Trim Lattice tool.
Inputs:
Outputs:
Description:
Remove curves by number of connections (this can be very slow). If only removing
valence 1, the ‘Untrimmed Lattice’ output of Trim Lattice will have the same result.
Inputs:
Valence Number (N) - [number] - Minimum number of connections each curve has
Outputs:
Description:
Remove curves that share the same midpoint. This is a simple and fast method of
removing duplicates by searching for common midpoints rather than common endpoints.
Since all lattice curves should connect end-to-end, none should have common midpoints
unless they are duplicates.
Inputs:
Outputs:
Description:
Inputs:
Outputs:
Description:
Connect two adjascent lattices by adding struts between the closest nodes.
Inputs:
Number of Connections (N) - [number] - Number of connections to make from each node
Outputs:
Description:
Morph lattice to connect to skin. This will move the nodes of the lattice within a set
distance from the skin to the nearest node of the skin.
Inputs:
Geometry (G) - [geometry] - Geometry to morph to (usually the geometry (mesh or brep)
that makes the skin)
Geometry (G) - [geometry] - Geometry to morph to (usually the nodes or vertices of the
skin)
Outputs:
Description:
Morph shell to connect to skin. This will move vertices of the mesh shell within a
set distance from the skin to the closest point on the skin. Subdividing the mesh of
the shell to add more vertices will have a smoother result but will take longer.
Inputs:
Outputs:
Description:
Inputs:
Distance Influence (DI) - [boolean] - If true the distance between the points
and voxels will affect the magnitude
Outputs:
Description:
Apply thickness values to lattice curves with attractor(s). The output will be
one value for each curve.
Inputs:
Outputs:
Description:
Apply thickness values to shell vertices with a point cloud and corrosponding
values. The output will be one value for each vertice of the mesh (useful for
Weaverbird’s ‘Mesh Thicken’ tool).
Inputs:
Distance Influence (DI) - [boolean] - If true the distance between the points
and voxels will affect the magnitude
Outputs:
Description:
Apply thickness values to shell vertices with attractor(s). The output will be
one value for each vertice of the mesh (useful for Weaverbird’s ‘Mesh
Thicken’ tool).
Inputs:
Outputs:
The included examples are just a few demonstrations of particular applications, using different modeling
approaches. They also incorporate other powerful plugins available for Grasshopper. To use the full example,
please consider installing the latest versions available:
“Kangaroo is a Live Physics engine for interactive simulation, form-finding, optimization and constraint solving.”
“Weaverbird is a topological modeler that contains many of the known subdivision and transformation operators,
readily usable by designers. Instead of doing the work repeatedly, or sometimes using complicated scripts, this
plug-in reconstructs the shape, subdivides any mesh, even made by polylines, and helps preparing for
fabrication.”
“Millipede is a structural analysis and optimization component for grasshopper. It allows for very fast linear elastic
analysis of frame and shell elements in 3d, 2d plate elements for in plane forces, and 3d volumetric elements. All
systems can be optimized using built in topology optimization methods and have their results extracted and
visualized in a variety of ways.”
“Cocoon is a fairly straightforward implementation of the Marching Cubes algorithm for turning iso-surfaces into
polygonal meshes.”
“Karamba is an interactive, parametric finite element program. It lets you analyze the response of 3-dimensional
beam and shell structures under arbitrary loads.”
“Octopus is a plug-in for applying evolutionary principles to parametric design and problem solving. It allows the
search for many goals at once, producing a range of optimized trade-off solutions between the extremes of each
goal.”
Uniform Beams
This example uses the GrabCad GE Bracket Challenge as a design space for a uniform beam-based lattice. The
design space is filled with uniform voxels using the ‘Voxelize’ component. The voxels are filled with the ‘BC’ unit
cell and trimmed to the original design space, keeping only the untrimmed beams. A lattice skin is created with
one of two methods: Rhino’s meshing algorithm or Kangaroo’s ‘Meshmachine’ component. The internal lattice is
then connected to the lattice skin using the ‘Morph Lattice to Skin’ component.
The combined internal lattice and lattice skin are simulated and optimized using Millipede. Using the optimization
data, the lattice is simulated again with varying beam thickness to validate the design.
This example uses the GrabCad GE Bracket Challenge as a design space for a uniform shell-based lattice. The
design space is filled with uniform voxels using the ‘Voxelize’ component. The voxels are filled with the ‘Gyroid’
unit cell and trimmed to the original design space.
The gyroid shell is simulated and optimized using Millipede. Using the optimization data, the lattice is simulated
again with varying shell thickness to validate the design.
The final mesh is created using one of two methods: either Cocoon or the ‘Shell Thickness Value’ component and
Weaverbird’s ‘Mesh Thicken’ component.
This example uses a bent cylindrical shape to demonstrate how to design a reinforcing structure for objects under
pressure. The intial shape is meshed using Kangaroo’s ‘Meshmachine’ component to create a uniform
traingulated mesh which is then simulated with 90psi internal pressure. The resulting deflection data is used to
inform two different approaches.
One method uses the ‘Offset Surface Value’ to create an offset surface based on deflection data. Voxels are
created between the offset surface and the original using the ‘Morph Between Surfaces’ component. The ‘Cubic
Center’ unit cell creates a diagrid fin structure on the surface which reduced overall stress on the surface by 47%.
The other method uses the ‘Mesh Offset’ component to create voxels on the surface which vary in height based
on deflection. The fins are created using the ‘Cubic Face’ unit cell which reduced overall stress by 62%.
This example creates a shoe insert with varying flexibility based on a pressure map image of a foot. The form of a
shoe last is used to create two surfaces to morph voxels between. Then an ‘Image Sampler’ component of the
pressure map is used to manipulate the ‘Cell Morph Value’ component. Custom unit cells are populated using the
‘Tween Cell Fill’ component. The lattice is then trimmed to the shape of the insole and cleaned up. It is modified to
connect to two mesh surfaces, the ‘solid skin’. using the ‘Morph Lattice to Skin’ component. The lattice and solid
skin are simulated together with forces based on the pressure map image.