Fat Pigeon Coaster Engraving
by neat-sketcher-c445 ·
a 7cm coaster, happy to print my first object
Interactive Preview & Customizer
3D preview with OpenSCAD rendering on parameter changes.
Diameter of the coaster (mm)
Total height of the coaster (mm)
Depth of the pigeon and text engraving (mm)
Quality of curves
Size of the text
Spacing between slip-resistant bumps
Diameter of each bump
X-offset for pigeon position (3mm to the right)
Prompt Assets
Prompt image
Prompt
i want a coaster, 7cm diamater,6mm height, engrave 2mm。
there is a fat pigeon in the middle. text"2026" below the pigeon.
OpenSCAD Code
/* [Global] */
// Diameter of the coaster (mm)
coaster_diameter = 70; // [50:1:120]
// Total height of the coaster (mm)
coaster_height = 6; // [2:0.5:15]
// Depth of the pigeon and text engraving (mm)
engrave_depth = 2.0; // [0.1:0.1:5]
// Quality of curves
quality = 64; // [32, 64, 128]
/* [Details] */
// Size of the text
text_height = 8; // [5:1:15]
// Spacing between slip-resistant bumps
bump_gap = 2.5; // [1:0.1:5]
// Diameter of each bump
bump_diameter = 0.8; // [0.2:0.1:2]
// X-offset for pigeon position (3mm to the right)
pigeon_x_offset = 3.0; // [-10:0.1:10]
/* [Hidden] */
$fn = quality;
epsilon = 0.05;
module pigeon_2d() {
// Fat body
translate([-2, 2]) circle(d=28);
// Head
translate([12, 10]) circle(d=14);
// Tail
translate([-20, 4]) rotate(20) square([12, 8], center=true);
// Beak
translate([18, 10]) polygon([[0,2], [4,0], [0,-2]]);
// Wing highlight
translate([-2, 2]) scale([1.2, 0.7]) circle(d=18);
}
union() {
difference() {
// Main Coaster Body
cylinder(d = coaster_diameter, h = coaster_height);
// Engraved Pigeon - Offset by 3mm to the right
translate([pigeon_x_offset, 0, coaster_height - engrave_depth])
linear_extrude(engrave_depth + epsilon)
pigeon_2d();
// Engraved Year
translate([0, -18, coaster_height - engrave_depth])
linear_extrude(engrave_depth + epsilon)
text("2026", size = text_height, halign = "center", valign = "center", font = "Liberation Sans:style=Bold");
}
// Slip-resistant bottom bumps
for (x = [-coaster_diameter/2 : bump_gap : coaster_diameter/2]) {
for (y = [-coaster_diameter/2 : bump_gap : coaster_diameter/2]) {
// Only place bumps within the circle radius with a small margin
if (sqrt(x*x + y*y) < (coaster_diameter/2 - 1.5)) {
translate([x, y, 0])
cylinder(d = bump_diameter, h = 0.5);
}
}
}
}

