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 - Tour de Chute Libre "Spiral Hourglass"

1. Description du projet

Ce projet consiste en la modélisation et la fabrication d'un objet cinétique de type "fidget" : un sablier à spirale. Une bille d'acier descend par gravité le long d'une trajectoire hélicoïdale creusée dans un volume en forme d'hyperboloïde, le tout enfermé dans une coque externe transparente ou évidée.

Objectifs :

  • Étudier la géométrie complexe de l'objet (surfaces courbes et trajectoires hélicoïdales).

  • Réaliser une rétro-ingénierie d'un modèle existant pour le rendre paramétrique.

  • Fabriquer l'objet en impression 3D sans supports.

2. Analyse Technique et Modélisation

Pour dépasser la simple impression de fichiers STL figés, j'ai opté pour une re-conception paramétrique sous OpenSCAD. Cela permet de modifier la taille de la bille, la vitesse de chute (nombre de tours) et les tolérances d'impression.

2.1 Concepts Géométriques

L'objet repose sur deux primitives mathématiques principales :

  1. L'Hyperboloïde à une nappe (Le corps) : La forme de "sablier" n'est pas deux cônes, mais une structure continue qui permet une transition fluide pour la bille.

  2. L'Hélice (La trajectoire) : La rainure suit une courbe hélicoïdale dont le rayon varie en fonction de la hauteur ($Z$).

2.2 Le Code Paramétrique (OpenSCAD)

Le script suivant génère dynamiquement le noyau interne (Inner Core) et la coque externe (Outer Shell) en s'assurant qu'ils s'emboîtent parfaitement grâce à une variable de clearance (jeu fonctionnel).

Caractéristiques du code :

  • Utilisation de la fonction hull() itérative pour creuser le chemin de la bille proprement.

  • Calcul dynamique du rayon pour suivre la courbure du sablier.

  • Séparation automatique des pièces pour l'export STL.

// 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;

image.pngScreenshot 2026-02-04 183629.png