How to generate a 3D printable mold for an object!

How to generate a 3D printable mold for an object!

We were lucky enough to have Dan Steele write a post on generating a 3D printed mold for an object! He has done quite a few of these, and you can download his molds from Pinshape. But if you want to create your own, read on for Dan’s tutorial! 


Introduction

I’m going to walk through the process of taking a cool character model and turning it into a mold, then casting copies from the mold.

Making a 3D printed mold can be a very easy process for some models. For instance, Robber Rex was already Manifold, had no internal structures, and was low-poly so it took about 2 minutes to generate a mold with the reference script. You can find the mold I created for it here

You can find the script that I ran against the original model with the parameters I used already filled in here.

Bunny with an attitude was quite a bit more work.   This cool model was designed by Tanya Wiesner. 

This tutorial documents how I turned this model into a mold. The exact same steps should be able to convert all but the most broken models into molds.

Making a mold and casting can be broken into three distinct parts:

  • Prepping and cleaning up the model
  • Making the mold
  • Casting parts

 

Preparing and cleaning up your model

The three requirements for a model capable of generating a mold are:

  • Manifoldness – A model must be manifold in order to turn it into a mold. For a model to be manifold, it must make up a volume that could exist in the real world. The most common cause of non-manifoldness are “holes” in a mesh. If the mesh isn’t “water tight” and there is no clear inside and outside volume, a model is not manifold.
  • No internal structures – Often when models are created, they are made by jamming multiple other models together. If these models aren’t stitched together properly with their internal structures removed, then we need to fix this before we attempt to make the mold.
  • Low-Poly – To use OpenSCAD to create a model, the poly count on the model must be less than 20,000. While this number may sound low for most objects, a higher poly count doesn’t get you any more detail anyway.

 

Step 1 – Reducing the polycount 

Use Meshlab for this process. It’s free and can be found here. Meshlab is a full-featured tool but I mostly use it for reducing polycounts. Start Meshlab up and load your STL by clicking on File->Import Mesh…mold 1 3D printed moldNext take a look at the face count. It’s circled in red in the above picture. Right now it’s at almost 1 million. I want to reduce it down to well under 100K for the first part of our process.mold 2 3D printed moldClick on:

Filters->Remeshing, Simplification, and Reconstruction->Quadratic Edge Collapse Decimation

Set the number of faces to something that still looks reasonable when you hit “Apply” but is below 100K (I chose 60K). Hit “Apply”.

Your Model is now decimated down to a workable number of faces. If you skip this step, some of the software used in later steps won’t load the model, or will crash when you try.

Step 2. Is it manifold?

Now we need to verify our model’s manifoldness. Quadratic Edge Decimation generally produces good-looking results but frequently breaks manifoldness. The attitude bunny I’m using was manifold before the decimation, but now is not. Here’s how you tell:

Click Render->Show Non-Manif Edges

     then

Click Render->Show Non-Manif Vertices

mold 3 3D printed moldNotice in the above example we now have 60,000 faces in the bottom center. Also up in the top left hand corner we also have two boxes that should have a total of 4 zeros if everything is manifold. But I have a 1 and a 4. To fix this click:

   Filter->Cleaning and Repairing-> Remove Duplicate Faces

   Filter->Cleaning and Repairing-> Remove Duplicate Vertex

   Filter->Cleaning and Repairing-> Remove Faces from Non Manif Edges

Once that’s done export your mesh as an STL even if it still isn’t perfectly manifold.

If after selecting all of the above your model still isn’t manifold, you’ll have to load it in Netfabb Basic (also free) and attempt automatic repair from there.

If Netfabb basic won’t fix it you may need to reduce the polycount further and repair it by hand in Sketchup. This is tedious and not for the faint of heart.

Speaking of Sketchup, it’s a great tool for taking a look inside our mesh to see how the insides look. It’s free and you can download it here.

You’ll need to install an STL importer/exporter. There’s one available in the Sketchup plugin library. Once you’ve done that, you’ll be able to import your model and have a look. I highlighted the back of my model, then right-clicked and selected hide. Here’s a peek at the insides:mold 4 3D printed moldIf you look carefully you’ll notice two things: the spheres up in the head structure and the overlap in the legs. These internal structures need to be eliminated to make the model properly manifold.

Step 3. Get rid of internal structures

This used to be a long and tedious process but now there’s an easy and free solution. Autodesk’s Meshmixer tool is free and can take care of this for us. Download it here.

Load Meshmixer and choose import to import the latest version of your mold.

mold 5 3D printed mold

Click Edit->Make Solid

You’ll need to make some adjustments here to make things come out right. Adjust the values of “Solid Accuracy” and “Mesh Density” upwards until your model looks nice and clean when you hit “Update”. Once you’re happy with the results hit “Accept”. Now go to File->Export and export it as an STL. This will produce an amazingly large file (mine was 1.9GB and a couple million polys). You’ll need to bring this back into MeshLab and decimate it down to less than 20,000 polys (I used 11,000). Follow the steps above to clean up any final manifold errors.

Your model is now ready to be turned into a mold! ☺

 

Making the mold

For the next part you’ll need to download OpenSCAD. It is another free modeling tool and you can find it here.

You’ll also need my mold generation scad which can be found here.

Put the Mold Generator script in the same directory as your model and load the script in OpenSCAD. The code window will look something like this:

mold 6 3D printed mold

You’ll need to change model_filename to the name of your STL. You can hit F5 to render a view of what the script will do right now. If you are very lucky it will be perfect right away, but chances are it won’t be. Note that this script creates a negative of your model and pushes it into two halves of your mold. A negative space is difficult to see and position so there is a small change you can make to the script to see the model you are trying to place in the mold halves.

mold 7 3D printed moldNotice the six ‘//’ I added on the left-hand side. Add those and hit F5 and all of a sudden you will see your model in the preview. You can now move the model around and put it halfway into the right-hand side of your mold. You move your model around by tweaking these variables

mold 8 3D printed mold

For model_rotate and model_translate the 3 variables are X, Y, and Z respectively. model_scale is a multiplier applied to the size of your original model.

Adjust the mold_width, height and depth as needed so that your model sits nicely in the middle of your mold. Don’t forget to hit F5 after you make an adjustment to see the effect. When you have all the variables set right, your preview should look something like this:

mold 9 3D printed mold

Once it looks right, you’ll need to remove the 6 ‘//’ comment markings we added above and hit F5 again. It should now look like this:

mold 10 3D printed mold

Your last step is to do a full render and export the STL. To do a render hit F6. This will take much longer than when you hit F5. Once the render is done, the model in the preview will look much clearer:

mold 11 3D printed mold

You can now select File->Export and Export as an STL.

 

Casting with Oogoo

The original instructions for making Oogoo can be found here.

I’ve got a couple of tips for using Oogoo so that it will work well with these molds.

  • Add essential oils. Just add a few drops of vanilla (or whatever other odour strikes your fancy) essential oil to the silicon before adding the corn starch . It will replace the yucky vinegar smell much quicker.
  • Add a bit of oil-based paint even if you don’t care about color. The extra oil from the paint and essential oil makes the Oogoo a bit thinner and delays the curing process a bit.

Here are my steps to making the mold:

  1. Add the essential oils into the silicon and stir in the paint
  2. Stir until paint is mixed evenly
  3. Mix in corn starch. Add the same amount of cornstarch as silicon by volume. I did this one teaspoon at a time, stirring until it was well blended. 
  4. Smoosh the Oogoo into the mold. Add more than you think you’d need. 
  5. Squeeze the mold halves together as tightly as you can. Oogoo should push out from all four sides if you’ve added enough. The harder you squeeze and clamp the halves, the less flashing you’ll have to clean up later.

This slideshow requires JavaScript.

Leave your mess sitting around on the counter so you can poke at the leftover Oogoo every once in a while. When it’s hard and rubbery, the stuff in your mold will be as well. Pull the mold apart carefully and enjoy your new minion. Make a thousand. Start an army….take over the world!

We’d love to hear from you! 

Questions? Comments? Leave them for Dan below! 

Pinshape

Pinshape is a 3D printing community and marketplace where makers from all over the world can find and share their next great 3D print and help each other get the best results from their 3D printers.

  • Ultra Force

    Then you can use your two part mold to rotational cast it hollow with a RotoMAAK http://www.rotomaak.com

  • rocketboy604

    Only if there is no inclusions. This is why I mostly cast with soft materials like Oogoo…if there are any pockets that widen more than the exit hole and you spin-cast or cast with a stiff material your object will be trapped in there. As a general rule if you aren’t 100% sure that you’ve eliminated all the inclusions you want either a flexible mold (you could print it out of flexible filament) or a flexible object coming out of the mold.

  • Ultra Force

    Or just 3D print as normal and use a 2 part silicon mold that is flexible.

  • David Austin

    Or print the mold, then use a soft enough silicone that also has enough toughness to not tear when pulling out of a stuck mold. Remember everytime you make a mold of a mold you loose definition, which comes into play if you use a high-detail 3D print, like from an SLA.

  • billyd

    This is just amazing. Thank you so much for doing this work. I would love to use the “pour hole” feature. Do you have any instructions on its use? Or is it not yet implemented?
    Regards.

  • rocketboy604

    I haven’t used the pour hole feature in some time so it may be broken. I’ll take a look and fix it if it is.

  • BeePee

    This looks great, but I could not load my file! I replaced the existing file name with one of my STL files (after checking it out as instructed with Meshlab etc), and added the 6 forward slashes in the code, but every time I hit F5 or Preview I just got the existing model that came with the code download – no sign of my STL at all. What am I doing wrong?

  • rocketboy604

    Hmm could you upload your openscad file or even a picture of the chunk of code you changed somewhere (maybe the forum)? It’s probably something pretty straightforward but it will be easier to figure out if I can see the code.

  • BeePee

    Here is the file; only bits changed are the name of the STL file and the added 6 sets of forward-slashes as instructed above.:

    /*************************************************

    Original Author

    Parametric two-part mold generator

    Author: Jason Webb

    Website: http://jason-webb.info

    Modified by

    Dan Steele (rocketboy on thingiverse)

    Changed one of the keys to a cube so mold can’t be put together backwards.

    Center poor hole option for plaster.

    A parametric two-part mold generator that constructs two-

    part molds with registration marks based on STL files.

    *************************************************/

    // Model parameters

    model_filename = “Suzuki10HoleBasic1.stl”;

    model_rotate = [0,0,0];

    model_translate = [0,0,0];

    model_scale = 1;

    // Mold parameters

    mold_width = 40; // Measured along X axis

    mold_height = 40; // Measured along Y axis

    mold_depth = 25; // Measured along Z axis

    mold_spacing = 3; // Space between mold halves

    rounded_corners = true; // Rounded the corners to lessen warping

    edge_radius = 8; // Radius of rounded corners

    // Key parameters (registration marks)

    key_size = 3; // Radius of spherical keys

    key_fettle = 0.4; // Size difference between keys and corresponding holes

    key_margin = 7; // Distance from outside edge of mold

    // Pour hole parameters

    pour_hole = 0; //0 for false 1 for true.

    location = 0; //0 for now

    side_by_side();

    /****************************************

    Rotate and place both halves side by side

    along the X axis for easy single-plate printing

    *****************************************/

    module side_by_side() {

    // Scoot the left half over a bit

    translate([mold_width/2 + mold_spacing/2, 0, mold_depth/2])

    bottom_half();

    // Rotate the top half, then scoot it over a bit

    translate([-mold_width/2 – mold_spacing/2, 0, mold_depth*3/2])

    rotate([0, 180, 0])

    top_half();

    }

    /*******************************************

    Bottom half of the mold

    ********************************************/

    module bottom_half() {

    // Create the mold form with negative keys

    // difference() {

    // Create the basic mold form by subtracting the STL from a cube half it’s size

    // difference() {

    // difference() {

    if(rounded_corners)

    roundedBox([mold_width, mold_height, mold_depth], edge_radius, true);

    else

    cube(size = [mold_width, mold_height, mold_depth], center = true);

    scale(model_scale)

    translate(model_translate)

    rotate(model_rotate)

    import(model_filename);

    // }

    if (pour_hole) {

    translate(model_translate)

    translate([mold_depth,0,0])

    cylinder(h = mold_depth*2, r1 = mold_depth*2, r2 = mold_depth, center = true);

    // }

    // }

    // Negative key 1

    translate([-mold_width/2 + key_margin, -mold_height/2 + key_margin, mold_depth/2])

    cube(size =[key_size+key_fettle,key_size+key_fettle,key_size+key_fettle], center=true);

    // Negative key 2

    translate([mold_width/2 – key_margin, mold_height/2 – key_margin, mold_depth/2])

    sphere(key_size + key_fettle, $fn = 30);

    }

    // Positive key 1

    translate(v = [-mold_width/2 + key_margin, mold_height/2 – key_margin, mold_depth/2])

    sphere(r = key_size, $fn = 30);

    // Positive master key

    translate(v = [mold_width/2 – key_margin, -mold_height/2 + key_margin, mold_depth/2])

    sphere(r = key_size, $fn = 30);

    }

    /*******************************************

    Top half of the mold

    ********************************************/

    module top_half() {

    // Create the mold form with negative keys

    difference() {

    // Create the mold form by subtracting the STL from a cube half it’s size

    difference() {

    translate([0, 0, mold_depth])

    if(rounded_corners)

    roundedBox([mold_width, mold_height, mold_depth], edge_radius, true);

    else

    cube(size = [mold_width, mold_height, mold_depth], center = true);

    scale(model_scale)

    translate(v = model_translate)

    rotate(model_rotate)

    import(model_filename);

    }

    // Negative master key

    translate(v = [mold_width/2 – key_margin, -mold_height/2 + key_margin, mold_depth/2])

    sphere(key_size + key_fettle, $fn = 30);

    // Negative key 2

    translate(v = [-mold_width/2 + key_margin, mold_height/2 – key_margin, mold_depth/2])

    sphere(key_size + key_fettle, $fn = 30);

    }

    // Positive key 1

    translate(v = [mold_width/2 – key_margin, mold_height/2 – key_margin, mold_depth/2])

    sphere(key_size, $fn = 30);

    // Positive key 2

    translate(v = [-mold_width/2 + key_margin, -mold_height/2 + key_margin, mold_depth/2])

    //sphere(key_size, $fn = 30);

    cube(size =[key_size,key_size,key_size], center=true);

    }

    /******************************************

    roundedBox module from example022.scad

    ******************************************/

    // size is a vector [w, h, d]

    module roundedBox(size, radius, sidesonly)

    {

    rot = [ [0,0,0], [90,0,90], [90,90,0] ];

    if (sidesonly) {

    cube(size – [2*radius,0,0], true);

    cube(size – [0,2*radius,0], true);

    for (x = [radius-size[0]/2, -radius+size[0]/2],

    y = [radius-size[1]/2, -radius+size[1]/2]) {

    translate([x,y,0]) cylinder(r=radius, h=size[2], center=true);

    }

    }

    else {

    cube([size[0], size[1]-radius*2, size[2]-radius*2], center=true);

    cube([size[0]-radius*2, size[1], size[2]-radius*2], center=true);

    cube([size[0]-radius*2, size[1]-radius*2, size[2]], center=true);

    for (axis = [0:2]) {

    for (x = [radius-size[axis]/2, -radius+size[axis]/2],

    y = [radius-size[(axis+1)%3]/2, -radius+size[(axis+1)%3]/2]) {

    rotate(rot[axis])

    translate([x,y,0])

    cylinder(h=size[(axis+2)%3]-2*radius, r=radius, center=true);

    }

    }

    for (x = [radius-size[0]/2, -radius+size[0]/2],

    y = [radius-size[1]/2, -radius+size[1]/2],

    z = [radius-size[2]/2, -radius+size[2]/2]) {

    translate([x,y,z]) sphere(radius);

    }

    }

    }

  • BeePee

    Here is a jpeg of the design; it’s a harmonica comb.

  • rocketboy604

    Hmm very strange..it looks correct. When you hit f5 do you get any errors in the bottom right output Window?

  • BeePee

    Yes, I get this error:

    WARNING: Can’t open import file ‘”Suzuki10HoleBasic1.stl”‘.

    I simply changed the file name as instructed, and this file is on my computer. Can I import it another way? I don’t see any ‘Import File’ tab in the toolbar.

    Thanks for your help with this!

  • BeePee

    I could send you the STL file if that would be any help.

  • rocketboy604

    Sorry for the Delay, I was away for the weekend at the Vancouver Maker Faire.. Is the stl file in the same directory as your openscad script and does the case in the filename match exactly the case used in the script? OpenSCAD is pretty picky about these things…

  • BeePee

    No, the STL file is in a general folder related to Skethup designs. Hmm, maye this is the problem. How do I put it in the same directory as the OpenSCAD script? I’m not really up on this scripting stuff, just a WYSIWG cut -and-paste type. If you can describe in basic layman’s terms what to do I’d be very grateful.

    Thanks again for your help!

  • rocketboy604

    Unless I’m completely missunderstanding what’s going on you just need to right click on the stl in explorer/Finder and select copy and then find the folder containing your openscad script and right click again and select paste…

  • BeePee

    Hi Rocketboy, following what you recommend, as far as I know:

    I have a Windows 10 computer. OpenSCAD is in the Documents folder. I opened it and found the file as above. When I click on it I can see the script in Explorer, but not edit it. To edit it I need to open the file in the program. I did this, and the script is shown as above. I then went to my Sketchup STL folder, right clicked on the file and pressed copy, highlighted the “”Suzuki10HoleBasic1.stl” text in the OpenSCAD script, right clicked and pressed paste.

    Still no luck, just the original model from the article is shown… I think I’ve done what you recommended, but perhaps not. Is this what you mean? If not, please simplify the instructions down even more please, in baby step-by-steps if possible – thanks!

    If OpenSCAD had a ‘File Import’ tab it would make things a LOT easier for the likes of me. Why doesn’t it?

  • Gabriel Martins Raphael

    cool.. doesn’t work. when press f6 the mold get only the outside block surface.. and don’t the model negative.

  • Paul Fez

    I want to buy you a beer! thank you for this! 🙂

  • Andrew Patton

    Any advice would be appreciated. I get an error at Rendering… Also can’t find Line:326.

    Rendering Polygon Mesh using CGAL…
    ERROR: CGAL error in CGAL_Nef_polyhedron3(): CGAL ERROR: assertion violation! Expr: e->incident_sface() != SFace_const_handle() File: /opt/mxe/usr/x86_64-w64-mingw32.static/include/CGAL/Nef_S2/SM_const_decorator.h Line: 326

  • Andrew Patton

    Fixed. Took awhile but I had to repair my model with multiple programs.