Skip to main content

Elio Antoun

Séance 1 - Découverte de l'impression 3D : Minecraft Baby Creeper Figurine

1. La Recherche

J'ai recherché sur le web une base de donnée de modèles 3D prêt à imprimer. Je suis tombé sur le site printables.com.image.png

J'ai décidé de baser ma recherche sur des figurines, je suis tombé sur le modèle de Baby Creeper

image.png

Choix des réglages optimisés pour assurer un modèle assez robuste avec un temps d'impression rapide.

image.png          image.png

Séance 2 

// Paramètres
$fn = 60; // Résolution (augmente à 100 pour une finition plus lisse)

diametre_interieur = 20;
epaisseur_cage = 3;
espace_jeu = 2; // L'espace pour que la boule bouge librement

// 1. La sphère intérieure (libre)
sphere(d = diametre_interieur);

// 2. La cage extérieure
difference() {

    // Sphère externe de la cage
    sphere(d = diametre_interieur + (epaisseur_cage * 2) + (espace_jeu * 2));

    // On vide l'intérieur pour laisser la place à la boule
    sphere(d = diametre_interieur + (espace_jeu * 2));

    // On crée des ouvertures pour voir la boule et prouver qu'elle est prisonnière

    // Trous sur l'axe X
    rotate([0, 90, 0])
        cylinder(h = 100, d = 15, center = true);

    // Trous sur l'axe Y
    rotate([90, 0, 0])
        cylinder(h = 100, d = 15, center = true);

    // Trous sur l'axe Z
    cylinder(h = 100, d = 15, center = true);
}

image.png

Séance 3 - Spiral Hourglass Fidget 

// Spiral Hourglass Fidget

/* [General Dimensions] */
total_height = 80;    // Total height of one segment
max_diameter = 40;    // Width at top/bottom
min_diameter = 20;    // Width at the narrow waist
wall_thickness = 1.6; // Thickness of the outer shell
clearance = 0.3;      // Gap between inner and outer parts

/* [Ball & Path] */
ball_diameter = 9.5;  // Size of the ball (standard steel marble)
groove_depth_ratio = 0.6; // How deep the ball sits in the inner core (0-1)
twists = 2.0;         // Number of spiral rotations
resolution = 100;     // Steps for the spiral generation (Higher = smoother but slower)

/* [Rendering] */
part_to_show = "both"; // [both, inner, outer]
$fn = 60;             // Resolution for cylinders/spheres

// --- Derived Calculations ---
R_max = max_diameter / 2;
R_min = min_diameter / 2;
path_radius_offset = (ball_diameter / 2) + 0.5; // Distance from surface for cutting groove

// --- Main Logic ---

if (part_to_show == "inner" || part_to_show == "both") {
    translate([-max_diameter/1.5, 0, 0]) 
    Inner_Core();
}

if (part_to_show == "outer" || part_to_show == "both") {
    translate([max_diameter/1.5, 0, 0]) 
    Outer_Shell();
}

// --- Modules ---

module Inner_Core() {
    difference() {
        // 1. The main hourglass body
        hourglass_solid(h=total_height, r_start=R_max, r_mid=R_min - clearance);

        // 2. The Helical Groove
        // We subtract a trail of spheres to make the path
        spiral_path(
            h=total_height, 
            r_start=R_max - clearance, 
            r_mid=R_min - clearance, 
            turns=twists, 
            cut_r=ball_diameter/2 + 0.2
        );
        
        // 3. Central alignment hole (optional, saves plastic)
        cylinder(h=total_height*3, r=4, center=true);
    }
}

module Outer_Shell() {
    difference() {
        // 1. Outer Surface
        hourglass_solid(h=total_height, r_start=R_max + wall_thickness, r_mid=R_min + wall_thickness);
        
        // 2. Inner Surface (Hollow out)
        // Make slightly larger than the core for clearance
        translate([0,0,-0.1])
        hourglass_solid(h=total_height + 0.2, r_start=R_max, r_mid=R_min);
        
        // 3. Windows (Optional - lets you see the ball)
        // Remove the asterisks below to enable windows
        /*
        for(i=[0:3]) {
            rotate([0,0,i*90])
            translate([0,0,total_height/2])
            cube([max_diameter*2, 5, total_height*0.6], center=true);
        }
        */
    }
}

// --- Helper Functions ---

// Generates the Hourglass Body Shape using a Hyperboloid approximation
module hourglass_solid(h, r_start, r_mid) {
    // We construct this by stacking thin cylinders to approximate the curve
    // This is robust and works without external libraries
    step = h / resolution;
    
    union() {
        for (i = [0 : resolution - 1]) {
            z = i * step;
            // Radius at current height Z
            r1 = get_radius(z, h, r_start, r_mid);
            // Radius at next height
            r2 = get_radius(z + step, h, r_start, r_mid);
            
            translate([0, 0, z])
            cylinder(h=step, r1=r1, r2=r2);
        }
    }
}

// Generates the helical cut for the ball
module spiral_path(h, r_start, r_mid, turns, cut_r) {
    step_angle = (turns * 360) / resolution;
    step_z = h / resolution;
    
    for (i = [0 : resolution - 1]) {
        z1 = i * step_z;
        ang1 = i * step_angle;
        rad1 = get_radius(z1, h, r_start, r_mid);
        
        z2 = (i + 1) * step_z;
        ang2 = (i + 1) * step_angle;
        rad2 = get_radius(z2, h, r_start, r_mid);
        
        hull() {
            translate([rad1 * cos(ang1), rad1 * sin(ang1), z1])
            sphere(r=cut_r);
            
            translate([rad2 * cos(ang2), rad2 * sin(ang2), z2])
            sphere(r=cut_r);
        }
    }
}

// Mathematical function for the hourglass curve (Parabolic/Hyperbolic curve)
function get_radius(z, h, r_outer, r_inner) = 
    let (
        // Map Z (0 to h) to -1 to 1
        normalized_z = (z - h/2) / (h/2),
        // Calculate curve factor (x^2 parabola for simple hourglass)
        factor = pow(normalized_z, 2)
    )
    r_inner + (r_outer - r_inner) * factor;


tBcimage.pngScreenshot 2026-02-04 183629.png