// ============================================================ // Parachute Canopy — 16 curved panels, hollow shell // Each panel spans 22.5° of azimuth, curved over a dome. // // Design notes: // • The canopy surface is derived from a sphere of radius R. // • The dome covers polar angles 0° (apex) → 70° (rim). // • Shell thickness is controlled by THICKNESS. // • 8 red panels + 8 white panels alternate around the 360°. // • Each panel is built by intersecting the spherical shell // with a wedge-shaped "pie slice" volume, giving true // curved gores — not flat triangles or pizza slices. // • Suspension line anchors are added at the rim. // ============================================================ // ── Global parameters ─────────────────────────────────────── R = 100; // Outer sphere radius (mm) THICKNESS = 2.5; // Shell wall thickness (mm) N_PANELS = 16; // Must be even for colour alternation PANEL_DEG = 360 / N_PANELS; // 22.5° // Dome extent in polar angle (0 = apex, 90 = equator) APEX_ANGLE = 0; // degrees from top (the tip) RIM_ANGLE = 70; // degrees from top (open bottom edge) // Detail quality $fn = 120; // ── Colours ───────────────────────────────────────────────── RED_COL = [0.85, 0.10, 0.10]; WHITE_COL = [0.96, 0.96, 0.96]; // ── Helper: one spherical shell gore ──────────────────────── // // Strategy: // 1. Build a full spherical shell (outer sphere minus inner sphere). // 2. Intersect it with a wedge that spans PANEL_DEG in azimuth // and is bounded in Z to keep only the dome cap // (from the apex down to the rim latitude). // // The wedge is a simple rotated half-space pair (two half-planes) // implemented as a very tall, thin box rotated to ±PANEL_DEG/2. module spherical_shell() { difference() { sphere(r = R); sphere(r = R - THICKNESS); } } // Azimuthal wedge spanning angle_start → angle_start + PANEL_DEG // centred on Z axis, unlimited height (clipped by dome_cap later) module azimuth_wedge(angle_start) { // Two half-plane cuts leave a pie-slice prism // Tall enough to enclose the full sphere H = R * 2.5; rotate([0, 0, angle_start]) intersection() { // Half-space 1: keep what's on the +X side of the // plane rotated by 0° rotate([0, 0, 0]) translate([0, -H/2, -H/2]) cube([H, H, H]); // Half-space 2: keep what's on the -X side of the // plane rotated by PANEL_DEG rotate([0, 0, PANEL_DEG]) translate([-H, -H/2, -H/2]) cube([H, H, H]); } } // Dome cap: keep only the polar-angle band [APEX_ANGLE, RIM_ANGLE] // This is a cone frustum aligned with +Z (apex at top). module dome_cap() { // Upper cut: everything above the apex polar angle // z_apex = R * cos(APEX_ANGLE) — but apex=0 means z=R (the very top) // We keep z ≤ R (always true) → no upper cut needed when APEX_ANGLE=0. // // Lower cut: remove everything below rim latitude // z_rim = R * cos(RIM_ANGLE) z_rim = R * cos(RIM_ANGLE); // A large cube from z_rim upward covers the dome region W = R * 3; translate([-W/2, -W/2, z_rim]) cube([W, W, R * 2]); } // One curved panel gore module panel_gore(angle_start) { intersection() { spherical_shell(); azimuth_wedge(angle_start); dome_cap(); } } // ── Suspension line anchor (small cylinder at rim) ─────────── // Placed at the midpoint azimuth of each panel, at the rim latitude. module line_anchor(angle_mid) { // Position on the rim circle x = R * sin(RIM_ANGLE) * cos(angle_mid); y = R * sin(RIM_ANGLE) * sin(angle_mid); z = R * cos(RIM_ANGLE); translate([x, y, z]) rotate([0, 0, angle_mid]) // orient outward rotate([RIM_ANGLE, 0, 0]) // tilt with sphere surface cylinder(h = 6, r = 2, center = true, $fn = 16); } // ── Assemble the canopy ────────────────────────────────────── module parachute_canopy() { for (i = [0 : N_PANELS - 1]) { angle_start = i * PANEL_DEG; angle_mid = angle_start + PANEL_DEG / 2; col = (i % 2 == 0) ? RED_COL : WHITE_COL; color(col) panel_gore(angle_start); // Anchor at rim midpoint of each panel color([0.3, 0.3, 0.3]) line_anchor(angle_mid); } } // ── Render ─────────────────────────────────────────────────── parachute_canopy(); // ============================================================ // RENDER TIPS // • Open in OpenSCAD ≥ 2021.01. // • Press F5 for preview (fast), F6 for full render (slower). // • To export STL: Render (F6) → Export → Export as STL. // • To print multi-colour, export each colour set separately // by commenting out the alternate panels. // // CUSTOMISATION // • Change R to scale the canopy. // • Change RIM_ANGLE (e.g. 65–80°) to make the opening // wider or narrower. // • Change THICKNESS for a thicker/thinner shell. // • Change N_PANELS to 8 or 32 for different panel counts // (keep it even). // ============================================================