A 3D printer slicing algorithm that lets you print 90° overhangs without support material. I hope to turn this into a standard feature in 3D printing slicers.
This is what the algorithm looks like:
To understand how this works, you need to know 3 things:
- You can print 90° overhangs by wrapping filament around itself in concentric arcs. You may have seen the fullcontrol.xyz overhang challenge. This uses the exact same principle.
Here's what this effect looks like while printing:
- You can start an arc on an arc .
- Recursively print arcs until the space is filled. This can be used to print almost any artibtrary shape:
I've printed ridiculously large overhangs using this method:
Earlier this year, I accidentally discovered you can print an overhang that supports itself. I was just messing around with printing into thin air to see what happens. Here's the print that started it all:
Then I tried to recreate the effect on purpose
And fine tune it:
I programmed this in Python 3.
Packages used are:
- shapely 1.8.5 for many useful 2D shape and geometry tools.
- geopandas and matplotlib for plotting
- numpy for math stuff
-
Load a polygon. This program just generates a random shape as an example. Random shapes also helped me find unusual edge-cases while testing.
-
Choose an edge to start from. I arbitrarily set the program to always choose the longest edge as the starting edge (the red line).
-
Create the largest arc possible. The center of that arc must reside on the starting line. The white arc is the first arc.
-
Recursively create arcs on arcs until the next arc would be smaller than some threshold amount. Default is half of the 3D printed line width. One arc may end up branching into two or more. The 2nd arc is the orange arc, and it branches into two red arcs. The colors in the image represent the recursion depth.
-
Turn those arcs into gcode Mainly just turning coordinates into strings using string formatting.
This program also generates a demonstration tower so that it is easy to print this for yourself.
There are a few rules of thumb for actually printing this stuff:
The overhang print quality is greatly improved when the material solidifies as quickly as possible. Therefore:
-
Print as cold as possible. I used 195 degrees for PLA. You can probably go even lower. If you require higher temp for the rest of the print, I'm sure slicers could insert some temp-change gcode before and after this algorithm occurs. Might waste a lot of time though.
-
Maximize cooling. Set your fans to full blast. I don't think this technique will work too well with ABS and materials that can't use cooling fans, but I haven't tested it.
-
Print slowly. I use around 5 mm/s. Even that is too fast sometimes for the really tiny arcs, since they have almost no time to cool before the next layer begins.
This algorithm was implemented using a depth-first approach, where one branch grows as long as possible before splitting. I think it would be more reliable if done using a breadth-first approach where all the branches on a certain depth are created before moving one layer deeper. This method sounded more complicated though so I didn't do it.
By default, the output gcode should print fine on most standard desktop FDM printers running Marlin firmware and a 0.4mm nozzle. If your bed is smaller than 150x150mm you'll want to adjust some settings to make sure the print fits inside the printable area. If you have a different size nozzle, search for LINE_WIDTH
and adjust as necessary.
If you want to try the prints without installing, I added some test print gcode files in the root directory that you can directly download. They should print fine on most printers although you may need to manually adjust the gcode so that it works with your printer.
-
Clone this repo to your computer
-
Install python 3 and required packages.
python3 -m pip install -r requirements.txt
-
Check out the parameters at the top of
main.py
for print settings, and to change how the arcs are generated. -
Change the shape generation parameters to customize the shape, size, and spikiness of the random shape. Or create your own shape. It should work on any
Polygon
. -
Double check the start and end gcode will work with your printer.
-
Run the code.
-
Preview the gcode (found in the output folder) using Repetier Host
-
Print it! If you get a successful print using this algorithm, I'd love to hear about it.