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: xx (nach rechts) und yy (nach oben).
  • 3D: xx, yy und zz.

Worked Example: Rechteck aus Koordinaten

Gegeben sind vier Eckpunkte (vertices) eines Rechtecks:

P1={2.4, 1.2},P2={2.4, 1.2},P3={2.4, 1.2},P4={2.4, 1.2}P_1 = \{-2.4,\ -1.2\}, \quad P_2 = \{2.4,\ -1.2\}, \quad P_3 = \{2.4,\ 1.2\}, \quad P_4 = \{-2.4,\ 1.2\}
  • Schritt 1: Punkte in die xx/yy-Ebene eintragen.
  • Schritt 2: Kanten P1P_1-P2P_2, P2P_2-P3P_3, P3P_3-P4P_4, P4P_4-P1P_1 verbinden.
  • Schritt 3: Breite =xP2xP1=2.4(2.4)=4.8= x_{P_2} - x_{P_1} = 2.4 - (-2.4) = 4.8; Hoehe =yP4yP1=1.2(1.2)=2.4= y_{P_4} - y_{P_1} = 1.2 - (-1.2) = 2.4.
  • Ergebnis: achsensymmetrisches Rechteck um den Ursprung (0,0)(0,0).

Die Umlaufrichtung P1P_1 (unten-links) -> P2P_2 (unten-rechts) -> P3P_3 (oben-rechts) -> P4P_4 (oben-links) ist gegen den Uhrzeigersinn (counter-clockwise, CCW) - in OpenGL die Standard-Vorderseitenorientierung.

Rechts- vs. linkshaendige Koordinatensysteme

Die Haendigkeit (handedness) bestimmt die zz-Richtung:

  • Rechtshaendiges Koordinatensystem (right-handed): xx nach rechts, yy nach oben, zz zeigt zum Betrachter heraus (aus dem Bildschirm). Standard in OpenGL.
  • Linkshaendiges Koordinatensystem (left-handed): xx nach rechts, yy nach oben, zz zeigt in den Bildschirm hinein (weg vom Betrachter). Standard z. B. in DirectX.

Wichtig (typische Falle): rechtshaendig = zz zum Betrachter heraus, linkshaendig = zz in den Bildschirm hinein. Die Haendigkeit bestimmt neben der zz-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

BauteilPrimitiv / Funktion
KopfgluSphere()
Schnabel / Hals / Koerpersegmentemehrfach gluCylinder()
FluegelGL_POLYGON
FuesseGL_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 ss.
  • Schritt 1: Die Skalierung multipliziert alle Koordinaten mit ss - 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):

  1. Gruppen (group nodes),
  2. Geometrien (geometry, inkl. Materialeigenschaften),
  3. 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 zz-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 / zz-Richtung falsch: rechtshaendig = zz zum Betrachter heraus, linkshaendig = zz 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

DeutschEnglish
kartesisches KoordinatensystemCartesian coordinate system
rechtshaendiges Koordinatensystemright-handed coordinate system
linkshaendiges Koordinatensystemleft-handed coordinate system
Haendigkeithandedness
lokales Koordinatensystemlocal (object) coordinate system
Weltkoordinatensystemworld coordinate system
Punkt / Kante / Flaechepoint / edge / face
Eckpunktvertex (Plural: vertices)
gegen den Uhrzeigersinncounter-clockwise (CCW)
Primitivprimitive
Punkte / Linienpoints / lines (line strip, line loop)
Dreieck / Dreiecksstreifen / Dreiecksfaechertriangle / triangle strip / triangle fan
Viereck / Viereckstreifenquad / quad strip (deprecated)
Vieleckpolygon (deprecated)
Tessellation / Patchestessellation / patches
Hilfsbibliothekutility library (GLU)
grafische Attributegraphical attributes
Texturtexture (texture mapping)
Transformationtransformation
Translation / verschiebentranslation
Rotation / drehenrotation
Skalierung / skalierenscaling
mathematisch positiver Drehsinnmathematically positive direction of rotation
Rechte-Hand-Regelright-hand rule
Szenengraphscene graph
Gruppegroup (node)
Geometrie (inkl. Materialeigenschaften)geometry (incl. material properties)
Baumtree
gerichteter azyklischer Graphdirected acyclic graph (DAG)
zyklenfrei / azyklischacyclic
heterogenheterogeneous
Blatt / Blaetterleaf / leaves
Instanzierung / Wiederverwendunginstancing / reuse