• Keine Ergebnisse gefunden

Darstellung dreidimensionaler Objekte

Kontakt und Updates

2.2 Einführung in die 3D-Grafik

2.2.2 Theorie der 3D-Grafik

2.2.2.2 Darstellung dreidimensionaler Objekte

Man stelle sich ein dreidimensionales Objekt (zum Beispiel das Modell eines Raumschiffs) als eine Anhäufung von räumlich angeordneten Punkten vor. Durch die Projektion ist die Mög-lichkeit der Koordinatenumrechnung jedes einzelnen Punkts gegeben – doch nun taucht die Frage auf: Wie zeichnet man solch ein Objekt? Es könnte für jeden Punkt ein Pixel auf dem Bildschirm gezeichnet werden – doch das Ergebnis würde wohl eher an einen Mücken-schwarm erinnern als an ein echtes 3D-Objekt – in der Luft zerstreute Einzelpunkte ergeben eben noch nicht den Eindruck eines soliden Objekts.

Als Nächstes könnte man auf die Idee kommen, immer zwei Punkte durch Linien zu verbin-den – jedoch entspräche auch das nicht verbin-den allgemeinen Vorstellungen eines 3D-Objekts.

Statt immer zwei Punkte miteinander zu verbinden, tut man es mit dreien! Dadurch entsteht eine (lückenlose) Oberfläche aus Dreiecken, und das Objekt beginnt solide zu wirken.

Weiter als bis zum Dreieck muss man nicht gehen, da alle Formen (Polygone) mit noch mehr E-cken auch aus DreieE-cken aufgebaut werden können. Das Ganze nennt sich auch Polygongrafik.

Nun kann jedem Punkt zusätzlich zu seinen dreidimensionalen Koordinaten möglicherweise noch eine Farbe zugeteilt werden. Das Resultat sind dann Dreiecke, deren Ecken verschieden-farbig sind (es entsteht ein Farbverlauf zwischen den Eckpunkten).

Es gibt noch zahlreiche andere Arten, ein Dreieck zu zeichnen, die wir später noch kennen lernen werden – wichtig ist erst einmal nur das Prinzip.

„Perfekte“ Körper wie eine Kugel, ein Kreis, ein Zylinder oder ein Kegel können mit Hilfe der Polygongrafik nicht dargestellt werden, denn es wären unendlich viele Polygone notwendig.

Stattdessen kann eine Annäherung durchgeführt werden, wie zum Beispiel eine Kugel aus 10000 Polygonen. In dieser Größenordnung liegt normalerweise auch die Anzahl der Polygo-ne, die für ein durchschnittliches Modell in einem modernen Spiel verwendet werden.

Abbildung 2.4 Auch komplexere Formen und Körper können leicht in Dreiecke zerteilt werden. Beachten Sie besonders die Aufteilung des angenäherten Kreises; auf diese Weise werden zwei Dreiecke weniger benötigt als bei der „Kuchenstückmethode“.

Ein Dreieck wird gezeichnet, indem es Zeile für Zeile abgetastet wird. Farben und andere An-gaben, die spezifisch für einen einzelnen Eckpunkt sind, werden dabei interpoliert (es entsteht ein weicher Übergang). All das heißt natürlich nicht, dass es nicht in manchen Situationen sinnvoll wäre, eben nur Linien oder nur Punkte darzustellen. Beim Zeichnen eines Sternen-felds, das mit großer Geschwindigkeit an der Kamera vorbeirast, wäre es sicherlich

Ver-schwendung, für jeden der auf dem Bildschirm winzig klein erscheinenden Sterne extra ein oder zwei Dreiecke zu verwenden.

Punkte, Linien und Dreiecke nennt man Primitiven. Primitiv wird häufig negativ verstanden.

Eigentlich heißt es jedoch nur so viel wie einfach oder grundlegend, was hier ja auch voll-kommen zutreffend ist, denn noch einfachere Formen gibt es nicht.

Durch die geschickte Verwendung von Primitiven und vor allem durch eine realistische Be-leuchtung und Simulation der Oberflächeneigenschaften (wozu wir später noch kommen) er-reicht man, dass das resultierende Bild dreidimensional – also räumlich – wirkt. Hinter all dem stecken, wie man sich denken kann, viele aufwändige Berechnungen, die von früheren PCs noch nicht schnell genug verarbeitet werden konnten. Mit dem heutigen Stand der Tech-nik können wir uns aber noch viel mehr als nur ein paar einfache Dreiecke leisten – diese kön-nen heutzutage ohne Probleme in milliokön-nenfacher Ausfertigung (pro Sekunde!) mit unglaub-lich vielen Effekten kombiniert werden, um nahezu jede natürunglaub-liche Erscheinung wie Feuer, Wasser, Rauch, Wolken, Lebewesen und so weiter fast perfekt zu simulieren. Das menschli-che Gehirn kann so immer besser getäuscht werden, und man kommt dem Ziel, den Spieler glauben zu lassen, er sei in einer anderen Welt, wieder ein Schrittchen näher.

2.2.3 Vektoren

Was sind Vektoren? Einen Vektor kann man ganz allgemein einfach als eine Ansammlung von Werten beschreiben, wie viele das sind, sei dahingestellt.

Ein Vektor kann zum Beispiel eine dreidimensionale Koordinate oder auch eine Richtungsan-gabe sein – es hängt immer von der Interpretation der Daten ab. Vektoren spielen in der Gra-fikprogrammierung eine sehr große Rolle, vor allem weil es sich mit ihnen so leicht rechnen lässt. Die Werte eines Vektors nennen wir Vektorkomponenten. Die erste Komponente kann beispielsweise die x-Koordinate eines Punkts sein, die zweite seine y-Koordinate und so wei-ter.

Zur Schreibweise

Die Komponenten eines Vektors werden in diesem Buch in Klammern gesetzt und durch Kommata getrennt (zumindest im Fließtext) – also zum Beispiel (–17, 0.5, 38.75). Für Dezi-malbrüche verwende ich dabei Punkte.

In manchen Situationen, bei denen es besonders wichtig ist, dass eine bestimmte Variable als Vektor (vor allem als Richtungsvektor) betrachtet wird, wird dies mit einem Vektorpfeil ge-kennzeichnet. Zum Beispiel:vr.

Wird explizit eine bestimmte Komponente eines Vektors gemeint, so schreibe ich den Namen der Komponente gefolgt vom tiefgestellten Vektornamen. Beispielsweise ist mit dem Aus-druck xvr die x-Komponente des Vektors vr gemeint. Man kann auch v1 schreiben und meint damit dann die erste Komponente des Vektors.

2.2.3.1 Positionsvektoren

Ein Positionsvektor im n-dimensionalen Raum hat genau n Komponenten. Bei uns handelt es sich nun um dreidimensionale Vektoren, die aus drei Komponenten bestehen: x, y und z. Solch ein Positionsvektor ist nichts anderes als eine Koordinate. Er beschreibt einen bestimmten Ort im Raum innerhalb eines Koordinatensystems.

Absolute und relative Positionen

Positionen müssen nicht immer unbedingt absolut (bezogen auf den Koordinatenursprung) sein – auch relative Positionen werden sehr häufig gebraucht. Eine relative Position ist die Po-sition „aus der Sicht“ eines anderen Betrachters oder von einem anderen Punkt aus gesehen.

Beispiel

Ein Ball hat die absoluten Koordinaten (100, 50, 0). Ein Hund, der den Ball schnappen möchte, befindet sich an der Position (75, 0, 0), und er ist entlang der x-Achse ausgerichtet (schaut also nach rechts). Nun ist die relative Position des Balls bezogen auf den Hund (0, 50, 25) – denn der Ball befindet sich 50 Einheiten über dem Hund und 25 Einheiten vor ihm.

Der Hund bildet ein eigenes lokales (relatives) Koordinatensystem, dessen Achsenanordnung nicht mit der des alles umgebenden absoluten Systems übereinstimmen muss. So zeigt die lokale z-Achse des Hunds nach rechts anstatt in die Tiefe. Vom Hund aus gesehen zeigt seine z-z-Achse na-türlich nach vorne – in die Tiefe, wie sie es auch tun sollte.

2.2.3.2 Richtungsvektoren

Richtungsvektoren unterscheiden sich formal nicht von Positionsvektoren; hier werden die Komponenten lediglich auf eine andere Weise interpretiert. Ein Richtungsvektor kann zum Beispiel verwendet werden, um die Bewegungsrichtung eines Objekts zu beschreiben. Doch nicht nur die Richtung, sondern auch noch die Geschwindigkeit findet Platz. Dann spricht man auch von einem Bewegungsvektor.

Beispiel

Die Bewegungsrichtung eines Balls wird durch den Vektor (–1, 0, 0) angegeben, was bedeutet, dass er mit einer Einheit pro Sekunde nach links fliegt (negativer Wert auf der x-Achse). Verwen-det man nun (–5, 0, 0) statt (–1, 0, 0), so hat sich die eigentliche Richtung nicht geändert, wohl aber die Geschwindigkeit, denn diese ist nun nicht mehr 1, sondern 5 Einheiten pro Sekunde.

Ein Richtungsvektor ist also aus zwei Größen zusammengesetzt: aus der eigentlichen Richtung in der Form (x, y, z) und der Geschwindigkeit, die mit dem Vektor multipliziert wird. Dazu muss der pure Richtungsvektor die Länge 1 haben, worauf wir später genauer eingehen.

Streng gesehen ist auch ein Positionsvektor nichts anderes als ein Richtungsvektor, der als Be-zugspunkt den Koordinatenursprung (0, 0, 0) hat.

2.2.3.3 Rechenoperationen

Mit Vektoren kann man zum größten Teil genauso rechnen, wie man es von gewöhnlichen Zahlen her kennt (Ausnahme: Multiplikation).

Vektoraddition und Vektorsubtraktion

Die Addition und Subtraktion zweier dreidimensionaler Vektoren ar und br

funktioniert wie

Man muss also einfach nur die einzelnen Vektorkomponenten addieren. Ein gutes Beispiel für die Vektoraddition ist die Bewegung eines Objekts. Nehmen wir für einen Tennisball den Po-sitionsvektor pr und den Bewegungsvektor vr an. Nun soll der Positionsvektor durch den Be-wegungsvektor verändert werden – das Ergebnis ist pr' (die neue Position). Was wir noch be-nötigen, ist die abgelaufene Zeit seit der letzten Aktualisierung (denken Sie an die Nachrich-tenschleife, welche die Zeit stoppt), sie sei in t gegeben. Die folgende Berechnung würde man in der Move-Funktion benutzen, um den Ball fortzubewegen:

( )

'

p = +p v t

r r r

Ist die Zeit t beispielsweise genau 1 (eine Sekunde), dann wird der Bewegungsvektor unver-ändert zum Positionsvektor addiert. Ist aber nur eine zehntel Sekunde abgelaufen, so wird der Ball auch nur um ein Zehntel fortbewegt. Doch dieses Thema geht schon eher in den Bereich der Physik hinein; wir werden später detaillierter darauf zu sprechen kommen.

x-Achse

Abbildung 2.5 Wie man mit aneinander gelegten Pfeilen eine Vektoraddition der Vektoren (1, 1), (4, 1), (0, 3), (–2, –1) und (–1, 1) durchführen kann (Ergebnis: (2, 5))

Multiplikation und Division mit Skalaren

Wird ein Vektor mit einem Skalar (also einer nichtvektoriellen Größe, einer gewöhnlichen reellen Zahl) multipliziert oder durch einen dividiert, dann führt man die Operation einfach mit allen Vektorkomponenten einzeln durch (hier demonstriert anhand eines Vektors ar und eines Skalars s):

Anschaulich hat die Multiplikation eines Vektors mit einem Skalar die Bedeutung einer Ver-längerung (Betrag des Faktors größer als 1) oder einer Stauchung (Betrag des Faktors kleiner als 1). Die Multiplikation mit einem negativen Faktor führt dazu, dass der resultierende Vektor in die entgegengesetzte Richtung zeigt.

vv vv