5. Objekte drehen
Bereits bekannte Befehle:
linear_extrude(6)
circle(7);
union() {...}
difference() {...}
color("#800000")
translate([20,20,0])
cube([10,20,1]);
5.1 rotate()
Uns fehlt noch ein ganz wichtiger Befehl für das Erstellen von Objekten: das Drehen. Gerade bei Zylindern konnten wir nur "stehende" Zylinder erstellen. Wie wird nun ein "liegender" Zylinder gemacht?
// drehen
$fn=60;
rotate([90,0,0])
linear_extrude(20)
circle(7);
Im Code sehen wir erneut $fn=60;. Dieser Wert muss nicht zwingend gesetzt werden, aber die Zylinder sehen dadurch schöner aus. Bei 3D-Druckprojekten empfiehlt es sich jedoch, diesen Wert etwas höher zu setzen. Allerdings: Je feiner die Kreise, desto mehr Rechenleistung benötigt der Computer. Bei größeren Projekten ist es daher ratsam, während der Entwicklung einen eher niedrigeren Wert zu verwenden – und erst vor dem Druck mit einem höheren Wert den Feinschliff vorzunehmen.

Der Befehl rotate([90,0,0]) funktioniert ähnlich wie `transpose()`. Drei Werte werden in eckigen Klammern angegeben: Der erste Wert steht für die Drehung um die x-Achse, der zweite für die Drehung um die y-Achse und der dritte für die Drehung um die z-Achse.
Wird ein Zylinder nur um die z-Achse gedreht, passiert eigentlich nichts – da er bereits um diese Achse symmetrisch ist. Bei einem cube() hingegen ist dies nicht der Fall, da die Form nicht rotationssymmetrisch um die z-Achse ist.
// drehen
rotate([0,0,90])
linear_extrude(20)
circle(7);
rotate([0,0,30])
cube([10,10,10]);
Wenn ein Würfel um 90° gedreht wird, ist die Drehung optisch – im Gegensatz zum Zylinder – nicht direkt erkennbar. Dennoch ändert sich seine Position: Der Würfel ist dann um seine Kantenlänge verschoben. Bereits bei einer Drehung von z. B. 30° um die z-Achse sieht man, wie er in den negativen Bereich „dreht“.

Dreht rotate() im Uhrzeigersinn oder Gegenuhrzeigersinn?
Dazu machen wir ein einfaches Beispiel: Wir drehen einen Zylinder um 20° um die y-Achse.
color("red")
rotate([0,20,0])
linear_extrude(20)
circle(6);
OK, es sieht nach Uhrzeigersinn aus!

Und ein Beispiel für die x Achse:
color("red")
rotate([30,0,0])
linear_extrude(20)
circle(6);
Das sieht aus, als würde es im Gegenuhrzeigersinn gedreht werden. Aber Vorsicht! Bei dieser Ansicht schauen wir nicht von minus x nach plus x.

Wenn wir – wie beim y-Beispiel – von der negativen zur positiven Achse schauen, stimmt die Drehrichtung wieder mit dem Uhrzeigersinn überein!

Spielt selbst mit rotate() und dreht die Ansicht im 3D-Fenster, um den Effekt zu erkennen.
5.2 rotate() kombiniert mit translate()
Das Drehen und Verschieben ist keine große Sache. Im Beispiel verschieben wir den Würfel um x=30 und drehen ihn – wie oben gezeigt – um z=30°.
translate([30,0,0])
rotate([0,0,30])
cube([10,10,10]);
Alles wie gewünscht: Der Würfel wird in x-Richtung verschoben und gedreht.

Wechseln wir doch die Reihenfolge von translate() und rotate(), geben dem neuen Würfel noch eine Farbe und lassen den ersten Würfel unverändert.
translate([30,0,0])
rotate([0,0,30])
cube([10,10,10]);
color("lime")
rotate([0,0,30])
translate([30,0,0])
cube([10,10,10]);

Ups, der neue Würfel ist ja an einem anderen Ort!
Ich muss zugeben: Das hat mich beim ersten Mal auch erstaunt. Die interne Logik von OpenSCAD funktioniert somit so:

Im Beispiel rechts wird beim rotate() das gesamte Koordinatensystem gedreht – und das translate() in x erfolgt entlang der gedrehten Achse. Der Befehl rotate() dreht somit die gesamte „Welt“ seiner „Kinder“ („child modules“).
5.3 Weitere Löcher bohren
Wie verwende ich rotate() um ein Loch horizontal mit einem Winkel von 45° in einen Würfel zu bohren? Der Würfel hat im Beispiel eine Kantenlänge von 20 mm. Das Loch mit Radius 6 mm soll diagonal (45°) und genau in der Mitte der Höhe durch den Würfel gehen.

Der erste Teil des Codes ist ja noch einfach.
difference() {
color("lime")
translate([0,0,0])
cube([20,20,20]);
color("red")
???
Doch wie muss das Loch gedreht und verschoben werden?
Schauen wir uns zunächst nur den Zylinder für das Bohrloch an: Wir kippen ihn um 90° um die y-Achse.
color("red")
rotate([0,90,0])
linear_extrude(20)
circle(6);
Fürs Erste liegt das Bohrloch bereits horizontal!

Nun soll es noch um die z-Achse gedreht werden.
color("red")
rotate([0,90,45])
linear_extrude(20)
circle(6);
Das funktioniert bereits ganz gut.

Nun muss es noch in die Höhe gehoben werden. Kommt dabei translate() vor oder nach rotate()?
Unter 5.2 haben wir gesehen: Es ist besser, translate() zuerst auszuführen, dann rotate(). Schaut noch einmal das Bild bei 5.2 an.

Das sieht schon vielversprechend aus!
Nun zeichnen wir den Würfel wieder – und ups...

Unsere Bohrung ist zu kurz. Der Würfel hat eine Kantenlänge von 20 mm – und auch der Zylinder (als Bohrloch) hat eine Höhe von 20 mm. Doch die Raumdiagonale des Würfels ist länger. Hier könnte uns der „Satz des Pythagoras“ helfen.
Alternativ können wir den linear_extrude() einfach so lange vergrößern, bis der Zylinder am Ende der Diagonalen herausragt.
color("red")
rotate([0,90,45])
linear_extrude(50)
circle(6);
50 ist zu lang, aber egal. Wenden wir nun difference() an – dann ist unser Loch endlich gebohrt.

difference() {
color("lime")
translate([0,0,0])
cube([20,20,20]);
color("red")
translate([0,0,10])
rotate([0,90,45])
linear_extrude(50)
circle(6);
}

Das Ganze hat noch einen kleinen Makel. Bei difference() sollte der Teil, der aus dem Hauptobjekt herausgefräst wird, tatsächlich etwas im Minus liegen. Beim Rahmenwürfel hatten wir dafür ein -0.1 mm verwendet.
Am einfachsten verschiebt man das Bohrloch im bereits rotierten Zustand. Denn rotate() dreht das gesamte Koordinatensystem – daher können wir nach rotate() ein weiteres translate() anwenden.
Doch welche Achse verschiebt das Bohrloch in die gewünschte Richtung? Es müsste in Pfeilrichtung verschoben werden.

Oh oh – dabei muss daran gedacht werden, dass der Zylinder mit rotate([0,90,45]) gedreht wurde. Dieses rotate() dreht das gesamte Koordinatensystem! Somit muss der Zylinder „zurückgedacht“ werden – also so, als wäre er noch nicht gedreht worden – bevor die Verschiebung erfolgt.
Im Beispiel wurden difference() und rotate() entfernt.
color("lime")
translate([0,0,0])
cube([20,20,20]);
color("red")
translate([0,0,10])
linear_extrude(30)
circle(6);
Ahh.. der Zylinder muss nach unten gezogen werden, also ins negative z.

difference() {
color("lime")
translate([0,0,0])
cube([20,20,20]);
color("red")
translate([0,0,10])
rotate([0,90,45])
translate([0,0,-1])
linear_extrude(50)
circle(6);
}
So sieht nun unser Würfel mit Loch aus.

Hier folgt keine Übung – denn das nächste Kapitel enthält nur Übungen, ohne weitere neue Funktionen.