Matrix Cube Lamp Shade
A 3D printed lamp shade in the shape of cube and has interesting surfaces. This Instructable will document the process (and mostly the struggles) in creating the lamp shade.
Supplies
- Rhino
- Grasshopper
- Ender Pro 3
- Filament (I used nightglow blue, which is translucent)
- Puck light (I used a light with 7.5cm diameter)
- Patience
Generate Grids
Start by generating a single face of the cube with surfaces in a grid-like fashion in Grasshopper. I chose to do a 5x5 grid. Alongside each grid, generate an extrusion vector with a random height in the z-direction. By feeding the set of surfaces and the set of vectors into an extrusion component, we have one face of the cube.
Note that I used Rhino.Geometry.NurbsSurface.CreateFromCorners() to generate the surfaces. The 4 argument points need to be in either clockwise or counterclockwise order. Otherwise, we can get weird rhombuses instead of square grids.
Duplicating the Geometry
By creating a loop with an offset in the x-direction, we generated the 4 other faces not including the base/bottom face.
Doing a test slice in Cura for one face seems pretty good.
Trimming Miter's Corners With Planes
Since we want the different faces of the cube to be glued together eventually, we want to add miter's corners so that there are nice, flat surfaces between 2 faces for them to intersect. I tried to add planes in Rhino manually to accomplish this.
As we can see from the resulting miter's corner, manually placed planes didn't produce clean corners from trimming.
Caution With Trimming
There are 2 issues I ran into while attempting to trim. Trimming a single prism out of the face will leave a gap in the geometry. This can be resolved by applying Solid --> Cap Planar Holes. However, you have to cap the planar hole on one side of a prism first before trimming the adjacent edge. Capping doesn't work when the hole involves 2 connecting surfaces in order to cap.
Generating Trimming Planes With Grasshopper
Since I couldn't get the planes accurately positioned for clean miter's corners, I turned to generating them with code instead.
The result was very clean corners.
Good corners.
(Edit: just discovered that you can use the chamfer feature instead)
Issues With BooleanUnion
I figured it would be convenient for trimming if I can booleanUnion an entire face so that instead of trimming 5 (grid) x 5 (grid) x 5 (face) surfaces, I'll then only need to trim 4 (edge) x 5 (face) surfaces. However, booleanUnion failed due to "non-manifold geometries."
?
What are non-manifold geometries?? According to McNeel's documentation, non-manifold edges are "Edges of polysurfaces or meshes that have more than two faces joined to a single edge are non-manifold." Well, that would make sense because my model is full of non-manifold edges when all the prisms are non-manifold with their neighbors.
For a brief moment, I thought nonmanifoldMerge was the solution.
But it's not.
It doesn't really have real application values in solving the non-manifold problem. In fact, if we apply nonmanifoldMerge to a face and then export the stl into Cura, we get cool hovering surfaces from the slicer.
Test Print
To see if non-manifold edges really would cause a problem, I decided to try a test print of one of the faces. It also allowed me to see whether the thickness of each face lets a proper amount of light through.
Even though the entire geometry is not unioned, Cura was happy with slicing it as one object. The print result was pretty decent.
Light Test
Testing it above the puck light yielded a pretty good result. Since I was using nightglow filaments which are inherently translucent, the wall can be thicker and it'd still let sufficient light through.
Adding Connector Prongs
The design of the lamp shade is that the 5 faces will be glued together to form a lid that caps the base to form a cube. In order for this lid to not shift in the 2D directions yet remains easily detachable from the base, we need some connectors between the base and the walls.
I generated the slots on the faces in Grasshopper with a smaller tolerance and applied them to the prisms with BooleanDifference. The prongs on the base are applied with BooleanUnion.
Note that the miter's corners on the base slants the opposite direction from the other faces. This is because the top view of the other faces are technically the outer faces of the cube, while the top view of the base will be inside the cube.
Downloads
Test Print to Test Tolerance
Used BooleanIntersection to cut out a quadrant of the base and lower parts of 2 walls for testing.
The result: connector prongs have good tolerance and miter's corners meet.
Printing and Reprinting
All 6 faces of the cube need to be printed individually. Unfortunately, I was experiencing warping issues with the base and the top face so had to reprint those. Otherwise the different faces probably won't align properly to be assembled.
End Result
While the process of attempting to glue the faces together with superglue was a bit painstaking, the end result turned out decently. I tried adhering a pair of walls to each other first while setting them up against the base. Then, I glued a third wall to the pair to form a U-shape. This allowed me to apply glue to 2 walls at the same time to attach the last wall. Lastly, the top face was glued to the walls. To enhance the sturdiness of the build, it might be good to reinforce the edges with a glue gun.
The use of a glow-in-the-dark material proves to be a great choice for a lamp shade. The lamp shade will absorb light from the light fixture closely while the lamp is on and then glow in the dark while all lights are off. The glow in the dark picture was taken with long exposure.
Just Playing Around
Tried placing the cube on an actual RGB shifting light bulb. The aesthetics of the structure is slightly questionable but the hue shift really presents the visual qualities of the lamp shade.