From b8d61e757826c90a81d3df6987bfbdc63db8c300 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Thu, 3 Feb 2022 11:47:47 +0800 Subject: [PATCH] add crystal_cluster --- examples/crystal_cluster.scad | 65 +++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 examples/crystal_cluster.scad diff --git a/examples/crystal_cluster.scad b/examples/crystal_cluster.scad new file mode 100644 index 00000000..2924e5e0 --- /dev/null +++ b/examples/crystal_cluster.scad @@ -0,0 +1,65 @@ +use ; +use ; +use ; +use ; + +base_r = 10; +crystals = 10; +crystal_cluster(base_r, crystals); + +module crystal_cluster(base_r, crystals) { + module single_crystal(r) { + h = r * 6; + + bottom_shape = shape_pie( + rand(r * 0.85, r * 1.15), + [rand(0, 15), rand(345, 360)], + $fn = 6 + ); + neck_shape = shape_pie( + rand(r * 0.85, r * 1.15), + [15, 356], + $fn = 6 + ); + + polyhedron_hull( + concat( + [for(p = bottom_shape) [p.x, p.y, 0]], + [for(p = neck_shape) [p.x, p.y, rand(h * 0.7, h * 0.75)]], + [[rand(0, r * 0.1), rand(0, r * 0.1), rand(h * 0.95, h * 1.05)]] + ) + ); + } + + module rock(radius, detail) { + detail = detail; + amplitude = .25; + dist = "border"; + + scale([1, 1, 0.5]) + difference() { + translate([0, 0, -6.9]) + + translate([0, 0, 12]) + worley_sphere(radius, detail, amplitude, dist); + + translate([0, 0, -30]) + linear_extrude(30) + square(radius * 10, center = true); + } + } + + + translate([0, 0, base_r * 0.5]) + for(i = [0:crystals]) { + seed_r = base_r * rand(0, 0.75); + seed_a = rand(0, 360); + seed_pt = seed_r * [cos(seed_a), sin(seed_a)]; + + translate(seed_pt) + rotate([0, rand(0, 120 * seed_r / base_r), seed_a]) + single_crystal(base_r - seed_r); + } + + rock(base_r * 1.45, 1); +}