Infinite Puzzle
For my project I was inspired by this infinite puzzle. The overall concept is that if you “grow” the piece shapes on a 3D surface, then they will be able to tile infinitely because the puzzle has no edges. This means that pieces can always be moved from one edge of the puzzle to another, allowing you to fiddle with the puzzle infinitely.
Personally, my issue with puzzles has always been the fact that you either have a toy you can play with or a nice image, but while you’re playing you just have random pieces and once you’re done there's a reluctance to take apart the puzzle and actually use it anymore. The infinite puzzle, which has no boundaries and can be re-tiled in thousands of ways, is a perfect solution to this! You can have a completed image and still move the pieces around without losing it :)
I also structured the entire generator as a tool, so whether you wanted to generate a 100 piece puzzle or a 1000 piece puzzle you could!
Below I will walk through my process for generating the puzzle piece shapes in Houdini.
Because the original mesh was grown in 3D, I thought it would be really cool to have the answer key picture which is typically included on a puzzle box actually run continuously over the surface of the entire box.
On the right are pictures of the box which I laser engraved using the “unwrapped” puzzle to make a 3D answer key!
Unfortunately the way I set up the joinery for the box pieces kind of obscures the edges so some of the effect is lost, but I still think it turned out pretty cool. I love how the clear acrylic lets you see the puzzle pieces from the outside.
Piece Shape Generation
First, I take an input geometry and scatter points onto its surface. The geometry is then fractured into pieces based on the points. This makes it easy to change how many pieces are in the puzzle by just changing the number of points.
On the right are two different input mesh fractured with piece boundaries based on scattered points.
Then, I use a differential line growth algorithm to grow the shapes of the pieces. Essentially, I repeatedly “relaxes” points on each line so they try to push away from each other, causing a wiggly pattern to form. Here is a more in depth explanation of differential line growth in case you’re curious!
I set up my tool so you can set how long you want to let the lines grow to pick a shape that looks fun. I also made it possible to control other visual attributes of the pattern, like how smooth the growth is, the overall scale of the growth, etc.
This made it possible to achieve many different looks, and I played around until I created one that I thought was both visually appealing and would be enjoyable to solve (specifically I prioritized preserving uniqueness of piece shapes and making sure there would be enough interlocking pieces that the puzzle wouldn’t be frustrating to keep together).
To the right is a recording of the differential line growth of puzzle pieces on a sphere.
Piece Shape Unwrapping (attempt 1)
At first, I tried to unwrap the 3D pieces using node usually used for UV unwrapping. It let me project each piece onto a a best fit plane. This gave me the resulting curves on the right.
It turns out, because each piece “selfishly” picks a best fit plane to be unwrapped onto, they end up warping just enough to make some pieces not fit (about 1 in 50).
That issue alone could be solved with some sanding of the physical pieces that didn’t fit, but the overall fit of the pieces was not super tight and clean, which I thought made the puzzle much less satisfying to solve.
I thought perhaps I could try to remedy the warping by solving the puzzle digitally and then correcting the fit by manually adjusting curves in Rhino. I solved a 100 piece puzzle in Rhino (a massive pain and a dumb idea to begin with tbh).
While doing so I realized that there were more macro level “seams” from the unwrapping (see picture on right). These were beyond the small inconsistencies between matching piece edges, and clearly not resolvable by manually tweaking pieces in Rhino.
I thought maybe increasing the piece count to 200 would make the seams less noticeable, which was wrong and very regrettable. I don’t recommend solving 200 piece puzzles in Rhino its not fun :(
The one fortunate discovery from this was I found the puzzle (which was very difficult with a black and white texture) was super fun to solve with the rainbow gradient because the difficulty was just right. This discovery was timed perfectly because I had just spent two days attempted to raster etch a black and white pattern (with very little success), so I shifted my plans to instead paint on color at the end.
Piece Shape Unwrapping (attempt 2)
I finally got the unwrapping to work by starting with sphere geometry that was a smoothed cube, not a typical sphere mesh, so it had clean UVs from the start which I could use to unwrap the mesh. By using this method, I was able to ensure that adjacent pieces essentially warped together (instead of “selfishly” unwrapping to their own best fit planes), so while the puzzle got warped by unwrapping each piece still fit with its immediate neighbors, making the puzzle solvable.
Normal sphere
Smoothed cube sphere
Clean unwrapping of smooth cube
By growing my pieces and then transferring the UV attribute of the starting sphere onto the final pieces, I was able to get the pieces laid out (image on the left). I finally had pieces that were actually next to each other in the flat view, which guaranteed to me that they would fit together well. I used this exact texture to guide the raster etching on my box (so that the box would be like an answer key to the puzzle, like you have on normal puzzle boxes but in 3D). However, the edge pieces got sliced by this process. Using some code I copied the lines around to get the following to reconstruct the edge pieces (image on the right), and manually deleted the extra lines.
Continuous Piece Coloring
I had a lot of trouble cutting my pieces in early stages of the process, but once I finally got the pieces laid out in an assembled way, laser cutting them wasn’t too difficult. I laser cut them out of birch plywood and before getting them out of the laser cutter I used tape to keep them assembled.
The main challenge of the fabrication was figuring out how to color the pieces. As discussed in the unwrapping section, I decided I wanted to paint a colorful gradient onto the puzzle. I did this by taking paint markers and then using paper towels to smudge the paint while wet to create a gradient. The main challenge for this was making sure the edges tiled correctly despite the fact that I was adding color after the mesh was unwrapped. First, I generated a guide in houdini to help me figure out where to put the colors.
Continuously colored 3d sphere
Corresponding 2d guide for puzzle coloring
On the first test, I quickly found that just trying to copy the guide wouldn’t work because the pieces wouldn’t match up perfectly when tiled. I had planned to just move the pieces and correct them accordingly, but I realized it was nearly impossible to keep track of which pieces had been fixed.
Instead, on my final puzzle I first blocked out the color (gave me the chance to avoid nasty grays that I got in my test) and then smoothed out the gradient, being careful to only touch inner pieces (no edges). Then, I re-solved the puzzle with edges on the inside and colored the pieces. I continued to move pieces around and only coloring the sides of pieces when they were surrounded by their neighboring piece, ensuring the final piece colors would tile.
With first method pieces didn’t match when tiled
Initial color blockout
Blending colors but avoiding edges
Resolving to move old edges to inside for coloring