17. 2D-Flächen mit rotate() in 3D-Objekte umwandeln

Bis anhin haben wir ein Polygon oder eine importierte SVG-Geometrie mit linear_extrude() in die Höhe getrieben. Es gibt aber auch einen Befehl rotate_extrude(), der eine 2D-Fläche im Kreis in die Höhe gehen lässt.

17.1 Ein *square()* mit *rotate()* expandieren

17.1.1 Erste Versuche

Gehen wir Schritt für Schritt das Beispiel durch. Als Erstes definieren wir ein square(). Ein square() ist eine 2D-Geometrie und kann darum mit rotate_extrude() weiterbearbeitet werden. cube() würde nicht gehen, da es bereits eine 3D-Geometrie ist!

square([20,5]);

Das Beispiel zeigt eine Fläche beim Nullpunkt mit x=20 und y=5. Die Dicke ist ein Standardwert, der eigentlich 0 sein müsste, aber eine minimale Dicke braucht, um im 3D-Raum darstellbar zu sein.

druckansicht

Soweit so gut. Nun wenden wir ein rotate_extrude() mit einem Winkel von 220 Grad an.

rotate_extrude(angle=220)
  square([20,5]);

Das Resultat erstaunt! Unsere Fläche wurde „aufgeklappt" und dann im Gegenuhrzeigersinn um 220 Grad extrudiert. OpenSCAD macht dies automatisch: Vor dem rotate_extrude() wird das 2D-Objekt um die x-Achse um 90 Grad hochgeklappt und dann um die z-Achse um den angegebenen Winkel extrudiert.

Das soll uns nicht verwirren – es ist einfach so.

druckansicht

Was, wenn wir das square() vor dem rotate_extrude() in x verschieben? Zuerst einmal ohne den rotate_extrude()-Befehl.

  translate([10,0,0])
    square([20,5]);

Im Bild ist das square() wieder liegend und um 10 in x verschoben.

druckansicht

Nun ergänzen wir das Ganze wieder mit rotate_extrude() und erhalten folgendes Objekt:

druckansicht

Was geschieht, wenn wir unser square() in den Minusbereich schieben?

rotate_extrude(angle=220)
  translate([-1,0,0])
    square([20,5]);

Oh, es erscheint eine Fehlermeldung:

ERROR: all points for rotate_extrude() must have the same X coordinate sign (range is -1.00 -> 19.00)

FEHLER: Alle Punkte für rotate_extrude() müssen das gleiche Vorzeichen der X-Koordinate haben (Bereich ist -1,00 bis 19,00).

druckansicht

Wenn das square() vollständig im Minus ist, dann funktioniert es!

druckansicht

17.2 Läuferkontur mit Affinity erstellen

Damit mit Affinity eine Kontur schnell erstellt werden kann, hilft es, ein Bild oder einen Querschnitt eines Läufers zu haben. Im Kapitel „9. Kugeln, Kegel und Pyramiden" habe ich bereits so ein Bild mit Figurenkonturen abgebildet. Das Bild habe ich mit Google gefunden, via PrintScreen ausgeschnitten und als *.jpg gespeichert.

druckansicht

Dazu wird die bereits erstellte Polygone-Datei geöffnet. Nun kann die *.jpg-Datei ganz einfach auf das Arbeitsblatt von Affinity gezogen werden.

druckansicht

Nun können wir wie beim Polygon eine Punktreihe um die Kontur machen:

druckansicht

Wie im Kapitel 16.2 „2D-Konturen durch SVG-Import" beschrieben, können mit dem „Bearbeitungspfeil" die einzelnen Punkte verschoben oder die Linien verbogen werden. Auch die Ankerpunkte der gebogenen Linien können so angepasst werden.

Auf diese Art arbeitet man sich von Punkt zu Punkt und passt die Kontur an die Kontur des Bildes an. Mit dem „Bearbeitungspfeil" können auch weitere Punkte in eine Linie eingefügt werden. Ein Doppelklick an einer beliebigen Stelle der Linie genügt. Ein Punkt wird gelöscht, indem man ihn mit dem „Bearbeitungspfeil" selektiert und die Entf-Taste drückt.

druckansicht

Die Linien zwischen den Punkte unserer Kontur waren zu Beginn immer gerade und die Punkte waren Eckpunkte ohne Ankerpunkte. Soll ein Punkt aber Ankerpunkte erhalten kann ein selektierter Punkt mit den drei Funktionen "Umwandeln" zum Beispiel "in Glatt umwandeln" umgewandelt werden.

druckansicht

Am Ende der Anpassung sieht die Kontur nun so aus:

druckansicht

Zum Abschluss wird die Kontur selektiert und, wie schon gezeigt, als SVG-Datei gespeichert. Alle Einstellungen sollen wie bereits im letzten Kapitel vorgenommen worden sein.

druckansicht

Die Datei soll am besten wieder im gleichen Unterverzeichnis wie unsere OpenSCAD-Datei gespeichert werden. So kann der Pfad zur SVG-Datei weggelassen werden.

druckansicht

17.3 Importieren der SVG-Kontur

Wieder zurück im OpenSCAD-Editor laden wir die SVG-Datei und versuchen es mit rotate_extrude(). Damit die Kreise fein daherkommen, setzen wir $fn=80;.

$fn=80;

rotate_extrude(angle=360)
  import("Lauf.svg");

Sehr schön!!

druckansicht

Nun hat der Läufer noch einen „Schnitt im Kopf".

druckansicht

Wir können hier ein ganz normales difference() benutzen. Da aber nicht klar ist wie gross die Figure eingentlich ist und wo genau der Schnitt sein soll, schreibe ich noch kein difference() und zeichne den cube() in Schwarz.

rotate_extrude(angle=360)
  import("Lauf.svg");
  
color("black")
  translate([0,0,0])
    cube([10,40,40]);

Der Schnitt steht bei Punkt 0 des Koordinatensystems. Die Figur scheint ordentlich gross zu sein und ist zentriert.

druckansicht

Wir können den cube() auch zentrieren … und etwas grösser machen … und etwas nach oben schieben.

color("black")
  translate([0,0,60])
    cube([10,60,60], center = true);

Besser, aber immer noch zu klein und zu weit unten.

druckansicht

Da die Grösse der Figur nicht bekannt ist, spiele ich einfach mit den Werten, bis es ungefähr passt.

color("black")
  translate([-10,0,210])
    cube([10,80,80], center = true);

druckansicht

Nun fehlt noch ein wenig rotate() … und die verschiedenen Werte noch etwas feinjustiert.

$fn=80;

difference() {
rotate_extrude(angle=360)
  import("Lauf.svg");
  
color("black")
  translate([-14,0,210])
    rotate([0,-8,0])
      cube([8,80,80], center = true);
}

druckansicht

Genial! Setzen wir die Figur doch gleich so in unser Schachbrett ein! Dazu wird die italienische Eröffnung und die figuren_library.scad geöffnet. Im module lauf() wird der ganze Code mit Ausnahme des ersten translate() und color() mit dem neuen Code ersetzt.

module lauf(x,y,farbe) {
  translate([(x-1)*feld+feld/2,(y-1)*feld+feld/2,dick+19]) {
    color(farbe) {
      difference() {
      rotate_extrude(angle=360)
        import("Lauf.svg");
        
      color("black")
        translate([-14,0,210])
          rotate([0,-8,0])
            cube([8,80,80], center = true);
      }
    }
  }
}

Speichern und in der Lernen_14_schach_italienisch.scad mit F5 neu rendern und …

druckansicht

ups, der Läufer ist viel zu gross.

17.4 scale() und resize()

Es gibt noch zwei Befehle, um die Grösse von Objekten zu verändern. Versuchen wir es mit scale(). Mit scale() kann dann ein Wert für x, y und z angegeben werden, zum Beispiel scale([0.14, 0.14, 0.14]). Wenn jedoch alle Werte gleich sind, braucht es nur ein scale(0.14). Den Wert 0.14 habe ich durch Ausprobieren festgelegt!

//----------------------------------------
module lauf(x,y,farbe) {
  translate([(x-1)*feld+feld/2,(y-1)*feld+feld/2,dick+19]) {
    scale(0.14) {
      color(farbe) {
        difference() {
        rotate_extrude(angle=360)
          import("Lauf.svg");
          
        color("black")
          translate([-14,0,210])
            rotate([0,-8,0])
              cube([8,80,80], center = true);
        }
      }
    }
  }
}

Passt, aber die Figur schwebt noch über dem Brett.

druckansicht

Das +19 brauchen wir bei translate() nicht …

//----------------------------------------
module lauf(x,y,farbe) {
  translate([(x-1)*feld+feld/2,(y-1)*feld+feld/2,dick+19]) {
  ...

Fertig ist unser Läufer!

druckansicht

PS: wir könnten auch resize() anwenden, aber diese Funktion ist sehr rechenintensiv und bringt bei dieser Anwendung nichts.