Openscad Tutorial: Unterschied zwischen den Versionen

Aus RaumZeitLabor Wiki
(erste Bilder hinzugefügt)
(Letzter Artikel ergänzt, Fehler rausgemacht, fertiggestellt)
Zeile 1: Zeile 1:
{{ProjektInfoBox
{{ProjektInfoBox
|name        = Openscad Tutorial
|name        = Openscad Tutorial
|status      = beta
|status      = stable
|image      = Ghost-T08.png
|image      = Ghost-T08.png
|description = Ein Projekt zum schnellen Lernen von OPENSCAD
|description = Ein Projekt zum schnellen Lernen von OPENSCAD
Zeile 13: Zeile 13:
}}
}}


== Openscad Tutorial ==
= Openscad Tutorial =


=== Einleitung ===
Auf Basis der Einführung von thinkjd http://www.youtube.com/watch?v=v1_h0gADm5E findet ihr hier ein Projekt für den Einstieg in openscad. Wenn ihr es durchgearbeitet habt seid ihr fit im Umgang mit openscad. Basis ist ein kleiner Geist. Ihr findet ihn unter: http://www.thingiverse.com/thing:27287 Wenn ihr ihn mit unserem Ultimaker druckt oder beim rumprobieren Veränderungen durchführt, dann posted das dort unter "I made a derivate" oder "I made a thing", dann hat jeder was davon.
Auf Basis der Einführung von thinkjd http://www.youtube.com/watch?v=v1_h0gADm5E findet ihr hier ein Projekt für den Einstieg in openscad. Wenn ihr es durchgearbeitet habt seid ihr fit im Umgang mit openscad. Basis ist ein kleiner Geist. Ihr findet ihn unter: http://www.thingiverse.com/thing:27287 Wenn ihr ihn mit unserem Ultimaker druckt oder beim rumprobieren Veränderungen durchführt, dann posted das dort unter "I made a derivate" oder "I made a thing", dann hat jeder was davon.


Zeile 22: Zeile 21:
Kopiert den unten angezeigten Quelltext einfach in euer openscad und drückt F5, im rechten Vorschaubereich seht ihr dann das jeweilige Ergebnis.
Kopiert den unten angezeigten Quelltext einfach in euer openscad und drückt F5, im rechten Vorschaubereich seht ihr dann das jeweilige Ergebnis.


=== 1. Der Kopf ===
= Der Kopf =
Der Kopf besteht aus zwei Elementen, dem Körper (einem Zylinder) und der Halbkugel oben
Der Kopf besteht aus zwei Elementen, dem Körper (einem Zylinder) und der Halbkugel oben


'''Lernziel: Basisobjekte (Kubus, Kugel, Zylinder), Differenzen, Positionierung, Module'''
'''Lernziel: Basisobjekte (Kubus, Kugel, Zylinder), Differenzen, Positionierung, Module'''


==== Halbkugel oben ====
== Halbkugel oben ==
* Zuerst erstellen wir eine Kugel
* Zuerst erstellen wir eine Kugel
* von der Kugel ziehen wir im Zentrum eine kleinere Kugel ab
* von der Kugel ziehen wir im Zentrum eine kleinere Kugel ab
Zeile 58: Zeile 57:
</code>
</code>


==== Der Körper ====
== Der Körper ==
* Jetzt verschieben wir die Halbkugel nach oben
* Jetzt verschieben wir die Halbkugel nach oben
* Wir nehmen einen Zylinder
* Wir nehmen einen Zylinder
Zeile 83: Zeile 82:
</code>
</code>


==== Modularisierung / Paramterisierung ====
== Modularisierung / Paramterisierung ==
Da wir den Geist skalierbar machen wollen, packen wir ihn nun noch in ein Modul und vergeben anstatt fester Werte Variablen.
Da wir den Geist skalierbar machen wollen, packen wir ihn nun noch in ein Modul und vergeben anstatt fester Werte Variablen.
[[Datei:Ghost-T04.png|miniatur]]
[[Datei:Ghost-T04.png|miniatur]]
Zeile 111: Zeile 110:
</code>
</code>


=== 2. Die Augen ===  
= Die Augen =  


Die Augen sind zwei Zylinder die von dem Körper abgezogen werden. Sie sind in der Höhe veränderbar, auch der Augenabstand ist einstellbar.
Die Augen sind zwei Zylinder die von dem Körper abgezogen werden. Sie sind in der Höhe veränderbar, auch der Augenabstand ist einstellbar.
Zeile 164: Zeile 163:
</code>
</code>


=== 3. Die Nase ===  
= Die Nase =  
Die Nase soll ebenfalls skalierbar sein. Höhe und Größe möchten wir einstellen können.
Die Nase soll ebenfalls skalierbar sein. Höhe und Größe möchten wir einstellen können.


Zeile 228: Zeile 227:




=== 4. Der Mund ===  
= Der Mund =  


Beim Mund wollen wir neben Größe und Position auch noch bestimmen ob wir einen fröhlichen, einen traurigen oder einen erchreckten Geist haben. Dazu bauen wir nicht nur einen Mund sondern gleich drei Münder und entscheiden dann anhand eines Parameters welcher von diesen Mündern angezeigt werden soll.
Beim Mund wollen wir neben Größe und Position auch noch bestimmen ob wir einen fröhlichen, einen traurigen oder einen erchreckten Geist haben. Dazu bauen wir nicht nur einen Mund sondern gleich drei Münder und entscheiden dann anhand eines Parameters welcher von diesen Mündern angezeigt werden soll.
Zeile 323: Zeile 322:
   
   
  ghost(7,15,1,1.5,3.5,12,1,9,3,7,1);
  ghost(7,15,1,1.5,3.5,12,1,9,3,7,1);
</code>
= Variationen, $fs, $fa =
Nun zu einer etwas schöneren / glatteren Ausgabe. Bis jetzt ist der Geist noch zu eckig, wir können die Einstellung zum Rendern mit $fs und $fa ändern.
$fa berechnet bei einem Kreis aus wieviel einzelnen Segmenten er zusammengesetzt wird. 360 geteilt durch $fa ergibt diese Anzahl, der kleinste Wert ist 0.01.
$fs liegt zwischen 2 und 0.01, auch hier kann eingestellt werden wie glatt die Oberfläche werden kann. $fs bestimmt die Größe eines Segments, gerade beim Skalieren des gesamten Models kann hier die Einstellung für den gewünschten Grad eingestellt werden
Die Zeit zum Rendern vergrößert sich bei kleinem $fa / $fs stark.
Zum Schluss einfach noch einige Varianten des Geistes.
[[Datei:Ghost-T08.png|miniatur]]
<code>
module head(headradius,headheight,headthickness)
{
translate([0,0,headheight])
difference()
{
difference()
{
sphere(r=headradius);
sphere(r=headradius-headthickness);
}
translate([-headradius-1,-headradius-1,-headradius*2-2])
cube(headradius*2+2,headradius*2+2,headradius+1);
}
difference()
{
cylinder(h=headheight, r=headradius);
translate([0,0,-1])
cylinder(h=headheight+2, r=headradius-headthickness);
}
}
module eyes(eyesize, eyedistance, eyeheight,headradius)
{
translate([eyedistance,headradius,eyeheight])
rotate([90,0,0])
cylinder(h=headradius, r=eyesize);
translate([-eyedistance,headradius,eyeheight])
rotate([90,0,0])
cylinder(h=headradius, r=eyesize);
}
module nose(nosesize,noseheight,headradius)
{
translate([0,headradius,noseheight])
rotate([90,0,0])
linear_extrude(height=headradius)
polygon(points = [ [-nosesize, 0], [nosesize, 0], [0, 2*nosesize]]);
}
module mouth(mouthsize,mouthheight,mood,headradius)
{
translate([0,0,mouthheight])
rotate([270,0,0])
if(mood==0)
{
cylinder(h=headradius, r=mouthsize);
}
else
{
if (mood==1)
{
difference()
{
cylinder(h=headradius, r=mouthsize);
translate([-mouthsize,-2*mouthsize,0])
cube([2*mouthsize,2*mouthsize,headradius+1]);
}
}
else
{
if (mood==2)
{
difference()
{
cylinder(h=headradius, r=mouthsize);
translate([-mouthsize,0,0])
cube([2*mouthsize,2*mouthsize,headradius+1]);
}
}
}
}
}
module ghost(headradius, headheight, headthickness, eyesize, eyedistance, eyeheight, nosesize, noseheight, mouthsize, mouthheight,  mood)
{
difference()
{
head(headradius, headheight, headthickness);
eyes(eyesize, eyedistance, eyeheight, headradius);
nose(nosesize, noseheight, headradius);
mouth(mouthsize, mouthheight, mood, headradius);
}
}
$fs=0.5;
$fa=0.5;
ghost(7,15,1,1.5,3.5,12,1,9,3,7,1);
translate([15,0,0])
ghost(4,25,1,0.5,1,18,0.5,15,1,13,1);
translate([32,0,0])
ghost(10,15,2,3,5,12,1,9,3,5,0);
translate([50,0,0])
ghost(6,12,1,1.5,3.5,12,2,7.5,3,3,2);
</code>
</code>

Version vom 25. August 2012, 20:00 Uhr

               
Openscad Tutorial

Release status: stable [box doku]

Beschreibung Ein Projekt zum schnellen Lernen von OPENSCAD
Autor(en)  Kristian
Besitzer  Kristian
Verantwortliche(r)  Kristian
Letzte Version  0.1
Plattform  openscad
Lizenz  cc
Download  http://www.thingiverse.com/download:81175

Openscad Tutorial

Auf Basis der Einführung von thinkjd http://www.youtube.com/watch?v=v1_h0gADm5E findet ihr hier ein Projekt für den Einstieg in openscad. Wenn ihr es durchgearbeitet habt seid ihr fit im Umgang mit openscad. Basis ist ein kleiner Geist. Ihr findet ihn unter: http://www.thingiverse.com/thing:27287 Wenn ihr ihn mit unserem Ultimaker druckt oder beim rumprobieren Veränderungen durchführt, dann posted das dort unter "I made a derivate" oder "I made a thing", dann hat jeder was davon.

Der Geist ist skalierbar und änderbar. Du kannst Dir also Deinen Wunschgeist zusammenbauen. Achtung wenn Du den Geist später mit dem 3D-Drucker drucken möchtest musst Du auf ein paar Stellen aufpassen. Beispielsweise ist die Oberkante des lachenden Mundes (s.u.) eine horizontale Linie. Wenn diese Strecke zu groß wird, dann "sackt" sie durch.

Kopiert den unten angezeigten Quelltext einfach in euer openscad und drückt F5, im rechten Vorschaubereich seht ihr dann das jeweilige Ergebnis.

Der Kopf

Der Kopf besteht aus zwei Elementen, dem Körper (einem Zylinder) und der Halbkugel oben

Lernziel: Basisobjekte (Kubus, Kugel, Zylinder), Differenzen, Positionierung, Module

Halbkugel oben

  • Zuerst erstellen wir eine Kugel
  • von der Kugel ziehen wir im Zentrum eine kleinere Kugel ab
  • übrig bleibt eine hohle Kugel
  • unter der hohlen Halbkugel positionieren wird jetzt einen Kubus

difference()
{ 
	sphere(r=10);
	sphere(r=9);
}
translate([-11,-11,-22])
cube(22,22,11);

  • von der hohlen Kugel ziehen wir nun wiederum einen großen Kubus ab
  • übrig bleibet eine Halbkugel

difference()
{
       difference()
       { 
       	sphere(r=10);
       	sphere(r=9);
       }
       translate([-11,-11,-22])
       cube(22,22,11);
}

Der Körper

  • Jetzt verschieben wir die Halbkugel nach oben
  • Wir nehmen einen Zylinder
  • Wir ziehen von dem Zylinder einen kleineren Zylinder im Inneren ab

translate([0,0,15])
difference()
{
	difference()
	{
		sphere(r=10);
		sphere(r=9);
	}
	translate([-11,-11,-22])
	cube(22,22,11);
}
difference()
{
	cylinder(h=15, r=10);
	translate([0,0,-1])
	cylinder(h=17, r=9);
}

Modularisierung / Paramterisierung

Da wir den Geist skalierbar machen wollen, packen wir ihn nun noch in ein Modul und vergeben anstatt fester Werte Variablen.

module head(headradius,headheight,headthickness)
{
	translate([0,0,headheight])
	difference()
	{
		difference()
		{
			sphere(r=headradius);
			sphere(r=headradius-headthickness);
		}
		translate([-headradius-1,-headradius-1,-headradius*2-2])
		cube(headradius*2+2,headradius*2+2,headradius+1);
	}
	difference()
	{
		cylinder(h=headheight, r=headradius);
		translate([0,0,-1])
		cylinder(h=headheight+2, r=headradius-headthickness);
	}
}

head(7,15,1);

Die Augen

Die Augen sind zwei Zylinder die von dem Körper abgezogen werden. Sie sind in der Höhe veränderbar, auch der Augenabstand ist einstellbar.

Lernziel: Rotation

- Wir erstellen jeweils einen Zylinder, rotieren ihn und bringen ihn in die richtige Position, dann wird er abgezogen und die Ausschnitte im Kopf entstehen.

module head(headradius,headheight,headthickness)
{
	translate([0,0,headheight])
	difference()
	{
		difference()
		{
			sphere(r=headradius);
			sphere(r=headradius-headthickness);
		}
		translate([-headradius-1,-headradius-1,-headradius*2-2])
		cube(headradius*2+2,headradius*2+2,headradius+1);
	}
	difference()
	{
		cylinder(h=headheight, r=headradius);
		translate([0,0,-1])
		cylinder(h=headheight+2, r=headradius-headthickness);
	}
}

module eyes(eyesize, eyedistance, eyeheight,headradius)
{
	translate([eyedistance,headradius,eyeheight])
	rotate([90,0,0])
	cylinder(h=headradius, r=eyesize);
	translate([-eyedistance,headradius,eyeheight])
	rotate([90,0,0])
	cylinder(h=headradius, r=eyesize);
}

module ghost(headradius, headheight, headthickness, eyesize, eyedistance, eyeheight)
{
	difference()
	{
		head(headradius, headheight, headthickness);
		eyes(eyesize, eyedistance, eyeheight, headradius);
	}
}

ghost(7,15,1,1.5,3.5,12);

Die Nase

Die Nase soll ebenfalls skalierbar sein. Höhe und Größe möchten wir einstellen können.

Lernziel: Polygone (2D) und extrudieren

  • Wir erstellen ein 2D Polygon als Dreieck.
  • Wir extrudieren das Dreieck
  • Wir rotieren und positioneren es an der richtigen Stelle und ziehen es wirder von unserem Geist ab

module head(headradius,headheight,headthickness)
{
	translate([0,0,headheight])
	difference()
	{
		difference()
		{
			sphere(r=headradius);
			sphere(r=headradius-headthickness);
		}
		translate([-headradius-1,-headradius-1,-headradius*2-2])
		cube(headradius*2+2,headradius*2+2,headradius+1);
	}
	difference()
	{
		cylinder(h=headheight, r=headradius);
		translate([0,0,-1])
		cylinder(h=headheight+2, r=headradius-headthickness);
	}
}

module eyes(eyesize, eyedistance, eyeheight,headradius)
{
	translate([eyedistance,headradius,eyeheight])
	rotate([90,0,0])
	cylinder(h=headradius, r=eyesize);
	translate([-eyedistance,headradius,eyeheight])
	rotate([90,0,0])
	cylinder(h=headradius, r=eyesize);
}

module nose(nosesize,noseheight,headradius)
{
	translate([0,headradius,noseheight])
	rotate([90,0,0])
	linear_extrude(height=headradius)
	polygon(points = [ [-nosesize, 0], [nosesize, 0], [0, 2*nosesize]]);
}

module ghost(headradius, headheight, headthickness, eyesize, eyedistance, eyeheight, nosesize, noseheight)
{
	difference()
	{
		head(headradius, headheight, headthickness);
		eyes(eyesize, eyedistance, eyeheight, headradius);
		nose(nosesize, noseheight, headradius);
	}
}

ghost(7,15,1,1.5,3.5,12,1,9,3,7);


Der Mund

Beim Mund wollen wir neben Größe und Position auch noch bestimmen ob wir einen fröhlichen, einen traurigen oder einen erchreckten Geist haben. Dazu bauen wir nicht nur einen Mund sondern gleich drei Münder und entscheiden dann anhand eines Parameters welcher von diesen Mündern angezeigt werden soll.

Der erschreckte Ausdruck ist einfach ein gedrehter und verschobener Zylinder, der wieder von unserem Kopf abgezogen wird. Beim Lachen wird vorher oben mittels eines Kubus die obere Hälfte abgeschnitten, beim traurigen Mund unten.

Lernziel: Bedingungen (inklusive geschachtelter Bedinungen)

module head(headradius,headheight,headthickness)
{
	translate([0,0,headheight])
	difference()
	{
		difference()
		{
			sphere(r=headradius);
			sphere(r=headradius-headthickness);
		}
		translate([-headradius-1,-headradius-1,-headradius*2-2])
		cube(headradius*2+2,headradius*2+2,headradius+1);
	}
	difference()
	{
		cylinder(h=headheight, r=headradius);
		translate([0,0,-1])
		cylinder(h=headheight+2, r=headradius-headthickness);
	}
}

module eyes(eyesize, eyedistance, eyeheight,headradius)
{
	translate([eyedistance,headradius,eyeheight])
	rotate([90,0,0])
	cylinder(h=headradius, r=eyesize);
	translate([-eyedistance,headradius,eyeheight])
	rotate([90,0,0])
	cylinder(h=headradius, r=eyesize);
}

module nose(nosesize,noseheight,headradius)
{
	translate([0,headradius,noseheight])
	rotate([90,0,0])
	linear_extrude(height=headradius)
	polygon(points = [ [-nosesize, 0], [nosesize, 0], [0, 2*nosesize]]);
}

module mouth(mouthsize,mouthheight,mood,headradius)
{
	translate([0,0,mouthheight])
	rotate([270,0,0])
	if(mood==0)
	{
		cylinder(h=headradius, r=mouthsize);
	} 
	else 
	{
		if (mood==1)
		{
			difference()
			{
				cylinder(h=headradius, r=mouthsize);
				translate([-mouthsize,-2*mouthsize,0])
				cube([2*mouthsize,2*mouthsize,headradius+1]);
			}
		}
		else
		{
			if (mood==2)
			{
				difference()
				{
					cylinder(h=headradius, r=mouthsize);
					translate([-mouthsize,0,0])
					cube([2*mouthsize,2*mouthsize,headradius+1]);
				}
			}
		}
	}
}

module ghost(headradius, headheight, headthickness, eyesize, eyedistance, eyeheight, nosesize, noseheight, mouthsize, mouthheight,  mood)
{
	difference()
	{
		head(headradius, headheight, headthickness);
		eyes(eyesize, eyedistance, eyeheight, headradius);
		nose(nosesize, noseheight, headradius);
		mouth(mouthsize, mouthheight, mood, headradius);
	}
}

ghost(7,15,1,1.5,3.5,12,1,9,3,7,1);

Variationen, $fs, $fa

Nun zu einer etwas schöneren / glatteren Ausgabe. Bis jetzt ist der Geist noch zu eckig, wir können die Einstellung zum Rendern mit $fs und $fa ändern.

$fa berechnet bei einem Kreis aus wieviel einzelnen Segmenten er zusammengesetzt wird. 360 geteilt durch $fa ergibt diese Anzahl, der kleinste Wert ist 0.01.

$fs liegt zwischen 2 und 0.01, auch hier kann eingestellt werden wie glatt die Oberfläche werden kann. $fs bestimmt die Größe eines Segments, gerade beim Skalieren des gesamten Models kann hier die Einstellung für den gewünschten Grad eingestellt werden

Die Zeit zum Rendern vergrößert sich bei kleinem $fa / $fs stark.

Zum Schluss einfach noch einige Varianten des Geistes.

module head(headradius,headheight,headthickness)
{
	translate([0,0,headheight])
	difference()
	{
		difference()
		{
			sphere(r=headradius);
			sphere(r=headradius-headthickness);
		}
		translate([-headradius-1,-headradius-1,-headradius*2-2])
		cube(headradius*2+2,headradius*2+2,headradius+1);
	}
	difference()
	{
		cylinder(h=headheight, r=headradius);
		translate([0,0,-1])
		cylinder(h=headheight+2, r=headradius-headthickness);
	}
}

module eyes(eyesize, eyedistance, eyeheight,headradius)
{
	translate([eyedistance,headradius,eyeheight])
	rotate([90,0,0])
	cylinder(h=headradius, r=eyesize);
	translate([-eyedistance,headradius,eyeheight])
	rotate([90,0,0])
	cylinder(h=headradius, r=eyesize);
}

module nose(nosesize,noseheight,headradius)
{
	translate([0,headradius,noseheight])
	rotate([90,0,0])
	linear_extrude(height=headradius)
	polygon(points = [ [-nosesize, 0], [nosesize, 0], [0, 2*nosesize]]);
}

module mouth(mouthsize,mouthheight,mood,headradius)
{
	translate([0,0,mouthheight])
	rotate([270,0,0])
	if(mood==0)
	{
		cylinder(h=headradius, r=mouthsize);
	} 
	else 
	{
		if (mood==1)
		{
			difference()
			{
				cylinder(h=headradius, r=mouthsize);
				translate([-mouthsize,-2*mouthsize,0])
				cube([2*mouthsize,2*mouthsize,headradius+1]);
			}
		}
		else
		{
			if (mood==2)
			{
				difference()
				{
					cylinder(h=headradius, r=mouthsize);
					translate([-mouthsize,0,0])
					cube([2*mouthsize,2*mouthsize,headradius+1]);
				}
			}
		}
	}
}

module ghost(headradius, headheight, headthickness, eyesize, eyedistance, eyeheight, nosesize, noseheight, mouthsize, mouthheight,  mood)
{
	difference()
	{
		head(headradius, headheight, headthickness);
		eyes(eyesize, eyedistance, eyeheight, headradius);
		nose(nosesize, noseheight, headradius);
		mouth(mouthsize, mouthheight, mood, headradius);
	}
}

$fs=0.5;
$fa=0.5;

ghost(7,15,1,1.5,3.5,12,1,9,3,7,1);

translate([15,0,0])
ghost(4,25,1,0.5,1,18,0.5,15,1,13,1);

translate([32,0,0])
ghost(10,15,2,3,5,12,1,9,3,5,0);

translate([50,0,0])
ghost(6,12,1,1.5,3.5,12,2,7.5,3,3,2);