Scanning and Printing

05-3d-scanning-printing.org-IMG_20260221_174812_1.jpg

1. Week assignments

Group assignment:

  • Test the design rules for your 3D printer(s)
  • Document your work on the group work page and reflect on your individual page what you learned about characteristics of your printer(s)

Individual assignment:

  • Design, document and 3D print an object (small, few cm3, limited by printer time) that could not be easily made subtractively
  • 3D scan an object (and optionally print it)

2. Prior Knowledge

I own a Prusa Mini+ and have printed many things. Here are a couple of photos.

05-3d-scanning-printing.org-IMG_20250412_214847.jpg
05-3d-scanning-printing.org-IMG_20250413_145759.jpg
05-3d-scanning-printing.org-IMG_20250706_184534.jpg
05-3d-scanning-printing.org-IMG_20260222_173038.jpg

3. Work!

3.1. Group work

At the lab, we (tried) printing this all-in-one test model on:

  • Prusa MK3
  • Prusa Core One
  • Creality Ender 3
  • Ultimaker 2+

We setup PrusaSlicer to have presets for the above printers and all filaments include. Having all filaments is actually very annoying because it makes selecting the right filament finicky.

05-3d-scanning-printing.org-screenshot-2026-02-25_11-48-26.png.jpg
Figure 1: Screenshot of all-in-one test in PrusaSlicer

3.1.1. Prusa MK3

Ihe MK3 looks a bit like my Prusa Mini+ at home. The control display is a bit less modern, but I can do automatic bed leveling (with a Prusa INDuction Autoleveling sensor module), so it should not be that hard to use. It uses 1.75mm filament.

05-3d-scanning-printing.org-IMG_20260219_113242.jpg
Figure 2: Control display of the MK3

Unfortunately, it was clogged. After a couple of layers, the extrusion would stall, and no more filament would come out of the nozzle. Purging the nozzle with PLA several times did not help. Henk fixed it in the evening by replacing the nozzle.

05-3d-scanning-printing.org-IMG_20260223_115843.jpg
Figure 3: Old nozzle, clogged with burned (?) filament

Henk printed the all-in-one model on this machine. Below are some photos. Note that I broke off the right side overhang to photograph the tolerance test on the right using the microscope.

05-3d-scanning-printing.org-IMG_20260223_121443.jpg
Figure 4: Overview all-in-one
05-3d-scanning-printing.org-IMG_20260223_115458.jpg
Figure 5: Tolerance ribs (microscope)

The ribs look very much the same. Looking at the model (see figure 6) these ribs should go from narrow to wider. Having a 0.40mm nozzle will probably never get us a nice gradient of ribs because they are too narrow.

05-3d-scanning-printing.org-screenshot-2026-02-23_14-18-51.png.jpg
Figure 6: Tolerance ribs in model
05-3d-scanning-printing.org-IMG_20260223_115231.jpg
Figure 7: Tolerance slits (microscope)

Interestingly, the slits to show a nice gradient. The movement on the X-Y-axis seems much more precise that 0.40mm

05-3d-scanning-printing.org-IMG_20260223_115314.jpg
Figure 8: Overhang bottom (microscope)

The result of the overhang was very stringy at to bottom and the sides. Henk sliced it for us and he changed the Nozzle temperature other layers setting to 220°C because the first prints he made had under-extrusion problems.

05-3d-scanning-printing.org-IMG_20260223_132751.jpg
Figure 9: Failed print due to extrusion problems

In the end, he fixed it by tightening the extruder idler crew, which regulates the tension between the cogs pulling in the filament.

We started another print with the value changed (back) to 215°C to see if the stringing disappeared and the extruder still functioned properly. The results had less stringing but the edge of the overhang test was still frayed.

05-3d-scanning-printing.org-IMG_20260223_143859.jpg
Figure 10: Frayed edge on second print

We tried again with Filament overrides value Retraction length set to 1mm (it is disabled by default), following a hint in an article Henk shared. Unfortunately, it had no visible effect.

05-3d-scanning-printing.org-IMG_20260223_162722.jpg
Figure 11: Side by side the last two prints (newest on the right)

3.1.2. Prusa Core One

The Prusa Core One is a very fancy-looking machine with a closed case. It takes 1.75mm filament, and we used PLA. When printing PLA in this closed case, the ventilation grid needs to be open to allow cooling.

It just worked. This seems like a very reliable machine.

05-3d-scanning-printing.org-IMG_20260219_115946.jpg
Figure 12: Prusa Core One

We printed the all-in-one model using "eco" PLA.

05-3d-scanning-printing.org-IMG_20260223_124404.jpg
Figure 13: PLA box

Here are some photos of the result.

05-3d-scanning-printing.org-IMG_20260219_130248.jpg
Figure 14: Finished print on the bed
05-3d-scanning-printing.org-IMG_20260219_150809.jpg
Figure 15: Some stringing but almost perfect overhangs
05-3d-scanning-printing.org-IMG_20260223_115241.jpg
Figure 16: Tolerance slits (microscope)
05-3d-scanning-printing.org-IMG_20260223_115532.jpg
Figure 17: Tolerance ribs (microscope)
05-3d-scanning-printing.org-IMG_20260223_115305.jpg
Figure 18: Overhang bottom (microscope)

The sagging of the lines at 80° overhang is to expected and actually something PrusaSlicer warns about.

3.1.3. Creality Ender 3

It was very finicky to level the bed on the Creality Ender 3. It does have automatic bed leveling, the build plate is too big for the bed, and is held down by clips that can be run over by the nozzle. With help and instructions from Irja, we used a piece of paper (plain printing paper) to set the nozzle distance from the build plate using the adjustment screws on the bottom of the plate. The paper should lightly grip between the nozzle and the plate.

05-3d-scanning-printing.org-IMG_20260219_124132.jpg
Figure 19: Bed leveling on the Ender 3

When the bed was finally leveled, we started the all-in-one print, but after a couple of layers, it stopped with a cryptic message on the control display about a heating failure. It seems like the temperature sensors do not work properly, and the controller panics.

3.1.4. Ultimaker 2+

The Ultimaker looks very friendly. The bed leveling process was similar to the Ender 3, using paper and screws at the bottom. A plus for this machine is that it has a nice glass build plate. It uses 2.85mm filament.

05-3d-scanning-printing.org-IMG_20260219_143044.jpg
Figure 20: Ultimaker

Our first prints failed. The nozzle would start hitting into the model after a while. It would move over the stalks on the right side and hit all of them.

After multiple bed leveling attempts, Heleen figured out (by comparing G-code from the SD card and G-code generated in her slicer) that we used the wrong setting for Filament Diameter. The G-code we applied was assuming 1.75mm, and thus pushing more filament per second, causing over-extrusion. The excess of PLA on the model would cause blobs to form on the stalks where the nozzle would run into.

The next day, Christian made successful prints by adjusting the filament diameter in the slicer. He used colorFabb PLA/PHA "Standard White" to print it with the 0.12mm detail printer setting.

05-3d-scanning-printing.org-IMG_20260223_123939.jpg
Figure 21: PLA/PHA box
ultimaker-success.jpg
Figure 22: Test model on the Ultimaker (photo by Christian)
05-3d-scanning-printing.org-IMG_20260223_115059.jpg
Figure 23: Tolerance slits (microscope)
05-3d-scanning-printing.org-IMG_20260223_115519.jpg
Figure 24: Tolerance ribs (microscope)
05-3d-scanning-printing.org-IMG_20260223_115334.jpg
Figure 25: Overhang bottom (microscope)

3.1.5. Prusa Mini+

At home, I have a Prusa Mini+ and some filaments I wanted to test using the all-in-one-test. Same machine, different filaments.

3.1.5.1. ColorFabb allPHA

I tried to do the all-in-one test for ColorFabb PHA because I know it has a tendency to warp when printing a large flat surface.

05-3d-scanning-printing.org-IMG_20260222_093018.jpg
Figure 26: Warping already visible

According to the datasheet, PHA should be printed on an unheated bed because heat will induce crystallization, which leads to uneven shrinking and warping of the bottom layers. In the lecture and local instructions, I learned about rafts, and inspired by somebody who printed PHA on supports, I wanted to see if the would help.

My theory was that the bed would not collect heat while printing, especially in the middle of the print causing uneven crystallization / shrinking. The raft should even out the heat.

05-3d-scanning-printing.org-screenshot-2026-02-22_09-33-24.png.jpg
Figure 27: Add 8 layers of raft
05-3d-scanning-printing.org-screenshot-2026-02-22_09-33-47.png.jpg
Figure 28: Sliced on a raft

At the layer where the last print clearly failed, this print was looking good!

05-3d-scanning-printing.org-IMG_20260222_103703.jpg
Figure 29: Looking good.

Adding a raft is a success!

05-3d-scanning-printing.org-IMG_20260222_111725.jpg
Figure 30: Test print still on the bed

The result is pretty good.

05-3d-scanning-printing.org-IMG_20260222_112536.jpg
Figure 31: A bit of stringing
05-3d-scanning-printing.org-IMG_20260222_112553.jpg
Figure 32: Nozzle is too big (0.20mm) for precision
05-3d-scanning-printing.org-IMG_20260222_112607.jpg
Figure 33: Steepest overhang tests have messy numbers
05-3d-scanning-printing.org-IMG_20260222_112631.jpg
Figure 34: Bottom side of overhang is sagging
05-3d-scanning-printing.org-IMG_20260222_112742.jpg
Figure 35: Sagging in overhang test

I was pleasantly surprised the raft came off very easily.

05-3d-scanning-printing.org-IMG_20260222_112839.jpg
Figure 36: Raft and bottom of model

This was a success and a great addition to my personal PHA filament printing profile.

3.1.5.2. ColorFabb XP (PET)

After the PHA success, I decided to do the same for the role of clear ColorFabb XT (a PET variant) I have. I've had little issues printing it but was very curious about its performance on the all-in-one test.

I started with the default profile for ColorFabb XT which is available in PrusaSlicer. Interestingly, the values for temperature deviate from what is on the datasheet.

  Prusa settings Datasheet
Nozzle 260°C 240-260°C
Bed 90°C 60-70°C

The result was very stringy and the filament oozed out of the head after the print.

05-3d-scanning-printing.org-IMG_20260222_140037.jpg
Figure 37: Stringing and oozing

The overhangs were very impressive compared to the PLA prints we did in the lab. It seems that PET has the right hardening / viscosity to make them?

05-3d-scanning-printing.org-IMG_20260222_140401.jpg
Figure 38: Impressive overhangs

Following tips on the ColorFabb blog post about XT to reduce the stringing, I changed the Retraction length (was unset originally) and lowered the Nozzle temperature to 250°C on Other layers.

05-3d-scanning-printing.org-screenshot-2026-02-22_14-10-57.png.jpg
Figure 39: Retraction length on Filament overrides tab
05-3d-scanning-printing.org-screenshot-2026-02-22_14-14-12.png.jpg
Figure 40: Nozzle temperature on Filament tab

The resulting print is much better!

05-3d-scanning-printing.org-IMG_20260222_155651.jpg
Figure 41: Way less stringing on the second print
05-3d-scanning-printing.org-IMG_20260222_155736.jpg
Figure 42: Improved settings on the right
05-3d-scanning-printing.org-IMG_20260222_155846.jpg
Figure 43: Bridges are still pretty good

The filament still oozes out of the nozzle after the print is done, but that's not a problem.

3.1.6. Apples and Oranges

Making a comparison between the above machines based on these prints would not make any sense because we used different types of PLA. For the Ultimaker, we even used PLA/PHA, which has different properties from PLA.

Another mismatch is the usage of the 0.12mm detail printer setting for the Ultimaker and the default 0.20mm settings for the other machines.

The favorite machine among us students is the Ultimaker because it is built to be user-friendly and gives good results. When in a hurry, the Prusa Core One is the clear winner.

3.2. Bracelet 3D print

For the "could not be easily made subtractively" assignment, I wanted to make a bracelet made of segments linked through ball joints.

Here is the OpenSCAD script I came up with to generate a model for it.

$fn = 200;

inner_r = 5;
outer_r = 8;
spoke_r = inner_r * .2;
spoke_len = inner_r * 4;

tolerance = .4;
cone_r1 = 2;
cone_r2 = 10;

module segment() {
  difference() {
    union() {
      sphere(inner_r);
      hull() {
        cylinder(h = spoke_len + 2, r = spoke_r);
        translate([0, 0, spoke_len]) sphere(outer_r);
      }
    }
    translate([0, 0, spoke_len]) {
      sphere(inner_r + tolerance);
      translate([0, 0, -.25 * inner_r]) {
        cylinder(outer_r, cone_r1, cone_r2);
        translate([0, 0, outer_r]) cylinder(10, outer_r);
      }
    }
  }
}

rot = 20;

module go(i) {
  if (i >= 0) {
    segment();
    translate([0, 0, spoke_len]) rotate([rot, 0, 0]) go(i - 1);
  }
}

rotate([0, 90, 0]) go(360 / rot);
bracelet.png

I exported to model as an STL from OpenSCAD and imported it into PrusaSlicer. In the slicer I selected the Original Prusa Mini+ Input Shaper (the printer I have at home) as Printer and ColorFabb allPHA. 1 In the Print settings, I changed the Support material Style to Organic because they are prettier.

Because printing the entire bracelet takes so much time (almost 4 hours!), I decided to print only 3 segments to test the flexibility of the links.

05-3d-scanning-printing.org-screenshot-2026-02-20_09-53-10.png.jpg
Figure 44: After slicing
05-3d-scanning-printing.org-IMG_20260220_102101.jpg
Figure 45: Printing 3-segment test
05-3d-scanning-printing.org-IMG_20260220_103308.jpg
Figure 46: Finished print
05-3d-scanning-printing.org-IMG_20260220_103351.jpg
Figure 47: Close up of the three segments still on the bed

PHA sticks very well to the bed. To remove it, I heated the bed to 90°C and scooped it up with a putty knife.

05-3d-scanning-printing.org-IMG_20260220_103623.jpg
Figure 48: Bottom of print after removing it

While cleaning it up for a bit the segments, I found that the segments easily detached. I needed to make a stronger fit.

05-3d-scanning-printing.org-IMG_20260220_103841.jpg
Figure 49: Segments come apart

To secure the balls better into the sockets, I made the tolerance (distance between the inner ball and the cavity) and the cone for the cutout smaller. I used the following values:

Table 1: Smaller tolerance and cone
variable value
tolerance 0.2
cone_r1 0
cone_r2 8

Inspecting the result in PrusaSlicer made me more confident that the segments will not easily separate.

05-3d-scanning-printing.org-screenshot-2026-02-20_10-56-16.png.jpg
Figure 50: Cross-section in the slicer
05-3d-scanning-printing.org-IMG_20260220_112859.jpg
Figure 51: Paused mid-print

This string of segments did not fall apart. I could not pull it loose.

05-3d-scanning-printing.org-IMG_20260220_120719.jpg
Figure 52: Slightly cleaned up but not (easily) detachable

The video below shows its stiffness.

The joint was a bit stiff, so I wanted to change that to make it more comfortable. On the first try, it was very loose, so I tried a value in between 0.3.

variable value
tolerance 0.3
cone_r1 0
cone_r2 8

The result using the above parameters is hardly better than the previous print but tolerable. Next, I tried to print the whole bracelet to get a feel for how big it is.

05-3d-scanning-printing.org-IMG_20260220_155810.jpg
Figure 53: 3h 54m 10s, oof…
05-3d-scanning-printing.org-IMG_20260221_101956.jpg
Figure 54: 3h 54m 10s, later…

It is very big. To make the segments smaller, I introduced an s (for scale) parameter in the model to adjust some sizes.

$fn = 200;

s = 1 / 1.2;

inner_r = 5 * s;
outer_r = 7 * s;
spoke_r = inner_r * .2;
spoke_len = inner_r * 4;

tolerance = .4;
cone_r1 = 0;
cone_r2 = 7.5 * s;

module segment() {
  difference() {
    union() {
      sphere(inner_r);
      hull() {
        cylinder(h = spoke_len + 2, r = spoke_r);
        translate([0, 0, spoke_len]) sphere(outer_r);
      }
    }
    translate([0, 0, spoke_len]) {
      sphere(inner_r + tolerance);
      translate([0, 0, -.25 * inner_r]) {
        cylinder(outer_r, cone_r1, cone_r2);
        translate([0, 0, outer_r]) cylinder(10, outer_r);
      }
    }
  }
}

rot = 20;

module go(i) {
  if (i >= 0) {
    segment();
    translate([0, 0, spoke_len]) rotate([rot, 0, 0]) go(i - 1);
  }
}

rotate([0, 90, 0]) go(360 / rot);

Note that the tolerance is not scaled!

With the above values, the bracelet is still way too big.

05-3d-scanning-printing.org-IMG_20260221_101956.jpg
Figure 55: Top view of new print (still looks too big)
05-3d-scanning-printing.org-IMG_20260221_102002.jpg
Figure 56: Bottom view with all the supports
05-3d-scanning-printing.org-IMG_20260221_102506.jpg
Figure 57: First rough weeding of the supports

Too big… and the weeding is terrible. It needed to be smaller still but I felt I could not scale down the joint any further without it becoming too brittle. I changed spoke_len = inner_r * 3.25 to make the segments shorter.

For this run, I used the default Snug supports, and the supports came off so easily.

05-3d-scanning-printing.org-IMG_20260221_175238.jpg
Figure 58: Almost all supports came off in one go

This bracelet is too small for me but I found the perfect hand model: my wife 🖤.

05-3d-scanning-printing.org-IMG_20260221_174812_1.jpg
Figure 59: Close-up of the bracelet on my wife's wrist

3.3. Scanning an object

The Waag owns a Creality Scan Ferret. Henk showed us how to use it by scanning Heleen's head.

screenshot-ferret-heleen.jpg
Figure 60: Scan of Heleen in the Creality Scan software

I brought a pine cone and a dried poppy to scan. Unfortunately the companion software only supports MS-Windows or Apple Mac. We tried scanning the pine cone using Heleen's computer but it was very hard to get a proper scan.

screenshot-pine-cone.jpg
Figure 61: Scan of Pine Cone in the Creality Scan software

Meanwhile Christian was playing around with Scaniverse on his iPhone and the results were quite good, so I tried that too. Unfortunately, my phone is not supported by Scaniverse (it uses lidar?). Browsing the Google Play store I found Kiri Engine and this does install and work on my phone!

I made a lot of photos using the app (40+) and then it uploaded it to their server.

kiri.jpg
kiri1.jpg

After a couple of minutes I received an email with a link to download a ZIP-file. This file contained:

  • 3DModel.jpg (1.3Mb)
  • 3DModel.mtl (217 bytes)
  • 3DModel.obj (7.9Mb)

The JPEG-file (see figure 62) is just weird (I think it is an image of the outside to be mapped on the 3D model using the MTL-file) but I managed to import the OBJ-file into PrusaSlicer.

3dmodel.jpg
Figure 62: Weird included image
05-3d-scanning-printing.org-screenshot-2026-02-24_07-48-56.png.jpg
Figure 63: Model in PrusaSlicer some artifacts on the first layer

I ignored the artifacts on the first few layers (this print is tiny) and ran it.

05-3d-scanning-printing.org-IMG_20260223_174451.jpg
Figure 64: Printed OBJ-file in Prusament Galaxy PLA
05-3d-scanning-printing.org-IMG_20260224_073411.jpg
Figure 65: Poppy side-by-side

4. Reflection

I was very lucky to have a 3D printer at home. I actually bought it to prepare for the Fabacademy last year to force myself into some CAD and machining experience.

4.1. Good

I learned a lot of new things this week, and I am especially happy I found a solution to the PHA warping issue. Also, the lectures were very interesting, and I could share some of my knowledge with the other students at the Waag.

The 3D scanning was actually more impressive than I expected.

4.2. Bad

Not all the printers at the Waag are in perfect shape, but this is also great for learning what can go wrong.

4.3. Ugly

Iterating to fix a failure is really annoying when 3D printing because every try takes time to set up and complete.

The Creality Ferret is unusable without a MS-Windows or Apple Mac computer so totally lost interest..

5. Source files

Unfortunately the 3MF-file for the bracelet is 18Mb so I did not include it in the repository.

Footnotes:

1

I created the ColorFabb allPHA profile myself a while back to reduce warping a bit. You can it here ColorFabb-allPHA.ini.

Copyright © 2026 Remco van 't Veer

Licensed under a
CC BY-NC-SA 4.0

Build using
GNU Emacs, Org Mode and GNU Guix

Source code hosted at
gitlab.fabcloud.org