1 Mal ein flexibleres Angebot. Dürfte sich selbst erklären. Voreingestellt ist ein Teil, bei dem man sieht, was so ungefähr geht und kein sinnvoller Würfel. Alle bisher diskutierten Würfel mit Ausnahme der Farbwürfel lassen sich so realisieren. Auch der Würfel aus V1 ist noch möglich. Leider noch nichts testgedruckt. Mir fehlt hier noch die Möglichkeit. Kommentare sind willkommen. Ein Kubator-Modul für den Gesellschaftsspiel-Replikator könnte die Zahlen am Anfang einstellen. Das dürfte programmtechnisch nicht allzu aufwendig sein.
6 // Würfel massiv drucken, um möglichst faire Würfel zu erhalten!
8 // Individuelle Einstellungen (die Zahlen können verändert werden, um den Würfel individuellen Wünschen anzupassen)
10 kante=20; // Kantenlänge des Würfels (in mm)
11 // typisch sind 20 mm oder 25 mm
13 // mögliches Aussehen der Seiten
23 // 9 taktiler Schrägstrich
24 // 10 Quadratischer Ausschnitt
31 // 17 Ausgeschnittener Strich
32 // 18 Ausgeschnittenes Plus-Zeichen
33 // 19 Ausgeschnittener Schrägstrich
34 // 20 Kreisförmiger Ausschnitt
35 // 21 1 kugliger Punkt
36 // 22 2 kuglige Punkte
37 // 23 3 kuglige Punkte
38 // 24 4 kuglige Punkte
39 // 25 5 kuglige Punkte
40 // 26 6 kuglige Punkte
41 // 27 taktiles Quadrat
42 // 28 Dreieckiger Ausschnitt
43 // 29 Fünfeckiger Ausschnitt
44 // 30 ausgeschnittenes X
47 // 33 ausgeschnittener Stern
49 // 35 Sechseckiger Ausschnitt
50 // 36 Siebeneckiger Ausschnitt
51 // 37 Achteckiger Ausschnitt
52 // 38 Taktiles Dreieck
53 // 39 Taktiler Fünfeck
54 // 40 Taktiles Sechseck
55 // 41 Taktiles Siebeneck
56 // 42 Taktiles Achteck
58 // hier die Nummern der gewünschten Seiten eintragen
66 abgerundet = 1; // Aussehen des Würfelkörpers
67 // Werte ganzahlig von 0 bis 4
68 // 0 = keine Abrundung der Ecken und Kanten
69 // 1 = Ecken und Kanten sind abgerundet
70 // 2 = nur Ecken sind abgerundet
71 // 3 = Ecken und Kanten fehlen
72 // 4 = Ecken fehlen, Kanten sind abgerundet
74 abrundungsgroesse = 0.7; // je kleiner desto runder (0.55 <= abrundungsgroesse <= 1.0)
76 koerperfarbe = "white"; // Farbe des Würfelkörper
77 kerbenfarbe = "white"; // Farbe der Ausschnitte
78 augenfarbe = "black"; // Farbe der Augen
79 punktfarbe = "black"; // Farbe der taktilen Punkte
81 ausschnittstyp = 1; // 1 = quadratischer Ausschnitt
82 // 2 = kreisförmiger Ausschnitt
83 // n (n > 2) = n-eckiger Ausschnitt
85 kerbe = 2; // Tiefe der ausgeschnittenen Bereiche (in mm)
86 ausschnitt = 13; // Seitenlänge der ausgeschnittenen Bereiche bei quadratischem Ausschnitt(in mm)
87 kreisdurchmesser = 7.5; // Durchmesser des Kreises bei kreisförmigem Ausschnitt (in mm)
89 abstand_kegelpunkte=4; // Abstand der erhabenen kegligen Punkte (in mm)
90 basis_kegelpunkte=1.5; // Basisdurchmesser der erhabenen kegligen Punkte (in mm)
91 kegelspitze=1; // Spitzheit der erhabenen kegligen Punkte (in mm)
94 // Zylinder, wenn gleicher Wert wie basis_kegelpunkte
96 abstand_kugelpunkte=4; // Abstand der kugligen Punkte (in mm
97 basis_kugelpunkte=1; // Basisdurchmesser der erhabenen kugligen Punkte (in mm)
98 // wird auf kerbe gesetzt, wenn er kleiner als diese Tiefe
100 augenabstand=4.5; // Abstand der Augen von der Mitte der Seiten (in mm) bei Seiten 11 bis 16
101 d_auge=3.5; // Durchmesser der Augen (in mm) bei Seiten 11 bis 16
103 strichdicke = 2.5; // Dicke des Striches bei Seiten 7 - 9,17 - 19, 30, 31, 33, 34
104 strichlaenge = 11; // Länge des Striches bei Seiten 7 - 9,17 - 19, 30, 31, 33, 34
105 ringgroesse = 10; // Durchmesser des inneren Kreises bei Seite 32 (in mm)
106 quadgroesse = 8; // Seitenlänge des inneren Quadrates bei Seite 27 (in mm)
108 //$fn = 70; // je größer desto genauer der Würfel
109 // je größer desto langsamer die Berechnung
110 // für Testzwecke auskommentieren
112 // Kopierbereich (hier fertige Vorlagen hineinkopieren)
116 // Ende Kopierbereich
119 // Ende der individuellen Einstellungen
120 // ab hier nichts verändern
125 punktpos=kante/2-kerbe;
130 module body_intersection (body_intersection_size) {
133 color(koerperfarbe) cube(size=kante,center=true);
134 color(koerperfarbe) sphere(r=kante*body_intersection_size, center=true);
136 color(augenfarbe) CutDice();
140 module body_union_ecken(kante_kl,eckradius) {
141 halbe_kante = kante_kl /2;
144 for(y = [halbe_kante,-halbe_kante])
145 translate([halbe_kante,y,halbe_kante])
146 sphere(eckradius,center=true);
149 module body_union_kanten(kante_kl, eckradius) {
150 halbe_kante = kante_kl /2;
153 for(y = [halbe_kante,-halbe_kante])
154 translate([halbe_kante,y,0])
155 cylinder(kante_kl,eckradius,eckradius,center=true);
158 translate([halbe_kante,0,halbe_kante])
160 cylinder(kante_kl,eckradius,eckradius,center=true);
163 module body_union_seiten(kante_kl, eckradius) {
166 translate([eckradius,0,0])
167 cube([kante_kl,kante_kl,kante_kl],center=true);
168 for(y = [eckradius,-eckradius])
170 cube([kante_kl,kante_kl,kante_kl],center=true);
174 module body_union(body_union_size)
177 kante_kl = kante * body_union_size;
178 eckradius = (kante - kante_kl) / 2;
182 body_union_ecken(kante_kl,eckradius);
183 body_union_kanten(kante_kl,eckradius);
184 body_union_seiten(kante_kl,eckradius);
186 color(augenfarbe) CutDice();
190 module body_union_ohne_ecken(body_union_size)
193 kante_kl = kante * body_union_size;
194 eckradius = (kante - kante_kl) / 2;
198 body_union_kanten(kante_kl,eckradius);
199 body_union_seiten(kante_kl,eckradius);
201 color(augenfarbe) CutDice();
205 module body_union_ohne_ecken_und_kanten(body_union_size)
208 kante_kl = kante * body_union_size;
209 eckradius = (kante - kante_kl) / 2;
213 body_union_seiten(kante_kl,eckradius);
215 color(augenfarbe) CutDice();
220 if (abgerundet == 0) body_intersection (1.0);
221 if (abgerundet == 1) body_union (abrundungsgroesse);
222 if (abgerundet == 2) body_intersection (abrundungsgroesse);
223 if (abgerundet == 3) body_union_ohne_ecken_und_kanten (abrundungsgroesse);
224 if (abgerundet == 4) body_union_ohne_ecken (abrundungsgroesse);
226 color(punktfarbe) AddPoints();
230 translate ([0,0,-kante/2]) cube([ausschnitt, ausschnitt, tiefe],center=true);
233 module cut_circle (n=0) {
235 translate ([0,0,-kante/2]) cylinder(tiefe,kreisdurchmesser,kreisdurchmesser, center=true);
238 translate ([0,0,-kante/2]) cylinder(tiefe,kreisdurchmesser,kreisdurchmesser, center=true, $fn=n);
243 module cut_strich () {
244 translate ([0,0,-kante/2]) cube([strichlaenge, strichdicke, tiefe],center=true);
247 module cut_slash () {
248 translate ([0,0,-kante/2]) rotate([0,0,-45]) cube([strichlaenge, strichdicke, tiefe],center=true);
252 translate ([0,0,-kante/2]) cube([strichlaenge, strichdicke, tiefe],center=true);
253 translate ([0,0,-kante/2]) cube([strichdicke, strichlaenge, tiefe],center=true);
254 translate ([0,0,-kante/2]) rotate([0,0,-45]) cube([strichlaenge, strichdicke, tiefe],center=true);
255 translate ([0,0,-kante/2]) rotate([0,0,45]) cube([strichlaenge, strichdicke, tiefe],center=true);
259 translate ([0,0,-kante/2]) rotate([0,0,-45]) cube([strichlaenge, strichdicke, tiefe],center=true);
260 translate ([0,0,-kante/2]) rotate([0,0,45]) cube([strichlaenge, strichdicke, tiefe],center=true);
264 translate ([0,0,-kante/2]) cube([strichlaenge, strichdicke, tiefe],center=true);
265 translate ([0,0,-kante/2]) cube([strichdicke, strichlaenge, tiefe],center=true);
269 module cut_pips1 () {
270 translate([0,0,r]) sphere(r=r2*1.4, center=true);
273 module cut_pips2 () {
274 translate([-augenabstand,augenabstand,r]) sphere(r=r2, center=true);
275 translate([augenabstand,-augenabstand,r]) sphere(r=r2, center=true);
278 module cut_pips3 () {
279 translate([-augenabstand,augenabstand,r]) sphere(r=r2, center=true);
280 translate([0,0,r]) sphere(r=r2, center=true);
281 translate([augenabstand,-augenabstand,r]) sphere(r=r2, center=true);
284 module cut_pips4 () {
285 translate([-augenabstand,augenabstand,r]) sphere(r=r2, center=true);
286 translate([augenabstand,-augenabstand,r]) sphere(r=r2, center=true);
287 translate([augenabstand,augenabstand,r]) sphere(r=r2, center=true);
288 translate([-augenabstand,-augenabstand,r]) sphere(r=r2, center=true);
291 module cut_pips5 () {
292 translate([-augenabstand,augenabstand,r]) sphere(r=r2, center=true);
293 translate([augenabstand,-augenabstand,r]) sphere(r=r2, center=true);
294 translate([0,0,r]) sphere(r=r2, center=true);
295 translate([augenabstand,augenabstand,r]) sphere(r=r2, center=true);
296 translate([-augenabstand,-augenabstand,r]) sphere(r=r2, center=true);
299 module cut_pips6 () {
300 translate([-augenabstand,augenabstand,r]) sphere(r=r2, center=true);
301 translate([augenabstand,-augenabstand,r]) sphere(r=r2, center=true);
302 translate([-augenabstand,0,r]) sphere(r=r2, center=true);
303 translate([augenabstand,0,r]) sphere(r=r2, center=true);
304 translate([augenabstand,augenabstand,r]) sphere(r=r2, center=true);
305 translate([-augenabstand,-augenabstand,r]) sphere(r=r2, center=true);
308 module add_strich () {
309 translate ([0,0,-kante/2+kerbe]) cube([strichlaenge, strichdicke, tiefe],center=true);
313 translate([0,0,-kante/2+kerbe]) cube([strichlaenge, strichdicke, tiefe],center=true);
314 translate([0,0,-kante/2+kerbe]) cube([strichdicke, strichlaenge, tiefe],center=true);
315 translate([0,0,-kante/2+kerbe]) rotate([0,0,-45]) cube([strichlaenge, strichdicke, tiefe],center=true);
316 translate([0,0,-kante/2+kerbe]) rotate([0,0,45]) cube([strichlaenge, strichdicke, tiefe],center=true);
320 translate([0,0,-kante/2+kerbe]) cube([strichlaenge, strichdicke, tiefe],center=true);
321 translate([0,0,-kante/2+kerbe]) cube([strichdicke, strichlaenge, tiefe],center=true);
326 module add_slash () {
327 translate([0,0,-kante/2+kerbe]) rotate([0,0,-45]) cube([strichlaenge, strichdicke, tiefe],center=true);
331 translate([0,0,-kante/2+kerbe]) rotate([0,0,-45]) cube([strichlaenge, strichdicke, tiefe],center=true);
332 translate([0,0,-kante/2+kerbe]) rotate([0,0,45]) cube([strichlaenge, strichdicke, tiefe],center=true);
336 translate([0,0,r]) cylinder(tiefe,ringgroesse/2,ringgroesse/2,center=false);
339 module add_prisma (n=3) {
340 groesse = strichlaenge / 2.3;
341 translate([0,0,-kante/2+kerbe]) cylinder(tiefe,groesse,groesse,center=true,$fn=n);
345 translate([0,0,-tiefe]) cube([quadgroesse, quadgroesse, 3*tiefe],center=true);
346 // translate([0,0,r]) cube(tiefe,35,35,center=true);
349 module add_sphere1 () {
351 rho = min (basis_kugelpunkte / 2, hoehe);
352 radius = max((pow(hoehe,2) + pow(rho,2)) / (2 * hoehe),hoehe);
354 translate([0,0,r+hoehe]) sphere(r=radius, center=true);
357 module add_sphere2 () {
359 rho = min (basis_kugelpunkte / 2, hoehe);
360 radius = max((pow(hoehe,2) + pow(rho,2)) / (2 * hoehe),hoehe);
361 translate([-abstand_kugelpunkte,abstand_kugelpunkte,r+hoehe]) sphere(r=radius, center=true);
362 translate([abstand_kugelpunkte,-abstand_kugelpunkte,r+hoehe]) sphere(r=radius, center=true);
365 module add_sphere3 () {
367 rho = min (basis_kugelpunkte / 2, hoehe);
368 radius = max((pow(hoehe,2) + pow(rho,2)) / (2 * hoehe),hoehe);
369 translate([-abstand_kugelpunkte,abstand_kugelpunkte,r+hoehe]) sphere(r=radius, center=true);
370 translate([0,0,r+hoehe]) sphere(r=radius, center=true);
371 translate([abstand_kugelpunkte,-abstand_kugelpunkte,r+hoehe]) sphere(r=radius, center=true);
373 module add_sphere4 () {
375 rho = min (basis_kugelpunkte / 2, hoehe);
376 radius = max((pow(hoehe,2) + pow(rho,2)) / (2 * hoehe),hoehe);
378 translate([-abstand_kugelpunkte,abstand_kugelpunkte,r+hoehe]) sphere(r=radius, center=true);
379 translate([abstand_kugelpunkte,-abstand_kugelpunkte,r+hoehe]) sphere(r=radius, center=true);
380 translate([abstand_kugelpunkte,abstand_kugelpunkte,r+hoehe]) sphere(r=radius, center=true);
381 translate([-abstand_kugelpunkte,-abstand_kugelpunkte,r+hoehe]) sphere(r=radius, center=true);
384 module add_sphere5 () {
386 rho = min (basis_kugelpunkte / 2, hoehe);
387 radius = max((pow(hoehe,2) + pow(rho,2)) / (2 * hoehe),hoehe);
388 translate([-abstand_kugelpunkte,abstand_kugelpunkte,r+hoehe]) sphere(r=radius, center=true);
389 translate([abstand_kugelpunkte,-abstand_kugelpunkte,r+hoehe]) sphere(r=radius, center=true);
390 translate([0,0,r+hoehe]) sphere(r=radius, center=true);
391 translate([abstand_kugelpunkte,abstand_kugelpunkte,r+hoehe]) sphere(r=radius, center=true);
392 translate([-abstand_kugelpunkte,-abstand_kugelpunkte,r+hoehe]) sphere(r=radius, center=true);
394 module add_sphere6 () {
396 rho = min (basis_kugelpunkte / 2, hoehe);
397 radius = max((pow(hoehe,2) + pow(rho,2)) / (2 * hoehe),hoehe);
398 translate([-abstand_kugelpunkte,abstand_kugelpunkte,r+hoehe]) sphere(r=radius, center=true);
399 translate([abstand_kugelpunkte,-abstand_kugelpunkte,r+hoehe]) sphere(r=radius, center=true);
400 translate([-abstand_kugelpunkte,0,r+hoehe]) sphere(r=radius, center=true);
401 translate([abstand_kugelpunkte,0,r+hoehe]) sphere(r=radius, center=true);
402 translate([abstand_kugelpunkte,abstand_kugelpunkte,r+hoehe]) sphere(r=radius, center=true);
403 translate([-abstand_kugelpunkte,-abstand_kugelpunkte,r+hoehe]) sphere(r=radius, center=true);
407 module add_pips1 () {
408 translate([0,0,r]) cylinder(tiefe,kegelspitze,basis_kegelpunkte);
411 module add_pips2 () {
412 translate([-abstand_kegelpunkte,abstand_kegelpunkte,r]) cylinder(tiefe,kegelspitze,basis_kegelpunkte);
413 translate([abstand_kegelpunkte,-abstand_kegelpunkte,r]) cylinder(tiefe,kegelspitze,basis_kegelpunkte);
416 module add_pips3 () {
417 translate([-abstand_kegelpunkte,abstand_kegelpunkte,r]) cylinder(tiefe,kegelspitze,basis_kegelpunkte);
418 translate([0,0,r]) cylinder(tiefe,kegelspitze,basis_kegelpunkte);
419 translate([abstand_kegelpunkte,-abstand_kegelpunkte,r]) cylinder(tiefe,kegelspitze,basis_kegelpunkte);
422 module add_pips4 () {
423 translate([-abstand_kegelpunkte,abstand_kegelpunkte,r]) cylinder(tiefe,kegelspitze,basis_kegelpunkte);
424 translate([abstand_kegelpunkte,-abstand_kegelpunkte,r]) cylinder(tiefe,kegelspitze,basis_kegelpunkte);
425 translate([abstand_kegelpunkte,abstand_kegelpunkte,r]) cylinder(tiefe,kegelspitze,basis_kegelpunkte);
426 translate([-abstand_kegelpunkte,-abstand_kegelpunkte,r]) cylinder(tiefe,kegelspitze,basis_kegelpunkte);
429 module add_pips5 () {
430 translate([-abstand_kegelpunkte,abstand_kegelpunkte,r]) cylinder(tiefe,kegelspitze,basis_kegelpunkte);
431 translate([abstand_kegelpunkte,-abstand_kegelpunkte,r]) cylinder(tiefe,kegelspitze,basis_kegelpunkte);
432 translate([0,0,r]) cylinder(tiefe,kegelspitze,basis_kegelpunkte);
433 translate([abstand_kegelpunkte,abstand_kegelpunkte,r]) cylinder(tiefe,kegelspitze,basis_kegelpunkte);
434 translate([-abstand_kegelpunkte,-abstand_kegelpunkte,r]) cylinder(tiefe,kegelspitze,basis_kegelpunkte);
437 module add_pips6 () {
438 translate([-abstand_kegelpunkte,abstand_kegelpunkte,r]) cylinder(tiefe,kegelspitze,basis_kegelpunkte);
439 translate([abstand_kegelpunkte,-abstand_kegelpunkte,r]) cylinder(tiefe,kegelspitze,basis_kegelpunkte);
440 translate([-abstand_kegelpunkte,0,r]) cylinder(tiefe,kegelspitze,basis_kegelpunkte);
441 translate([abstand_kegelpunkte,0,r]) cylinder(tiefe,kegelspitze,basis_kegelpunkte);
442 translate([abstand_kegelpunkte,abstand_kegelpunkte,r]) cylinder(tiefe,kegelspitze,basis_kegelpunkte);
443 translate([-abstand_kegelpunkte,-abstand_kegelpunkte,r]) cylinder(tiefe,kegelspitze,basis_kegelpunkte);
446 module make_ausschnitt () {
447 if (ausschnittstyp == 1) color(kerbenfarbe) cut_quad ();
448 if (ausschnittstyp == 2) color(kerbenfarbe) cut_circle ();
449 if (ausschnittstyp > 2) color(kerbenfarbe) cut_circle (n=ausschnittstyp);
453 module cut_weiche(variant) {
454 if (variant == 1) make_ausschnitt();
455 if (variant == 2) make_ausschnitt();
456 if (variant == 3) make_ausschnitt();
457 if (variant == 4) make_ausschnitt();
458 if (variant == 5) make_ausschnitt();
459 if (variant == 6) make_ausschnitt();
460 if (variant == 7) make_ausschnitt();
461 if (variant == 8) make_ausschnitt();
462 if (variant == 9) make_ausschnitt();
463 if (variant == 10) cut_quad ();
464 if (variant == 11) cut_pips1 (); // 1 Auge
465 if (variant == 12) cut_pips2 (); // 2 Augen
466 if (variant == 13) cut_pips3 (); // 3 Augen
467 if (variant == 14) cut_pips4 (); // 4 Augen
468 if (variant == 15) cut_pips5 (); // 5 Augen
469 if (variant == 16) cut_pips6 (); // 6 Augen
470 if (variant == 17) cut_strich ();
471 if (variant == 18) cut_plus ();
472 if (variant == 19) cut_slash ();
473 if (variant == 20) cut_circle ();
474 if (variant == 21) make_ausschnitt();
475 if (variant == 22) make_ausschnitt();
476 if (variant == 23) make_ausschnitt();
477 if (variant == 24) make_ausschnitt();
478 if (variant == 25) make_ausschnitt();
479 if (variant == 26) make_ausschnitt();
480 if (variant == 27) make_ausschnitt();
481 if (variant == 28) cut_circle (n=3);
482 if (variant == 29) cut_circle (n=5);
483 if (variant == 30) cut_x ();
484 if (variant == 31) make_ausschnitt();
485 if (variant == 32) make_ausschnitt();
486 if (variant == 33) cut_star ();
487 if (variant == 34) make_ausschnitt();
488 if (variant == 35) cut_circle (n=6);
489 if (variant == 36) cut_circle (n=7);
490 if (variant == 37) cut_circle (n=8);
491 if (variant == 38) make_ausschnitt();
492 if (variant == 39) make_ausschnitt();
493 if (variant == 40) make_ausschnitt();
494 if (variant == 41) make_ausschnitt();
495 if (variant == 42) make_ausschnitt();
499 cut_weiche(seite_unten);
502 module cut_hinten() {
504 cut_weiche(seite_hinten);
510 cut_weiche(seite_links);
514 module cut_rechts() {
516 cut_weiche(seite_rechts);
522 cut_weiche(seite_vorne);
526 module add_weiche(variant=0) {
527 if (variant == 1) add_pips1 (); // 1 keglige Punkt
528 if (variant == 2) add_pips2 (); // 2 keglige Punkte
529 if (variant == 3) add_pips3 (); // 3 keglige Punkt
530 if (variant == 4) add_pips4 (); // 4 keglige Punkte
531 if (variant == 5) add_pips5 (); // 5 keglige Punkte
532 if (variant == 6) add_pips6 (); // 6 keglige Punkte
533 if (variant == 7) add_strich (); // Taktiler Strich
534 if (variant == 8) add_plus (); // Taktiler Plus
535 if (variant == 9) add_slash (); // Taktiler Schrägstrich
536 if (variant == 21) add_sphere1 (); // 1 kugliger Punkt
537 if (variant == 22) add_sphere2 (); // 2 kuglige Punkte
538 if (variant == 23) add_sphere3 (); // 3 kuglige Punkte
539 if (variant == 24) add_sphere4 (); // 4 kuglige Punkte
540 if (variant == 25) add_sphere5 (); // 5 kuglige Punkte
541 if (variant == 26) add_sphere6 (); // 6 kuglige Punkte
542 if (variant == 27) add_quad (); // Taktiles Quadrat
543 if (variant == 31) add_x (); // Taktiles X
544 if (variant == 32) add_ring (); // Taktiler Ring
545 if (variant == 34) add_star (); // Taktiler Stern
546 if (variant == 38) add_prisma (n=3); // Taktiles Dreieck
547 if (variant == 39) add_prisma (n=5); // Taktiles Fünfeck
548 if (variant == 40) add_prisma (n=6); // Taktiles Sechseck
549 if (variant == 41) add_prisma (n=7); // Taktiles Siebeneck
550 if (variant == 42) add_prisma (n=8); // Taktiles Achteck
555 cut_weiche(seite_oben);
569 add_weiche(seite_unten);
572 module add_hinten() {
574 add_weiche(seite_hinten);
580 add_weiche(seite_links);
584 module add_rechts() {
586 add_weiche(seite_rechts);
592 add_weiche(seite_vorne);
598 add_weiche(seite_oben);