During Fab Academy I remembered the modular origami puzzle known as FIT, Five Intersecting Tetrahedra.
I made one 20 years ago, and thought it would be fun to revisit. The directions that I found from Thomas Hull were the same ones that I used back then. They are a bit like
- Construct the first tetrahedron.
- Construct the second tetrahedron linked to the first.
- ✨ (Then a miracle occurs.) ✨
- Now you have a FIT!
I tease. It's a really hard puzzle to describe with words and 2D diagrams. Michał Kosmulski's FIT directions add some helpful details.
Construction
One thing that I thought would help future FIT folders is 3D diagrams of each step that can be rotated. So I made some.
You can drag to look around these models.
Step 1
Step 2
Spin this until you see something like a star of David. ✡
The corner of the red tetrahedron is poking through a "hole" of the purple one, and vice-versa, the corner of the purple tetrahedron is poking throught a "hole" of the red one.
This relationship ends up being true of every pair of tetrahedra, once finished.
Step 3
This one is key. Once you get the third one integrated correctly, the next two are easier.
Step 4
Step 5
OpenSCAD modeling
This model was created in OpenSCAD, one of the CAD packages that I didn't evaluate last week.
Here's the code. This was made with help from Claude 3.5 Sonnet via Zed, and took a lot of back and forth to get right. My original prompt had "then subtract the original shape" instead of "then subtract it from the original shape" which would have been more correct. Later it took several back-and-forths to convince it that the inner shape should be subtracted from the outer shape. OpenSCAD can output images from a CLI. I wonder if an agentic workflow with more iterations could have helped it. At least a few of the iterations I only copied an error message, and it usually could fix it based on that. At I high level, I was playing manager suggesting things to try, and it was the junior programmer making mistakes, but quickly. I did need to find a few of the key fixes on my own.
OpenSCAD code to draw Five Intersecting Tetrahedra
/*
fit.scad
FIT: Five Intersecting Tetrahedra
https://www.forresto.com/2020s/fit.html
Copyright © 2025 Forrest O. Interactive
Licensed under CC BY 4.0 https://creativecommons.org/licenses/by/4.0/
*/
module hollow_poly(shape_vertices, shape_faces, face_shrink=0.8, hole_grow = 1.05) {
// Function to find center of a face
function face_center(vertices, face) =
let(
points = [for(i = face) vertices[i]],
x = [for(p = points) p[0]],
y = [for(p = points) p[1]],
z = [for(p = points) p[2]]
)
[(x[0] + x[1] + x[2])/len(face),
(y[0] + y[1] + y[2])/len(face),
(z[0] + z[1] + z[2])/len(face)];
// Function to shrink a face towards its center
function shrink_face(vertices, face, shrink_factor) =
let(
center = face_center(vertices, face)
)
[for(idx = face)
let(
point = vertices[idx],
vector = point - center
)
center + vector * shrink_factor
];
// Collect all shrunk faces into a single vertex list
shrunk_vertices = [
for(face = shape_faces)
let(shrunk = shrink_face(shape_vertices, face, face_shrink))
for(v = shrunk) v
];
difference () {
// polyhedron by itself isn't "water-tight" for difference o_O
hull() {
polyhedron(points=shape_vertices, faces=shape_faces);
}
scale(hole_grow)
hull() {
polyhedron(
points=shrunk_vertices,
faces=[
for(i=[0:len(shrunk_vertices)/3-1])
[i*3, i*3+1, i*3+2]
]
);
}
}
}
// Tetrahedron basic def via https://github.com/benjamin-edward-morgan/openscad-polyhedra
tetrahedron_vertices = [[1,1,1],[1,-1,-1],[-1,1,-1],[-1,-1,1]]/sqrt(8);
tetrahedron_faces = [[0,1,2],[0,2,3],[0,3,1],[1,3,2]];
colors = ["Red", "Blue", "Green", "Yellow", "Purple"];
// The arcsin(1/3) angle properly aligns the tetrahedron with respect to icosahedral symmetry
initial_rot = [0, 31.717, 0]; // arcsin(1/3) ≈ 31.717°
for(i = [0:4]) {
color(colors[i])
rotate([0, 0, i * 360/5])
rotate(initial_rot)
hollow_poly(tetrahedron_vertices, tetrahedron_faces, face_shrink=2/3);
}
One OpenSCAD gotcha took a while to figure out. The tetrahedron defined by
tetrahedron_vertices = [[1,1,1],[1,-1,-1],[-1,1,-1],[-1,-1,1]]/sqrt(8);
tetrahedron_faces = [[0,1,2],[0,2,3],[0,3,1],[1,3,2]];
polyhedron(points=shape_vertices, faces=shape_faces);
does not work as the base shape in the difference
boolean. I had to wrap it with hull
to repair something invisible.
Blender exporting
I then exported STL from OpenSCAD, imported that into Blender, split the object into five objects, added color materials, and exported the five steps as GLB files. 😅
The colors were chosen from Steph Ango's Flexoki color scheme.
For another parametric model, see Kukan Kogei's effort with Blender Sverchok.
Conclusion, files
- fit-forresto-2025.scad – OpenSCAD file
- fit-forresto-2025.blend – Blender file
I'm happy to have my own fit.html
post on the WWW. Maybe I'll find it in 20 years when I think about folding a FIT again.