To practice using a different feature of OpenSCAD, I tried making a wine glass by rotating a 2D outline around the Z-axis. OpenSCAD has much more limited 2D capabilities than SVG, allowing only polygons, not smooth curves, so it took me a while to come up with a way to get a decent shape with just a few vertices.

My first design was based on a tall, thin wine glass, but the glass was too tall for the print volume of the Monoprice Delta Mini printer, so I tried printing it scaled down by a factor of 2. The printer had a lot of trouble with this tiny design. Perhaps the biggest problem is that the thin stem is too flexible, so the printer head dragged the bowl around as it was printing. The stick-slip action resulted in a few small holes in the single-layer bowl.

I then tried adjusting the design so that the default settings would still produce the wine glass, but different settings would match a mini-snifter that does fit in the print volume. This mini-snifter has a bowl volume of about 135ml (4.5oz), and the snifter weighs 33g. I printed it at 0.15 mm/layer, with a wall count of 5 in Cura, 6 top and bottom layers, and 10% infill.

The roughness of the surface is probably due to inconsistent feeding of filament, except where the bowl flares out widely. There the filament is drooping a bit due to insufficient support.

The mini-snifter holds water and is a reasonably close approximation to the glass that I was copying.

I’ve included the OpenSCAD source code below, but it can be more easily downloaded from

https://www.thingiverse.com/thing:3049512

// OpenSCAD module for making goblets // Kevin Karplus // 2018 Aug 14 // Creative Commons - Attribution - Non-Commercial - Share Alike license.</pre> function interp(x, y0, y1) = (1-x)*y0 + x*y1; // Goblet using rotation about Z-axis // Defaults are for a tall, narrow wine glass: too tall for the // Monoprice Delta Mini 3D printer // h is height // foot_r is radius of foot // foot_h is height of foot where it joins stem // stem_r is radius of stem // stem_h is height of stem where it joins bowl // bowl_bottom_r is radius of bowl at stem_h // bowl_mid_r is radius of bowl at h-bowl_mid_depth // bowl_top_r is radius of bowl at top // thickness is thickness of sides of bowl. module goblet(h= 214, foot_r=36, foot_h=12, stem_r=4, stem_h=110, bowl_bottom_r=12, bowl_mid_r=28, bowl_mid_depth=42, bowl_top_r=25, thickness=1.5) { bowl_depth=h-stem_h; sphere_width = interp(0.75, bowl_mid_r,bowl_bottom_r) -thickness; echo( "sphere_width=", sphere_width); delta_r =interp(0.5,bowl_mid_r,bowl_bottom_r)-bowl_bottom_r; delta_d =bowl_depth-interp(0.7,bowl_mid_depth,bowl_depth); echo("delta_d=", delta_d, "delta_r=",delta_r); alpha = atan( delta_d/delta_r); echo ("alpha=", alpha); sphere_radius= sphere_width/sin(alpha); sphere_height = stem_h+sphere_radius; echo( "sphere_radius=", sphere_radius); difference() { rotate_extrude($fa=2) { polygon( points=[ // foot [0,0], [foot_r,0], [foot_r,thickness], [foot_r-4, thickness], [stem_r*1.5, foot_h- 0.5*stem_r], // stem [stem_r,foot_h], [stem_r, stem_h*0.75], [interp(0.5,stem_r,bowl_bottom_r), 0.9*stem_h], //bowl [bowl_bottom_r,stem_h], [interp(0.5,bowl_mid_r,bowl_bottom_r), h-interp(0.7,bowl_mid_depth,bowl_depth)], [interp(0.2,bowl_mid_r,bowl_bottom_r), h-interp(0.5,bowl_mid_depth,bowl_depth)], [bowl_mid_r, h-interp(0.2,bowl_mid_depth,bowl_depth)], [bowl_mid_r, h-interp(-0.07,bowl_mid_depth,bowl_depth)], [bowl_top_r, h], [bowl_top_r-thickness, h], [bowl_mid_r-thickness, h-interp(-0.07,bowl_mid_depth,bowl_depth)], [bowl_mid_r-thickness, h-interp(0.2,bowl_mid_depth,bowl_depth)], [interp(0.2,bowl_mid_r,bowl_bottom_r) -thickness, h-interp(0.5,bowl_mid_depth,bowl_depth)], [interp(0.5,bowl_mid_r,bowl_bottom_r)-thickness, h-interp(0.7,bowl_mid_depth,bowl_depth)], [interp(0.75,bowl_mid_r,bowl_bottom_r)-thickness, h- interp(0.85,bowl_mid_depth,bowl_depth)], [0,stem_h] ]); }; translate([0,0,sphere_height]) color("red") intersection() { sphere(r=sphere_radius, $fs=0.1); translate([0,0,-2*sphere_radius+delta_d]) cube([10*sphere_radius, 10*sphere_radius, 2*sphere_radius], center=true); } } } // The default example is for a small snifter, with an interior volume of about 135ml. // Printed in PLA with 0.15mm layers, wall line count 5, top and bottom layer count 6, and 10% infill, it weighs 33g. goblet(h=95, foot_r=29, foot_h=10, stem_r=4.5, stem_h=30, bowl_bottom_r=18, bowl_mid_r=33, bowl_mid_depth=40, bowl_top_r=23, thickness=1.8); <pre>