image: title.webp

3D-Grafik mit Anaglyphen

Anaglyphen sind Bilder, bei denen zwei Bilder in verschiedenen Farben übereinandergelegt werden, um einen 3D-Effekt zu erzeugen. Farbfilter in der 3D-Brille trennen die beiden Bilder, sodass jedes Auge nur eines der Bilder sieht. Dadurch entsteht der Eindruck von Tiefe und räumlicher Wahrnehmung. In diesem Tutorial lernst du, wie du verschiedene Körper in 3D mit Anaglyphen darstellen kannst.

Stelle zuerst sicher, dass du keinen Ordner geöffnet hast. Um sicherzugehen, drücke einfach den Shortcut für »Ordner schließen«: StrgK und dann F. Dein Work­space sollte jetzt ungefähr so aussehen:

1. Repository klonen

Für diese Anleitung brauchst du ein Repository, das du klonen kannst, indem du auf den blauen Button »Clone Repository« klickst. Gib die folgende URL ein und bestätige mit Enter:

https://github.com/specht/anaglyph.git

Als nächstes musst du angeben, in welches Verzeichnis du das Repository klonen möch­test. Bestätige den Standardpfad /workspace/ mit Enter.

Beantworte die Frage »Would you like to open the repository?« mit »Open«.

Wenn du auf der linken Seite im Explorer nun die Datei scene.ini siehst, hast du alles richtig gemacht. Diese Datei enthält die Anweisungen für die 3D-Szene, die du erstellen wirst.

2. Vor­schau starten

Im Work­space ist bereits die Er­wei­te­rung »Live Server« installiert. Unten rechts findest du den Eintrag »Go Live«. Klicke darauf, um die Vor­schau zu starten. Es öffnet sich ein neuer Tab in deinem Browser mit deiner 3D-Szene, die anfangs nur aus einem einzigen Würfel besteht.

Tipp: Ziehe deinen Work­space und die Vor­schau nebeneinander, damit du deine Änderungen live sehen kannst.

3. Geometrische Objekte

Du solltest einen Würfel sehen, der in der Mitte des Bildschirms schwebt. Benutze die Maus, um die Szene zu drehen und zu zoomen.

Ein weißer Würfel schwebt im Raum.

Öffne die Datei scene.ini, indem du drauf klickst. Du solltest nun den Inhalt der Datei sehen, der ungefähr so aussieht:

shape = box

Ändere den Wert box in sphere, um den Würfel durch eine Kugel zu ersetzen:

shape = sphere

Speichere die Datei mit StrgS und schaue dir die Vor­schau an. Du solltest nun eine Kugel sehen:

Eine weiße Kugel schwebt im Raum.
Falls sich die Vor­schau nicht automatisch aktualisiert, klicke auf den »Refresh«-Button in deinem Browser oder drücke F5.

Probiere auch andere Formen aus, indem du den Wert für shape änderst. Hier sind die Formen, die du verwenden kannst:

  • box für einen Würfel
  • sphere für eine Kugel
  • cylinder für einen Zylinder
  • cone für einen Kegel
  • torus für einen Torus (Ring)
  • teapot für den Utah Teapot
  • plane für ein Quadrat

Zusätzlich zu den geometrischen Körpern kannst auch ein Gitter anzeigen, indem du shape = grid einfügst:

shape = grid
shape = sphere
Eine Kugel aus Gitternetzlinien schwebt über einem quadratischen Gitter.

Du kannst auch mehrere Formen kombinieren, indem du sie untereinander schreibst. Zum Beispiel:

shape = torus
shape = sphere
Ein Ring umschließt eine Kugel.

4. Objekte verschieben

Um Objekte zu verschieben, kannst du den Befehl move verwenden:

shape = grid

shape = box
move = 100, 0, 0
Ein Würfel steht rechts vom Ursprung des Gitters.

Dabei gibt move = 100, 0, 0 an, dass das Objekt um 100 Einheiten nach rechts verschoben wird. Die drei Werte stehen für die Verschiebung in den X-, Y- und Z-Richtungen.

Die Richtungen sind wie folgt:

  • die X-Achse verläuft von links nach rechts
  • die Y-Achse verläuft von unten nach oben
  • die Z-Achse verläuft von hinten nach vorn

Ein positiver Wert verschiebt das Objekt also nach rechts (X), nach oben (Y) oder nach vorne (Z), während ein negativer Wert es nach links, nach unten oder nach hinten verschiebt.

Aufgabe: Versuche, die folgende Szene zu erstellen, indem du vier Würfel erstellst:

  • ein Würfel in der Mitte
  • ein Würfel rechts daneben
  • ein Würfel darüber
  • ein Würfel davor
Tipp: Du musst die Szene mit der Maus ein bisschen drehen, um alle Würfel gut zu sehen.
Vier Würfel spannen ein Koordinatensystem auf.
```ini shape = grid shape = box shape = box move = 100, 0, 0 shape = box move = 0, 100, 0 shape = box move = 0, 0, 100 ```

5. Objekte rotieren

Um Objekte zu drehen, kannst du den Befehl rotate verwenden:

shape = grid

shape = box
rotate = 0, 30, 0
move = -100, 0, 0

shape = box

shape = box
rotate = 30, 0, 0
move = 100, 0, 0
Drei Würfel stehen verdreht nebeneinander auf einem Gitter.

Du siehst hier ein Gitter und drei Würfel:

  • der erste Würfel ist um 30 Grad um die Y-Achse gedreht und nach links verschoben
  • der zweite Würfel ist ganz normal in der Mitte
  • der dritte Würfel ist um 30 Grad um die X-Achse gedreht und nach rechts verschoben

Aufgabe: Versuche, die folgende Szene zu erstellen, indem du drei Würfel erstellst und rotierst:

Viele gedrehte Würfel bilden einen sternförmigen Ring.
```ini shape = box rotate = 0, 0, -30 shape = box rotate = 0, 0, 0 shape = box rotate = 0, 0, 30 ```

6. Objekte skalieren

Um die Größe von Objekten mit einem Faktor zu multiplizieren, kannst du den Befehl scale verwenden:

shape = grid

shape = sphere
scale = 0.5
move = -100, 0, 0

shape = sphere
move = 0, 0, 0

shape = sphere
scale = 1.8
move = 100, 0, 0

In diesem Beispiel siehst du ein Gitter und drei Kugeln:

  • die erste Kugel ist halb so groß wie die normale Kugel und nach links verschoben
  • die zweite Kugel ist normal groß und in der Mitte
  • die dritte Kugel ist 1,8-mal so groß wie die normale Kugel und nach rechts verschoben
Achtung: Beim Pro­gram­mier­en musst du meistens Kommazahlen mit einem Punkt schreiben, also 1.8 und nicht 1,8. Wenn du ein Komma eingibst, werden die Nachkommastellen ignoriert und die Zahl wird als ganze Zahl interpretiert.
Mehrere Kugeln werden entlang einer Reihe zunehmend größer.

Du kannst ein Objekt auch in alle drei Richtungen unterschiedlich skalieren, indem du drei Werte angibst:

shape = grid

shape = sphere
scale = 1, 0.2, 1

Hier wur­de eine Kugel nur in der Y-Richtung verkleinert (auf 20%), sodass sie wie eine Scheibe aussieht:

Eine stark abgeflachte Kugel liegt wie ein Pfannkuchen auf dem Gitter.

Aufgabe: Versuche, die folgende Szene zu erstellen, indem du eine Box erstellst und sie auf die zehnfache Breite skalierst. Verschiebe die Box anschließend um 25 Einheiten nach oben, so dass sie auf dem Gitter aufliegt:

Eine rechteckiger Stab liegt auf dem Gitter.

7. Transformationen kombinieren

Verschiebungen, Drehungen und Skalierungen nennt man auch Transformationen. Du kannst mehrere Transformationen kombinieren, indem du sie hintereinander schreibst. Zum Beispiel:

shape = grid

shape = box
rotate = 0, 0, 45
move = 100, 0, 0

Hier wur­de ein Würfel zuerst um 45 Grad um die Z-Achse gedreht und dann um 100 Einheiten nach rechts verschoben. Das Ergebnis sieht so aus:

Ein gedrehter Würfel bleibt seitlich auf dem Gitter stehen.

Dabei ist es wichtig, in welcher Reihenfolge du die Transformationen angibst. Wenn du zuerst verschiebst und dann drehst, sieht das Ergebnis anders aus:

shape = grid

shape = box
move = 100, 0, 0
rotate = 0, 0, 45
Ein verschobener Würfel schwebt nach der Drehung über dem Gitter.

Dieser Würfel schwebt jetzt über dem Gitter, weil er zuerst nach rechts verschoben wur­de und danach erst um 45 Grad um die Z-Achse gedreht wur­de, denn: jede Drehung findet immer um den Ursprung statt (und jede Skalierung auch).

8. Farben und Schattierung

Du kannst die Farben der Objekte kontrollieren, um verschiedene Effekte zu erzielen:

Weiß gefüllter Kegel mit schwarzen Konturen auf weißem Grund. Ungefüllter Kegel mit schwarzen Konturen auf weißem Grund. Grau schattierter Kegel mit schwarzen Konturen auf weißem Grund. Grau schattierter Kegel ohne Konturen auf weißem Grund.
Schwarz gefüllter Kegel mit weißen Konturen auf schwarzem Grund. Ungefüllter Kegel mit weißen Konturen auf schwarzem Grund. Grau schattierter Kegel mit schwarzen Konturen auf schwarzem Grund. Grau schattierter Kegel ohne Konturen auf schwarzem Grund.

Dafür stehen dir vier Befehle zur Verfügung:

  • background für die Hintergrundfarbe: 0.0 bis 1.0 für schwarz bis weiß
  • stroke für die Strichfarbe: 0.0 bis 1.0 für schwarz bis weiß / off für kein Strich
  • fill für die Füllfarbe: 0.0 bis 1.0 für schwarz bis weiß / off für keine Füllung
  • shade für 3D-Schattierung: on für 3D-Schattierung / off für keine 3D-Schattierung

Im folgenden Beispiel schalten wir die Strichfarbe aus und die 3D-Schattierung ein:

shape = grid

shape = torus
shade = on
stroke = off
Ein grau schattierter Ring schwebt über einem Gitter.
Wenn du möch­test, kannst du auch bunte Farben verwenden. Gib dafür statt einer Zahl von 0.0 bis 1.0 einfach einen HTML-Farbcode wie z. B. #4aa03f an.

9. Übungsaufgaben

Versuche, eine oder mehrere der folgenden Szenen zu erstellen:

Eine dreidimensionale Ampel mit rotem, gelbem und grünem Licht. Eine Eistüte aus Kegel und drei farbigen Kugeln. Ein Schneemann aus weißen Kugeln mit schwarzem Hut und orangefarbener Nase.

Erstelle dafür jeweils eine neue Datei (mit »File« / »New Text File«) und speichere sie unter einem passenden Namen, z. B. ampel.ini, eis.ini oder schneemann.ini. Du musst dann auf der Vor­schauseite nur noch den passenden Da­tei­na­men im Textfeld unten ändern, um die Szene zu sehen.

10. Code auskommentieren

Manchmal möchte man Teile eines Programms vorübergehend deaktivieren, ohne sie zu löschen. Dafür kannst du Zeilen auskommentieren, indem du ein Semikolon ; am Anfang der Zeile setzt. Zum Beispiel:

;shape = grid
shape = box
Tipp: Statt eines Semikolons (;) kannst du auch ein Hashtag (#) verwenden, um eine Zeile auszukommentieren.

Um schnell ganze Blöcke auszukommentieren, kannst du mehrere Zeilen markieren und dann StrgK und StrgC (für »comment«) drücken. Um die Kommentare wieder zu entfernen, markiere die Zeilen und drücke StrgK und StrgU (für »uncomment«). Es gibt auch weitere Short­cuts dafür, die du im Menü finden kannst.

11. Ani­ma­tio­nen

Während deine Szene angezeigt wird, läuft im Hintergrund eine Uhr mit. Die Anzahl der Sekunden seit dem Start der Szene wird in der Variablen t gespeichert. Du kannst diese Variable verwenden, um Ani­ma­tio­nen zu erstellen:

shade = on
shape = torus
rotate = 0, t * 30, 0

In diesem Beispiel wird der Torus um 30 Grad pro Sekunde um die Y-Achse gedreht. Das bedeutet, dass er nach 3 Sekunden 90 Grad geschafft hat und nach 12 Sekunden eine volle Umdrehung gemacht hat.

Profitipp: Mit Hilfe der Sinus- und Cosinusfunktionen kannst du auch sanfte Bewegungen erzeugen:

shade = on
shape = box
rotate = cos(t * 2) * 10, 0, sin(t * 3) * 10

Aufgabe: Erstelle eine Animation, bei der die Sonne in der Mitte steht und die Erde um die Sonne kreist. Der Mond soll dabei um die Erde kreisen:

12. Text

Du kannst Text in deine Szene einfügen, indem du den Befehl text verwendest:

text = Hello!
Der weiße Schriftzug „Hello!“ schwebt im Raum.

Richtig gut sieht er aber erst mit einer 3D-Schattierung aus:

text = Hello!
shade = on
stroke = off
fill = #f9b935
Der gelb schattierte Schriftzug „Hello!“ schwebt im Raum.

13. 3D-Modelle

Du kannst auch 3D-Modelle in deine Szene einfügen. Auf der Website kenney.nl gibt es eine große Sammlung von kostenlosen 3D-Modellen, die du verwenden kannst. Du kannst sie direkt in dein Projekt herunterladen und in der scene.ini einfügen. Klicke dazu auf ein Kit, um die verfügbaren 3D-Modelle zu sehen:

Auswahl futuristischer Waffenmodelle aus dem Blaster Kit.
Blaster Kit
Auswahl farbiger Auto- und Lastwagenmodelle aus dem Car Kit.
Car Kit
Burganlage aus Türmen, Mauern und Toren des Castle Kits.
Castle Kit
Geschäftsgebäude und Stadtmöbel des kommerziellen City Kits.
City Kit (Commercial)
Industriegebäude, Tanks und Rohre des industriellen City Kits.
City Kit (Industrial)
Straßenstücke, Kreuzungen und Verkehrsschilder des City Kits.
City Kit (Roads)
Wohnhäuser und Vorstadtobjekte des suburbanen City Kits.
City Kit (Suburban)
Mehrere würfelförmige Tierfiguren des Cube Pets Kits.
Cube Pets
Fabrikgebäude, Förderbänder und Maschinen des Factory Kits.
Factory Kit
Fantasiehäuser, Türme und Marktstände des Fantasy Town Kits.
Fantasy Town Kit
Auswahl dreidimensionaler Lebensmittel und Gerichte des Food Kits.
Food Kit
Grabsteine, Gruften und kahle Bäume des Graveyard Kits.
Graveyard Kit
Winterliche Figuren, Geschenke und Dekorationen des Holiday Kits.
Holiday Kit
Bunte Spielautomaten und Zubehör des Mini Arcade Kits.
Mini Arcade
Auswahl kleiner menschlicher Figuren des Mini Characters Kits.
Mini Characters
Dungeonräume, Mauern und Requisiten des Mini Dungeon Kits.
Mini Dungeon
Marktstände, Regale und Waren des Mini Market Kits.
Mini Market
Piratenfiguren, Schiffe und Inselobjekte des Pirate Kits.
Pirate Kit
Plattformen, Hindernisse und Figuren des Platformer Kits.
Platformer Kit
Werkzeuge, Vorräte und Hütten des Survival Kits.
Survival Kit
Lokomotiven, Waggons und Schienenstücke des Train Kits.
Train Kit
Boote, Schiffe und Hafenobjekte des Watercraft Kits.
Watercraft Kit

14. Schleifen

Wenn du viele Objekte platzieren möch­test, wirst du merken, dass du dafür viele Zeilen schreiben musst. Hier werden z. B. drei Würfel nebeneinander platziert:

Drei Würfel stehen in einer Reihe auf dem Gitter.

Für jeden Würfel werden zwei Zeilen geschrieben:

shape = grid

shape = box
move = -100, 0, 0

shape = box
move = 0, 0, 0

shape = box
move = 100, 0, 0

Du kannst ähnliche Zeilen zu einer Schleife zusammenfassen. Wenn du z. B. schreibst:

shape = grid

loop x from -100 to 100 step 100
    shape = box
    move = x, 0, 0
end

…erhältst du genau dasselbe Bild. Dabei lassen wir eine Variable x in 100er-Schritten von -100 bis 100 laufen, wodurch drei Würfel an den gewünschten Positionen gezeichnet werden.

Tipp: Rücke das Innere einer Schleife ein (wie oben z. B. mit Tab oder ein 4 Leerzeichen), um den Überblick zu behalten.

Um eine Schleife zu verwenden, musst du dich genau an die Syntax halten. Dabei gelten folgende Regeln:

  • Eine Schleife beginnt mit loop und endet mit end.
  • Du musst eine Variable benennen, z. B. x.
  • Du musst mit from angeben, mit welchem Wert du beginnen möch­test.
  • Du musst mit end angeben, bis zu welchem Wert die Schleife laufen soll.
  • Du kannst mit step angeben, in welchen Schritten die Variable weiterlaufen soll. Wenn du step nicht angibst, wird eine Schrittgröße von 1 angenommen.

Du kannst die oben abgebildete Schleife auch so formulieren:

shape = grid

loop x from 1 to 3
    shape = box
    move = (x - 2) * 100, 0, 0
end
Warum funktioniert das? Wenn du die Werte 1 bis 3 in den Ausdruck (x - 2) * 100 einsetzt, siehst du, dass genau dieselben Werte (-100, 0 und 100) herauskommen. Du kannst aber grnauso auch die erste Schleife verwenden, falls du das leichter findest. Für den Com­puter macht es keinen Unterschied.

Verschachtelte Schleifen

Schleifen können auch verschachtelt werden. Das heisst: du schreibst erst eine äußere Schleife mit einer Variablen, und darin eine innere Schleife mit einer anderen Variablen, z. B.:

shape = grid

loop z from -100 to 100 step 100
    loop x from -100 to 100 step 100
        shape = box
        move = x, 0, z
    end
end

In der äußeren Schleife nimmt z drei verschiedene Werte an und für jeden Durchlauf der äußeren Schleife nimmt x un­ab­hän­gig von z ebenso drei Werte an. Diese beiden Werte können wir jetzt verwenden, um den Würfel in x- und z-Richtung zu verschieben. Das Ergebnis sieht dann so aus:

Neun Würfel sind in drei Reihen mit jeweils drei Würfeln angeordnet.
Achtung: Achte darauf, bei verschachtelten Schleifen verschiedene Variablen für jede Schleife zu verwenden!

Aufgabe: Versuche, mit Hilfe von verschachtelten Schleifen ein Gitter aus 3x3x3 Würfeln zu bauen:

27 Würfel bilden ein räumliches Gitter aus drei mal drei mal drei Würfeln.