Kapitel 2: Grafische Objekte
Grafische Objekte entstehen aus Punkten, Kanten und Dreiecken in kartesischen (rechts-/linkshaendigen) Koordinatensystemen. OpenGL verbindet Punkte zu Primitiven; Objekte werden lokal modelliert, per Translation/Rotation/Skalierung in die Welt gesetzt und in einem gerichteten azyklischen Szenengraphen zu komplexen Szenen verwaltet.
Überblick
Grundaussage: "Alle grafischen Objekte bestehen letztendlich aus Punkten, die mit Kanten zu Dreiecken verbunden werden." Aus dieser Kette Punkte -> Kanten -> Dreiecke lassen sich Grundkoerper wie Schachfiguren, Vasen, Wuerfel, Tori, Dodekaeder und Kugeln aufbauen.
Roter Faden:
- Geometrien werden in kartesischen Koordinatensystemen (Cartesian coordinate systems) durch Punkte, Kanten und Flaechen definiert.
- OpenGL verbindet Punkte zu Primitiven (primitives); einige Primitive sind mittlerweile deprecated.
- Objekte werden zuerst im lokalen Koordinatensystem modelliert und per Transformationen (Translation, Rotation, Skalierung) ins Weltkoordinatensystem gesetzt.
- Der Szenengraph (scene graph) organisiert komplexe Szenen als gerichteten azyklischen Graphen (DAG).
Erzeugung grafischer Objekte
Jede Geometrie wird durch Punkte (points), Kanten (edges) und Flaechen (faces) in einem bestimmten Koordinatensystem definiert. Der Grundbaustein bleibt das Dreieck.
Koordinatensysteme
Ein kartesisches Koordinatensystem hat Achsen, die senkrecht aufeinander stehen:
- 2D: (nach rechts) und (nach oben).
- 3D: , und .
Worked Example: Rechteck aus Koordinaten
Gegeben sind vier Eckpunkte (vertices) eines Rechtecks:
- Schritt 1: Punkte in die /-Ebene eintragen.
- Schritt 2: Kanten -, -, -, - verbinden.
- Schritt 3: Breite ; Hoehe .
- Ergebnis: achsensymmetrisches Rechteck um den Ursprung .
Die Umlaufrichtung (unten-links) -> (unten-rechts) -> (oben-rechts) -> (oben-links) ist gegen den Uhrzeigersinn (counter-clockwise, CCW) - in OpenGL die Standard-Vorderseitenorientierung.
Rechts- vs. linkshaendige Koordinatensysteme
Die Haendigkeit (handedness) bestimmt die -Richtung:
- Rechtshaendiges Koordinatensystem (right-handed): nach rechts, nach oben, zeigt zum Betrachter heraus (aus dem Bildschirm). Standard in OpenGL.
- Linkshaendiges Koordinatensystem (left-handed): nach rechts, nach oben, zeigt in den Bildschirm hinein (weg vom Betrachter). Standard z. B. in DirectX.
Wichtig (typische Falle): rechtshaendig = zum Betrachter heraus, linkshaendig = in den Bildschirm hinein. Die Haendigkeit bestimmt neben der -Richtung auch den Drehsinn.
Primitive und Objekte
OpenGL verbindet die Punkte zu bestimmten Primitiven. Gezeigte und gelistete Primitive:
- Points, Lines, Line Strip, Line Loop
- Triangle, Triangle Strip, Triangle Fan
- Polygon, Quad, Quad Strip
- Patches (nur bei Tessellation)
Deprecated-Primitive (klausurrelevantes Faktenwissen): Polygon, Quad und Quad Strip sind in OpenGL 3.0 deprecated und in OpenGL 3.1+ entfernt (removed). Modernes OpenGL baut alles aus Dreiecken auf (Triangle, Triangle Strip, Triangle Fan).
Hilfsbibliotheken
Hilfsbibliotheken (utility libraries) wie GLU stellen komplexere Geometrien fertig bereit, z. B. Kugel (gluSphere), Zylinder (gluCylinder), Kegel und Torus.
Beispiel Pinguin: Aufbau aus GLU-Primitiven
| Bauteil | Primitiv / Funktion |
|---|---|
| Kopf | gluSphere() |
| Schnabel / Hals / Koerpersegmente | mehrfach gluCylinder() |
| Fluegel | GL_POLYGON |
| Fuesse | GL_TRIANGLE_FAN |
Lokale vs. Welt-Koordinatensysteme
Jedes Bauteil wird zunaechst in seinem eigenen lokalen Koordinatensystem (local / object coordinate system) definiert, meist um den Ursprung (z. B. Pinguinkopf, Dreieck fuer Fluegel/Fuesse, Becher). Anschliessend werden alle Bauteile per Transformationen im gemeinsamen Weltkoordinatensystem (world coordinate system) zur Gesamtszene zusammengesetzt (der fertige Pinguin).
Grafische Attribute
Grafische Attribute (graphical attributes) beschreiben das "Aussehen" der Objekte zusaetzlich zur Geometrie:
- Farbe,
- synthetische Textur (texture), auf die Flaeche gemappt / "geklebt",
- ein JPEG-Bild, auf eine Flaeche gemappt.
Transformationen
Eine Transformation (transformation) ist die Manipulation von Primitiven im Koordinatensystem. Es gibt drei Grundtransformationen:
- Translation (translation): Verschieben einer Geometrie entlang einer Richtung/Achse, ohne Orientierung oder Groesse zu aendern.
- Rotation (rotation): Drehen einer Geometrie um eine Koordinatenachse; die Drehrichtung folgt dem mathematisch positiven Drehsinn.
- Skalierung (scaling): Vergroessern/Verkleinern.
Hinweis (mögliche Unstimmigkeit): In den 3D-Charakter-Abbildungen ist die Achsenfarbe laut Bild rot = y, gruen = x, blau = z. Das weicht von der in vielen Werkzeugen ueblichen Zuordnung R = x, G = y, B = z ab. Im Zweifel die Achsenfarben in der jeweiligen Abbildung genau pruefen und nicht die uebliche RGB=xyz-Konvention blind annehmen.
Hinweis (nicht in diesem Kapitel): In Kap. 1 & 2 gibt es KEINE expliziten Transformationsmatrizen (Translation/Rotation/Skalierung als Matrizen). Die Matrixform und homogene Koordinaten folgen in einem spaeteren Kapitel (Transformationen).
Mathematisch positiver Drehsinn (Rechte-Hand-Regel)
Der mathematisch positive Drehsinn (mathematically positive direction of rotation) folgt der Rechte-Hand-Regel (right-hand rule): Zeigt der Daumen der rechten Hand in Richtung der positiven Koordinatenachse, so geben die angewinkelten Finger die positive Drehrichtung an. Das entspricht einer Drehung gegen den Uhrzeigersinn, wenn man von der positiven Achse zum Ursprung blickt. Die Rechte-Hand-Regel legt damit das Vorzeichen von Drehwinkeln fest.
Skalierung abseits des Nullpunkts
Wichtig (typische Falle): Die Skalierung ist auf den Ursprung bezogen. Ist ein Objekt NICHT im Ursprung (Nullpunkt) definiert, werden bei der Skalierung auch seine Positionskoordinaten mitskaliert - das Objekt aendert also neben der Groesse zusaetzlich seine Position ("es wandert").
Worked Example (Skalierung abseits des Nullpunkts):
- Gegeben: Objekt in Position, NICHT im Ursprung definiert; Skalierung mit Faktor .
- Schritt 1: Die Skalierung multipliziert alle Koordinaten mit - auch die Positionskoordinaten.
- Schritt 2: Dadurch aendert sich neben der Groesse der Abstand zum Ursprung -> das Objekt wandert.
- Loesung/Merke: Objekt zuerst in den Ursprung translieren, dann skalieren, dann zurueck translieren - oder Objekte gleich um den Ursprung modellieren.
Szenengraph
Der Szenengraph (scene graph) ist eine Datenstruktur zur Verwaltung einer komplexen Szene. Er erlaubt die Gruppierung von Geometrien zu Gruppen, von Gruppen zu Gruppen und von Gruppen zu einer Szene.
Baum vs. Graph
- Baum (tree): jeder Knoten hat genau einen Elternknoten.
- Gerichteter azyklischer Graph (DAG, directed acyclic graph): Knoten koennen mehrere Eltern haben, aber es gibt keine Zyklen.
- Gerichteter nicht-zyklenfreier Graph: enthaelt Zyklen - fuer Szenengraphen unerwuenscht.
Knotentypen
Mindestens drei Knotentypen (node types):
- Gruppen (group nodes),
- Geometrien (geometry, inkl. Materialeigenschaften),
- Transformationen (transformation nodes).
Struktur
Eigenschaften des Szenengraphen: gerichtet, azyklisch, heterogen. Die Geometrie bzw. die darstellbaren Primitive liegen in den Blaettern (leaves).
Vorteil DAG gegenueber Baum: "Geometrien werden nur einmal erzeugt (eingelesen) und durch (verschiedene) Transformationen mehrmals verwendet." Das ist die Instanzierung (instancing) und spart Speicher/Ladezeit.
Worked Example: Pinguin als Szenengraph
Verfuegbare Primitive: Becher (Oeffnung nach oben), Ball (bereits mit Augen und Nase), ein Dreieck ("zum Selbstbasteln").
Aufbau: Wurzel "Pinguin im Weltkoordinatensystem" -> Transformationsknoten -> Gruppe, mit den Zweigen Fuesse, Fluegel, Kopf und Pinguinkoerper:
- Kopf: Ball, translieren um 1/2 Kopfdurchmesser + 2 Becherlaengen entlang der Y-Achse (nach oben).
- Rumpf (gruen): oberer Becher, translieren um 2 Becherlaengen entlang Y und um 180 Grad um die Z-Achse rotieren, damit die Oeffnung nach unten zeigt.
- Unterkoerper (blau): Becher mit Oeffnung nach oben.
- Fluegel + Fuesse: dasselbe Dreieck-Primitiv, mehrfach mit unterschiedlichen Transformationen instanziert.
Vorteil (DAG): Dreieck und Becher nur einmal einlesen, mehrfach ueber Transformationen wiederverwenden.
Prüfungsrelevanz
- Rechts- vs. linkshaendiges Koordinatensystem und die -Richtung; die Rechte-Hand-Regel (positiver Drehsinn) und ihr Einfluss auf Vorzeichen von Drehwinkeln.
- OpenGL-Primitive und welche deprecated/removed sind (Polygon, Quad, Quad Strip; ab OpenGL 3.0/3.1).
- Die drei Transformationen (Translation, Rotation, Skalierung) und das Skalierungsproblem abseits des Nullpunkts.
- Szenengraph: 3 Knotentypen (Gruppen, Geometrien, Transformationen), Eigenschaften (gerichtet, azyklisch, heterogen, Geometrie in Blaettern) und der Vorteil DAG vs. Baum (Wiederverwendung von Geometrien via Instanzierung).
- Rechteck-Beispiel: Koordinaten eintragen, Breite/Hoehe berechnen, CCW-Umlauf erkennen.
Typische Fehler
- Haendigkeit / -Richtung falsch: rechtshaendig = zum Betrachter heraus, linkshaendig = in den Bildschirm hinein.
- Deprecated-Primitive (Quad/Polygon) noch als "modern" ansehen; modernes OpenGL nutzt Dreiecke.
- Vergessen, dass die Skalierung (und Rotation) auf den Ursprung bezogen sind -> Objekt wandert ungewollt, wenn nicht um den Ursprung definiert.
- Baum und DAG gleichsetzen bzw. den Instanzierungs-Vorteil des DAG nicht nennen koennen.
- Achsenfarben blind annehmen: in den 3D-Charakter-Bildern ist rot = y, gruen = x, blau = z (nicht das uebliche R = x / G = y / B = z) - im Bild nachsehen.
Glossar
| Deutsch | English |
|---|---|
| kartesisches Koordinatensystem | Cartesian coordinate system |
| rechtshaendiges Koordinatensystem | right-handed coordinate system |
| linkshaendiges Koordinatensystem | left-handed coordinate system |
| Haendigkeit | handedness |
| lokales Koordinatensystem | local (object) coordinate system |
| Weltkoordinatensystem | world coordinate system |
| Punkt / Kante / Flaeche | point / edge / face |
| Eckpunkt | vertex (Plural: vertices) |
| gegen den Uhrzeigersinn | counter-clockwise (CCW) |
| Primitiv | primitive |
| Punkte / Linien | points / lines (line strip, line loop) |
| Dreieck / Dreiecksstreifen / Dreiecksfaecher | triangle / triangle strip / triangle fan |
| Viereck / Viereckstreifen | quad / quad strip (deprecated) |
| Vieleck | polygon (deprecated) |
| Tessellation / Patches | tessellation / patches |
| Hilfsbibliothek | utility library (GLU) |
| grafische Attribute | graphical attributes |
| Textur | texture (texture mapping) |
| Transformation | transformation |
| Translation / verschieben | translation |
| Rotation / drehen | rotation |
| Skalierung / skalieren | scaling |
| mathematisch positiver Drehsinn | mathematically positive direction of rotation |
| Rechte-Hand-Regel | right-hand rule |
| Szenengraph | scene graph |
| Gruppe | group (node) |
| Geometrie (inkl. Materialeigenschaften) | geometry (incl. material properties) |
| Baum | tree |
| gerichteter azyklischer Graph | directed acyclic graph (DAG) |
| zyklenfrei / azyklisch | acyclic |
| heterogen | heterogeneous |
| Blatt / Blaetter | leaf / leaves |
| Instanzierung / Wiederverwendung | instancing / reuse |