Sie sind auf Seite 1von 14

Analytische und Polygonale Shapes

Eldar Sultanow
eldar.sultanow@hpi.uni-potsdam.de
Hasso-Plattner-Institut an der Universität Potsdam

Zusammenfassung. Analytische und Polygonale Shapes sind geometrische Objekte. Analytische


Shapes sind definiert durch mathematische Funktionen wie beispielsweise algebraische Flächen.
Polygonale Shapes stellen lediglich eine Sammlung von Dreiecksflächen oder Vierecksflächen dar.
Analytische Shapes lassen sich auf polygonale Shapes abbilden. Den polygonalen Shapes liegt eine
mathematische Funktion zu Grunde nämlich jene, die das entsprechende analytische Shape definiert.
Bekannte Vertreter analytischer Shapes sind Kugel, Zylinder, Kegel und Torus. Viele
Renderingsysteme können analytische Shapes nicht direkt verarbeiten und es ist eine Umwandlung
der analytischen Shapes in polygonale Strukturen erforderlich. VRS ist ein Echtzeit-
Renderingsystem, das nach einem bestimmten Konzept und unter Verwendung verschiedener
Algorithmen analytische Shapes für Renderingsysteme wie OpenGL oder POVRay so aufbereitet,
dass sie durch diese dargestellt werden können.

Keywords: analytische Shapes, Kugel, Torus,


algebraische Fläche, Polygon, polygonale Shapes, 2.1 Definition
VRS. Analytische Shapes sind mathematisch
beschriebene Oberflächen. Sie werden durch ihre
1 Einführung analytischen Parameter definiert, wie zum Beispiel
eine Kugel durch ihren Mittelpunkt und Radius.
Das Virtual Rendering System (VRS) ist eine 3D
Sie lassen sich entweder in expliziter Form
Grafik Library. In VRS sind zur Zeit fünf definieren, also die Spezifikation einer Variablen
Renderingsysteme integriert, die häufig in durch die anderen wie in
computergrafischen Systemen verwendet werden.
Sowohl aus Sicht der Entwickler als auch die der z = x+ y ,
Anwender sind die Anforderungen an so ein
in impliziter Form als Nullstellen einer Funktion
Echtzeit-Renderingsystem sehr hoch. Denn auf der
zum Beispiel
einen Seite wächst mit dem technologischen
Fortschritt im Hardware- und Softwarebereich der x2 + y2 + z 2 −1 = 0 ,
Anspruch der Konsumenten und auf der anderen oder in Parameterform, also für den d -
Seite ist für den Programmierer ein ordentliches
dimensionalen Fall mit d Funktionen, die von
Konzept erforderlich, das den Wartungs- und
Entwicklungsaufwand trotz der rapiden (d − 1) Parametern abhängen, wie am Beispiel
Weiterentwicklung von beispielsweise einer Kugeloberfläche
Grafikkarten auf ein Maß reduziert, das x(u, v ) = cos u cos v
wirtschaftlich vertretbar ist. Diese Anforderungen
wiederspiegeln sich im Quellcode insbesondere in y (u, v ) = sin u cos v
der Klassenhierachie von VRS. So ist zum z (u , v) = sin v
Beispiel in VRS die Deklaration analytischer
Shapes deutlich von deren Umsetzung getrennt. (u , v) ∈ [ 0, 2π ] × [ −π / 2, π / 2] .
Jede dieser Darstellungsformen hat ihre Vor- und
2 Analytische Shapes Nachteile. Deshalb sind oft für die Bearbeitung
eines Problems alle drei Formen erforderlich.
Der Begriff „Shape“ ist aus dem englischen
Häufig muss dann die eine Form in die andere
Wortschatz und bedeutet Form, Gestalt, Umriß.
umgewandelt werden. Zum Beispiel eignet sich die
Shapes im Sinne der Computergrafik sind
Parameterform für die Berechnung von Vektoren
geometrische, grafische Objekte. Man
beziehungsweise Punkten im d -dimensionalen
unterscheidet dabei Analytische Shapes von den
Polygonalen Shapes. Raum. Aber die mathematische Natur des
Durchdringungsproblems ist sehr einfach, falls
eine Fläche implizit und die andere in
Parameterdarstellung gegeben ist. So lassen sich

-1-
die Schnittfiguren alleine durch gegenseitiges ⎛ R + r cos(ϕ ) ⎞
Einsetzen der zwei Formen ermitteln.  ⎜ ⎟
f (ϕ ) = ⎜ 0 ⎟
, ϕ ∈ [ 0, 2π ] .
2.2 Beispiele für Analytische Shapes ⎜ r sin(ϕ ) ⎟
⎝ ⎠
Es gibt unendlich viele Beispiele für analytische Der Mittelpunkt dieses Kreises liegt demzufolge
Shapes, da es unendlich viele Möglichkeiten für auf der x–Achse und sein Abstand zum Ursprung
die Komposition mathematischer Funktionen gibt. ist R :
Bekannt sind vor allem die Kugel, der Torus, 
Zylinder, Kreiskegel und Bezierflächen. ΟM = R, R ≥ r .

2.2.1 Die Kugel Dieser Kreis werde um die z–Achse gedreht,


wodurch ein Ring mit kreisförmigen Querschnitt
Die Kugel ist ein spezieller Ellipsoid. Für
(Torus) entsteht. Der Torus ist gegeben durch die
Ellipsoide gilt folgende Gleichung:
Funktion
x2 y2 z2
+ + =1 ⎛ ( R + r cos ϕ ) cos(ϑ ) ⎞
a2 b2 c2 
g (ϕ , ϑ ) = ⎜⎜ ( R + r cos ϕ ) sin(ϑ ) ⎟⎟ , ϕ , ϑ ∈ [ 0, 2π ] .
Setzt man nun a = b = c = r , so ergibt sich eine ⎜ ⎟
⎝ r sin(ϕ ) ⎠
Kugel mit dem Radius r . Neben Mittelpunkt und
Radius gibt es noch die Möglichkeit, den
Vervollständigungswinkel als Parameter zur
Beschreibung der Kugel einzuführen. Dieser
Winkel gibt an wie weit die Kugelhülle
vervollständigt wird beziehungsweise wie gross
eine Öffnung in der Kugelhülle ist. Beträgt der
Winkel 360° ist die Kugelhülle vollständig also
keine Öffnung vorhanden. Beträgt er 180° ergibt
sich eine Halbkugel.

Abbildung 2. Torus

Neben den beiden Radien R , r und dem


Mittelpunkt gibt es wie bei der Kugel einen
Vervollständigungswinkel als weiteren Parameter.
Er gibt an, wie weit in unserem Fall der in E xz
befindliche Kreis, den wir am Anfang des
Abschnitts beschrieben haben, um die z–Achse
gedreht wird. Im Anhang finden sich auch
Abbildung 1. Kugel dargestellt durch 762 Darstellungen vom Torus durch VRS, wobei wie
Punkte und 800 Polygone im Beispiel der Kugel ein
Vervollständigungswinkel von 270° und 360°
Im Anhang finden sich Darstellungen der Kugel
gewählt wurde (Abbildung 22).
durch VRS, wobei ein Vervollständigungswinkel
von 270° und 360° gewählt wurde (Abbildung 21).

2.2.2 Der Torus


In der x–z–Ebene
Exz : y = 0
wird ein Kreis mit dem Radius r und dem
Mittelpunkt M = ( R, 0, 0) durch folgende
Vektorfunktion beschrieben:
Abbildung 3. Torus, dessen geschlossenen Polygon gesprochen. Ein einfaches
Vervollständigungswinkel kleiner als 360° ist Polygon liegt vor, wenn der Schnitt von jeweils
zwei Kanten entweder die leere Menge oder ein
2.2.3 Bézierdarstellung von parametrisierten Punkt Pi ist und jeder Endpunkt einer Kante
Kurven und Flächen
höchstens zu zwei Kanten des Polygons gehört
Seit 1958 finden Freiformflächen Anwendung im (Abbildung 5). Ein ebenes geschlossenes und
CAD-Bereich insbesondere im Automobil- einfaches Polygon zerlegt die Ebene in mehrere
Karosseriebau. Pierre Bézier (Renault) und P. de Gebiete und zwar in mehrere innere und ein
Casteljau (Citroen) entwickelten etwa zeitgleich äusseres, das unbegrenzt ist.
jeweils eine Methode, die bei der Entwicklung von
Autoformteilen eingesetzt wurde beziehungsweise
heute noch eingesetzt wird. Die Bézierdarstellung
ist eine parametrische Repräsentation auf der Basis
von Bernstein-Polynomen.
2.2.3.1. Bézierflächen
Bézierflächen sind durch folgende Funktion
definiert:
Abbildung 5. Ein einfaches, geschlossenes
∑∑
n m
FB (u , v) = Pi , j Bi ,n (u ) B j , m (v) Polygon
i =0 j =0

Polygone können konvex oder nicht-konvex


Dabei sind B(i, n) die Bernstein-Polynome und
(konkav) sein. Ein konvexes Polygon hat die
können als Formfunktionen aufgefasst werden. In Eigenschaft, dass zwei beliebige, innerhalb des
Abbildung 4 ist ein Beispiel zwei miteinander Polygons gelegene Punkte mit einer Geraden
gekoppelter Bézierflächen dargestellt. verbunden werden können, die vollkommen
innerhalb des Polygons verläuft (Abbildung 6).
Nicht-konvexe Polygone können in konvexe
Teilpolygone zerlegt werden. Viele geometrische
Algorithmen, die auf Polygonen operieren, sind für
eine effiziente Arbeitsweise auf Konvexität
angewiesen.

Abbildung 4. Zwei Bezierflächen, 12 und 16


Kontrollpunkte, dargestellt durch 2400 Kanten
Abbildung 6. Konvexes (links) und nicht-
konvexes Polygon (rechts)
3 Polygonale Strukturen
Weitere Polygone mit besonderen Eigenschaften
3.1 Polygone sind Polygone mit Loch und Polygone mit
Allgemein nennen wir für eine Menge Selbstschnitt (Abbildung 7). Diese können
{P0 , P1 ,..., Pn } von Punkten im zwei- oder genauso wie konkave Polygone von vielen
Renderingsystemen nicht direkt verarbeitet
dreidimensionalen Raum die Menge werden, lassen sich aber immer in einfache
Q = {( P0 , P1 ), ( P1 , P2 ),..., ( Pn −1 , Pn )} ein Polygon Polygone zerlegen. Solche Formen, die für ihre
[1]. Dabei sind die Paare von Punkten jeweils Darstellung von Renderingsystemen gleich
Kanten des Polygons. Liegen alle Kanten eines interpretiert werden können heißen Geometrische
Polygons in einer Ebene, wird das Polygon planar Primitive.
genannt. Im Fall von Pn = P0 wird von einem
Dreiecke sind desshalb von großer Bedeutung,
weil sie die einfachste Form unter den Polygon
darstellen. Ein Polygon mit geringstmöglicher
Anzahl von Ecken und Kanten ist das Dreieck. Ein
Dreieck ist immer planar und liegt demzufolge
immer in einer Ebene, da Ebenen schon mit drei
nicht kollinearen Punkten beschrieben werden
können („Dreipunktegleichung“). Alle Polygone,
Abbildung 7. Polygon mit Loch (links) und
die keine Dreiecke sind lassen sich in solche
Polygon mit Selbstschnitt (rechts) zerlegen. Beim GL_TRIANGLE_STRIP bilden
die Punkte eine Folge von Dreiecken
3.2 OpenGL Primitive (1,2,3)(2,3,4)(3,4,5).... . Schliesslich bleibt uns nur
OpenGL Primitive sind Geomertische Primitive, noch das GL_TRIANGLE_FAN. Die Punkte
welche von OpenGL direkt verarbeitet werden. spannen einen Fächer auf und der erste Punkt
Eine Übersicht aller OpenGL-Primitive liefert uns bildet das Zentrum (1,2,3)(1,3,4)(1,4,5)... . Die
die zusammenfassende Darstellung in Abbildung zwei zuletzt genannten Primitive sind im Grunde
8. Die einfachste Form sind GL_POINTS. Es Dreiecksnetzte und werden im Abschnitt 5.2.2
werden Punkte an den durch die Ecken genauer beschrieben.
spezifizierten Positionen gezeichnet. Bei
GL_LINES beschreiben jeweils zwei 3.3 Polygonmodell
aufeinanderfolgende Ecken eine Linie. Bei einem
Viele Objekte bestehen nur aus ebenen
GL_LINE_STRIP werden die Punkte polygonalen Flächen. Auch gekrümmte Flächen
entsprechend ihrer Reihenfolge verbunden und bei lassen sich innerhalb eines annehmbaren
einer GL_LINE_LOOP wird die Linienfolge dann Toleranzbereiches durch ein Netz von kleinen
am Ende geschlossen. Beim GL_POLYGON ebenen polygonalen Facetten darstellen. Um
beschreiben die Ecken eine gefüllte Fläche. realistische Bilder von dreidimensionalen
Desweiteren gibt es noch GL_QUADS. Jeweils Objekten zu erzeugen, wobei versteckte Flächen
vier aufeinanderfolgende Punkte bilden ein nicht dargestellt werden und die Flächen in
Viereck. Und bei dem GL_QUAD_STRIP bilden Abhängigkeit verschiedener Lichtquellen schattiert
die Punkte eine Folge von Vierecken werden, sind Informationen über die Polygone
(A,B,C,D)(C,D,E,F)(E,F,G,H).... . Das bedeutenste
erforderlich. Deshalb werden in den meisten Fällen
Primitiv sind GL_TRIANGLES. Jeweils drei Polygonmodelle verwendet. Zwei Typen von
aufeinanderfolgende Punkte bilden ein Dreieck. Informationen werden über das jeweilige Objekt

Abbildung 8. OpenGL Geometrische Primitive.


gespeichert. Das sind die geometrische Index X Y Z
Information wie in Form von Punktkoordinaten 1 0 0 1
und die topologische Information, welche 2 1 0 1
beschreibt, wie die geometrischen Entitäten in 3 1 1 1
Beziehung zueinander stehen, zum Beispiel, 4 0 1 1
welche zwei Punkte miteinander verbunden sind. 5 0 0 0
In Abbildung 9 sind diese Informationen am 6 1 0 0
Beispiel des Hexaeders (Würfel) dargestellt. 7 1 1 0
8 0 1 0

Tabelle 1: Punktliste vom Hexaeder.

Index Zahl d. Punkte Indizes d. Punkte

1 4 1 2 3 4

2 4 2 6 7 3

3 4 4 3 7 8

4 4 6 5 8 7

5 4 5 1 4 8

6 4 5 6 2 1

Tabelle 2: Polygonliste vom Hexaeder.


Abbildung 9. Indexierung der Punkte vom
Polygonmodell eines Hexaeders Die Reihenfolge der Indizes von den Punkten, die
zum jeweiligen Polygon gehören ist so gewählt,
Diese Struktur ist grundlegend und das minimal daß immer zwei aufeinanderfolgende Indizes zu
Erforderliche für die polygonale Beschreibung von zwei benachbarten Punkten des Polygons gehören
Objekten. Um das Objekt zu transformieren, und damit eine Kante des Polygons bilden. Bei
genügt lediglich der Zugriff auf die Punktliste, es geschlossenen Polygonen gehören der erste und
brauchen nur die Punktkoordinaten transformiert letzte Index auch zweier benachbarter Punkte im
werden. Es verändern sich nicht die Verbindungen Polygon an und bilden die „abschließende“ Kante
zwischen den Punkten bei Skalierung, Rotation analog zu einer geschlossenen Vektorkette.
oder Translation. Die Skalierung ist aber hier ein
Sonderfall, weil sich zwar nicht die Verbindungen 4 Polygonale Shapes
zwischen den Punkten des Objektes aber seine Einige Renderer können verschiedene analytische
Geometrie verändert. Will man das Bild Beschreibungen direkt verarbeiten, zumeist ist
schattieren, wird die Polygonliste benötigt, da die jedoch eine Umsetzung in einfache Grundobjekte
in ihr enthaltenen Informationen es erlauben, jede wie Dreiecke erforderlich. Insbesondere
Fläche einzeln zu zeichnen. Desweiteren wird die verarbeiten Echtzeit-Renderingsysteme wie zum
Polygonliste für die Berechnung der Beispiel OpenGL Analytische Shapes nicht direkt.
Flächennormalen verwendet. Das Modell kann Die Analytischen Shapes müssen auf Polygonale
man um zusätzliche Informationen erweitern, Shapes abgebildet werden, welche für Echtzeit-
somit können zum Beispiel Farbeigenschaften oder Renderingsysteme ausgelegt und optimiert sind zur
Texturdaten gespeichert werden. Die geometrische Verarbeitung von polygonalen Strukturen
Information wird durch eine Liste aller Punkte insbesondere von Dreiecksstrukturen.
dargestellt, in der sowohl die den Punkten
eindeutig zugeordneten Indizes als auch die 4.1 Definition
Koordinaten der Punkte festgehalten werden
(Tabelle 1). Die topologische Information liegt in Ein polygonales Shape ist eine stückweise-lineare
Form einer Polygonliste vor, wo die nummerierten Fläche in 3 Dimensionen, die durch eine Menge
Polygone, Anzahl sowie Indizes der zum von Polygonen, meist Dreiecksflächen definiert ist.
jeweiligen Polygon gehörenden Punkte erfasst Gegenüber analytischen Shapes ist ihre Geometrie
werden (Tabelle 2). nur durch Eckeninformation beschrieben, nicht
durch mathematische Funktionen. Sie stellen
lediglich eine Ansammlung von Dreicksflächen
dar.
4.2 Polygonale Netze (0,1, 2,3, 4,5) definiert ein Triangle Strip wie in
Ein polygonales Netz wird auch als „Mesh“ Abbildung 10. Wenn die Nummerierung der
bezeichnet und ist ein polygonales Shape mit Eckpunkte den Durchlaufsinn festlegt, dann
besonderen Eigenschaften. Eine Menge von alterniert der Durchlaufsinn in diesem Triangle
geschlossenen, ebenen und einfachen Polygonen Strip. Das Dreieck (0,1, 2) wird gegen den
nennen wir polygonales Netz, sofern die folgenden Uhrzeigersinn durchlaufen, das darauf folgende
Forderungen erfüllt sind: mit dem Uhrzeigersinn und so weiter.
- Je zwei Polygone haben entweder keinen
Punkt oder eine Ecke oder eine ganze Kante
gemeinsam. Der Schnitt zwischen zwei
verschiedenen Polygonen ist entweder leer,
ein Eckpunkt eines Polygons oder eine Kante.
- Jede Kante eines Polygons gehört zu einem
oder höchstens zwei Polygonen. Abbildung 10. Triangle Strip (links) und
- Die Menge aller Kanten, die nur zu einem Triangle Fan (rechts)
Polygon gehören, ist entweder leer oder bildet
ein einziges, geschlossenes und einfaches 4.2.3 Vierecksnetze
Polygon.
Vierecksnetze sind geeignet als Kontrollgitter für
4.2.1 reguläre, irreguläre Netze Freiformflächen. Sehr häufig stellt man derartige
Flächen mithilfe von Vierecksnetzen dar
Ein Knoten beziehungsweise ein Punkt, welcher (Abbildung 11). Vierecksnetze lassen sich
Kanten des polygonalen Netzes verbindet heißt verwenden für Shapes, die aus mindestens einer
regulär, falls die Anzahl der Kanten die er Fläche bestehen, deren Projektion in die Ebene ein
verbindet 4 oder 6 ist. Ein Netz oder ein Teil eines Viereck ergibt, wie beispielsweise die
Netzes heisst regulär, wenn es nur reguläre Knoten Mantelfläche vom Zylinder.
enthält. Ein Netz heisst semi-regulär, wenn es aus
regulären Teilnetzen besteht, die sich in
möglicherweise irregulären Knoten treffen [2]. Der
Vorteil von regulären Netzen besteht in der
Einfachheit einer algorithmischen Indexierung
seiner Knoten. Insbesondere für Vierecksnetze
wird dazu noch ein Algorithmus vorgestellt.

4.2.2 Dreiecksnetze
Das Dreieck ist aus verschiedenen Gründen die Abbildung 11. Bézierfläche dargestellt durch
zentrale Form. Erstens ist bei einem Dreieck ein Vierecksnetz
immer sicher, dass das Polygon planar ist, denn
drei Punkte bestimmen eine Ebene und zweitens Es ist sehr einfach die Punkte aus dem
gibt es für die Speicherung von Dreiecksnetzen Polygonmodell von Vierecksnetzen zu indexieren.
sehr effiziente Datenstrukturen. Das Verhältnis Ein Quadrat, das in neun identische kleinere
zwischen der Anzahl der Ecken und der Anzahl Quadrate unterteilt ist stellt ein quadratisches
der Dreiecke bei sehr großen Dreiecksnetzen Gitter aus vier Zeilen und vier Spalten dar. Es
beträgt im Mittel 2. Um die Menge redundanter enthält somit 16 Punkte und 9 Polygone. Wir
Informationen für die Definition von nummerieren die Punkte jeweils von links nach
Dreiecksnetzen möglichst gering zu halten, gibt es recht, von oben nach unten durch. Der Punkt in der
verschiedene Ansätze. Optimal wäre es, für ein ersten Zeile und Spalte also der linke obere
gegebenes Dreiecksnetz mit jedem übertragenen Eckpunkt trägt die Nummer 0, der rechte obere
neuen Punkt ein neues Dreieck zu definieren. Eine Eckpunkt hat die Nummer 3, der Punkt in der
Möglichkeit, dieser Forderung nahe zu kommen, vierten Zeile und ersten Spalte also der linke
bildet ein Triangle Strip. Beim Triangle Strip untere Eckpunkt trägt die Nummer 12, der letzte
sowie beim Triangle Fan definieren n + 2 Punkt unten recht hat die Nummer 15. Die
Eckpunkte n Dreiecke und das Verhältnis Polygone des Gitters, die neun Quadrate werden
zwischen Eckpunkten und damit repräsentierten nach dem selben Prinzip nummeriert. Das Quadrat
Dreiecken ist folglich (n + 2) / 2 . Für große n oben links hat die Nummer 0, das oben rechts die
kommt dieser Bruch der Optimalforderung eines Nummer 2, jenes unten links trägt die Nummer 6
Verhältnisses von 1 recht nahe. Die Folge und entsprechend hat das letzte Quadrat unten
recht die Nummer 8. Abbildung 12 zeigt eine Mit dem in Pseudo-Code formulierten
solche Nummerierung am Beispiel des Gitters mit Algorithmus werden zuerst die Punkte und
30 Punkten und 20 Polygonen. anschliessend die Polygone des Gitters berechnet.

5 Realisierung analytischer und


polygonaler Shapes in VRS
5.1 Shapes in VRS
VRS implementiert Shapes auf die Art und Weise,
wie wir sie bisher beschrieben haben, also gemäß
ihrer Bedeutung und analog der Definition von
Shapes. Shapes in VRS sind geometrische Objekte
im zwei- und dreidimensionalen Raum. Und man
unterscheidet polygonale von analytischen
Objekten. In VRS gibt es die Klasse PolygonSet,
welche von der Klasse Shape erbt. Die Klasse
Abbildung 12. Indexierung eines PolygonSet repräsentiert Polygonale Shapes.
Vierecksnetzes Genauso gibt es Analytische Shapes, die wie
PolygonSet von der Klasse Shape erben. Dazu
Nun wird ein Algorithmus vorgestellt, der diese zählen zum Beispiel die Klasse Sphere und die
Indexierung eines Gitters von m Zeilen und n Klasse Torus. Einen Überblick der Klassen in
Spalten durchführt. Das Gitter von m Zeilen und VRS, welche für die Realisierung von Shapes
n Spalten ist dann ein Vierecksnetz bestehend aus wichtig sind liefert uns Abbildung 17 im Anhang.
m × n Punkten und (m − 1) × (n − 1) Polygonen. Dort wird zum Beispiel ersichtlich, dass die Klasse
Im folgenden Pseudo-Code benennen wir die Mesh eine Erweiterung der Klasse PolygonSet ist,
Anzahl der Zeilen m mit rows und die Anzahl was der Definition von Polygonalen Shapes und
der Spalten n mit columns . Netzen sehr nahe liegt. Im Grunde bildet sich also
procedure initPointsOfMesh( rows, columns ) begin die Klassenhierarchie von VRS auf die Definition
{ »
for each r ∈ n ∈ 0 ≤ n < rows do } der als Klasse formulierten Strukturen ab. Eine
{ »
for each c ∈ n ∈ 0 ≤ n < columns do } wichtige Eigenschaft von VRS ist, dass Shapes
i ← c + r ⋅ columns nicht das Verfahren zu ihrer Umsetzung wie zum
Pi ← (λx c, λ y r , λz f (c, r )) Beispiel graphisches Rendering definieren. Sie
end definiern also somit keine Attribute, die ihre
end Umsetzung gestalten wie beispielsweise Farbe
end oder Texturen. Shapes in VRS sind frei von
Sollen die x– und y–Koordinaten aller Punkte Pi Funktionalität, die zu ihrer Umsetzung in einem
des Gitters im Intervall [0,1] liegen, wählt man konkreten Renderingsystem oder
Renderingverfahren benötigt wird. Ausserdem
dementsprechend die Faktoren
erfolgt durch VRS eine strikte Trennung zwischen
1 1
λx = und λy = . Deklaration und Berechnung analytischer Shapes.
columns − 1 rows − 1 So sind zum Beispiel in der Klasse Sphere
procedure initPolygonsOfMesh( rows, columns ) begin
hauptsächlich die analytischen Parameter wie
{ »
for each r ∈ n ∈ 0 ≤ n < rows − 1 do } Mittelpunkt und Radius implementiert.
{ »
for each c ∈ n ∈ 0 ≤ n < columns − 1 do } Demzufolge findet man dort unter anderem die
Methoden setCenter(..) und setRadius(..).
i ← c + r ⋅ columns
P0 ← Pi
i ← c + r ⋅ columns + 1 5.2 Aufbau von VRS
P1 ← Pi Der Kern von VRS besteht im Großen und Ganzen
i ← c + (r + 1) ⋅ columns + 1 aus einer Sammlung von allgemein einsetzbaren
P2 ← Pi Renderingkomponenten. Dabei unterscheiden wir
i ← c + (r + 1) ⋅ columns
P3 ← Pi fünf Hauptkategorien (Abbildung 14):
i ← c + r ⋅ (columns − 1) - Shapes (geometrische Objekte)
Qi ← {( P0 , P1 ), ( P1 , P2 ), ( P2 , P3 ), ( P3 , P0 )} - Attribute (grafische und nichtgrafische
end Modifikatoren wie Farbe, Textur, Material)
end
- Handler (Auswertungsalgorithmen)
end
- Techniques (Auswertungsstrategien) Attributen, Handlern und Techniques bereit.
- Engines (Auswertungsmaschienen)
5.2.3 Generischer Kontext
Besonders interessant bei VRS ist, dass es mehrere
verschiedene Renderingsysteme integriert durch Der Generische Kontext verwaltet Handler in einer
Implementierung entsprechender Adapter- Handler-Tabelle, in welcher für einen bestimmten
Subsysteme für jedes Renderingsystem Service und ein bestimmtes Target der
(Abbildung 15). Somit ist es möglich, entsprechende Handler eingetragen ist. Diese
beispielsweise eine Kugel unter Verwendung von Tabelle ist eine Hashtable, in der man über einen
OpenGL, aber auch POVRay darzustellen. Dieses Schlüssel nämlich der Service-Id auf Werte
Adapter-Subsystem umfasst alle Painter- und zugreift, die wieder in Form einer Hashtable
Engine-Klassen, die zur Umsetzung insbesondere vorliegen. In dieser zweiten Hashtable erhält man
zum Zeichnen von Shapes für das konkrete dann über die Target-Id Werte, welche jeweils
Renderingsystem benötigt werden. einem Handler-Stack entsprechen (Abbildung 13).
Das oberste Element vom Stack ist der momentan
5.2.1 Handler aktive Handler des gewünschten Services für das
gewünschte Target. Kurz gesagt besteht jede
Handler sind Auswertungsalgorithmen für Shapes.
Tabellenzelle aus einem Stack von Handlern,
Sie werden in Kategorien eingeteilt. Eine solche
dessen oberstes Element der aktive Handler ist.
Kategorie heißt Service in VRS. Objekte, auf
Die Handler-Tabelle wird dynamisch zur Laufzeit
denen ein Handler operieren kann heißen
aufgebaut. Durch Installation beziehungsweise
entsprechend Targets. Diese Targets können auch
Deinstallation von Handlern ändert sich der
Shapes sein. Handler befassen sich also jeweils mit
Zustand des generischen Kontexts. Der Generische
der Auswertung eines einzelnen Shapes. Sie
Kontext verwaltet aber nicht nur Handler sondern
können wärend der Programmausführung in die
auch Attribute unter Verwendung von
Engine installiert beziehungsweise deinstalliert
Attributstacks. Attribute können ebenfalls zur
werden. Und die Funktionalität einer Engine ist
Laufzeit hinzugefügt und entfernt werden,
durch die in ihr installierten Handler festgelegt.
wodurch sich wieder der Zustand des Generischen
5.2.2 Engine Kontexts ändert (Abbildung 16).
Die Engine ist eine Auswertungsmaschiene,
welche auf Grundlage einer Auswertungsstrategie
Renderingkomponenten für Renderingsysteme
auswertet. Die Engine verfügt über Handler eines
speziellen Service für bestimmte Targets. Sie stellt
einen generischen Kontext zur Verwaltung von

Abbildung 14. Klassenmodell der Hauptkategorien von Renderingkomponenten.


verantwortlich für die Zerlegung der Shapes in
eine Sammlung „einfacher“ Shapes wie zum
Beispiel Dreiecke. Sie ermöglichen, dass die
Renderingsysteme Shapes verarbeiten, für die sie
selbst keine eigenen Handler bereitstellen.
Simplifier sind unabhängig von den speziellen
Renderingsystemen und nicht im jeweiligen
Adapter-Subsystemen enthalten. Für alle
Analytischen Shapes sind Simplifikations-Handler
in der Handler-Tabelle eingetragen.

5.3.2 Handler des Service „Paint“


Abbildung 13. Datenstruktur der Handler-
Handler des Service „Paint“ werden in VRS auch
Tabelle des Generischen Kontexts Painter genannt und sind im Gegensatz zu den
Simplifiern stets für das jeweilige spezielle
5.3 Aufbereiten der Renderingobjekte Renderingsystem geschrieben. Shape-Painter sind
Die Renderingobjekte insbesondere die Shapes spezielle Handler, die für das Zeichnen eines
müssen für verschiedene Renderingsysteme Shapes mit Hilfe eines konkreten
unterschiedlich aufbereitet werden. Die Shapes Renderingsystems verantwortlich sind. Wird zum
sind grundsätzlich auf jedes konkrete Beispiel für die OpenGL-Engine versucht, ein
Renderingsystem abbildbar, sofern die dazu Shape vom Typ „Sphere“ zu zeichnen, dann wird
benötigten Handler existieren und in der Engine zunächst der Simplifikationsservice aufgerufen,
installiert wurden. Die Handler für Shapes können um eine polygonale Repräsentation herzuleiten.
spezifisch für jede Engine zur Laufzeit durch Und für diese polygonale Repräsentation, das heißt
Installation und Deinstallation konfiguriert für ein PolygonSet existiert in der OpenGL-Engine
werden. ein Painter. Die Sphere kann nun gezeichnet
werden.
5.3.1 Handler des Service „Simplifikation“
Die Handler des Service „Simplifikation“ heißen 5.3.3 Konkreter Ablauf des Aufbereiten von
Renderingobjekten am Beispiel der
Simplifier. Sie berechnen für das gegebene Shape
Kugel
eine vereinfachte Darstellung auf Basis von
weniger komplexen Shapes. Und zwar wandeln die Den genaueren Ablauf des Aufbereiten von
Simplifier Analytische Shapes in eine Polygonale Renderingobjekten in VRS erkennt man an
Repräsentationen um. Simplifier sind also bestimmten Stellen im Sourcecode. Dazu zählen

Abbildung 15. Integration der Renderingsysteme in VRS


insbesondere die Methode eval(..) der Engine- leider nicht der Fall, ein Shape-Painter für Kugeln
Klasse und die Methode simplify(..) der jeweiligen ist also nicht vorhanden. Demzufolge sucht die
Simplifier-Klasse. Der Simplifier einer Kugel Engine einen Simplifier für die Kugel. Ein
entspricht der Klasse „SphereSimplifier“. Im Simplifier für die Kugel ist auch vorhanden,
Anhang finden wir dazu in Abbildung 18 ein nämlich der SphereSimplifier. Daraufhin wird bei
Sequenzdiagramm, das den Ablauf des dem gefundenen Simplifier die Methode
Aufbereitens von Renderingobjekten am konkreten simplify(..) aufgerufen und ihm dabei auch die
Beispiel der Kugel illustriert. Entsprechen ist in Engine übergeben. Um zu sehen, was nun
Abbildung 19 der relevanten Ausschnitt vom innerhalb der Methode simplify() des
Sourcecode der Methode eval(..) aus der Engine- SphereSimplifiers passiert, schauen wir uns die
Klasse dargestellt. Und in Abbildung 20 finden wir Abbildung 20 im Anhang genauer an. Es wird ein
dazu den relevanten Auschnitt vom Sourcecode Mesh durch die Methode createMesh(..) erzeugt.
der in Klasse „SphereSimplifier“ befindlichen Diese Methode ist eine interne Methode zur
Methode simplify(..). Die für das Verständniss des Generierung von Eckeninformationen, sie erstellt
Ablaufs besonders wichtigen Methodenaufrufe basierend auf einem Algorithmus Punktdaten.
sind rot gekennzeichnet. Wie veläuft nun das Dann wird unsere Kugel durch
Aufbereiten der Kugel, dass diese schliesslich Matrizenmultiplikation auf die durch den Radius
gezeichnet werden kann? Die Anfrage der gegebene Größe skaliert und nach der durch den
Evaluierung eines Shapes erfolgt durch den Aufruf Mittelpunkt festgelegten Position transformiert.
der Methode eval(..). Dabei wird das zu Die zwei eben genannten affinen Abbildungen
evaluierende Shape, in unserem Fall die Kugel, der werden anschliessend auf einen Stack gespeichert.
Engine übergeben. In der Methode eval(..) wird Und dann erfolgt wieder der Aufruf der Methode
wird dann ermittelt, um was für ein Typ es sich bei eval(..) bevor letztlich beide Elemente vom Stack
dem gegebenen Shape handelt. Dies erfolgt durch entfernt werden. Doch diesmal wird beim Aufruf
ein sogenanntes ClassInfo Objekt, welches in der Methode eval(..) das erzeugte Mesh übergeben.
unserem Fall eine SPHERE_ID liefert. Wir erkennen also, dass die Methode eval(..)
Anschliessend prüft die Engine, ob für Shapes indirekt auf rekursive Weise aufgerufen wird und
vom Typ „Sphere“ ein Painter existiert. Dies ist dabei jeweils unterschiedliche Shapes übergeben

VRS-Engine
Push/pop install/deinstall eval

Attribute
Attribut Handler Shape
Objekt 1 Objekt 1 Objekt

Attribut Handler Attributkategorie


Objekt 2 Objekt 2
Attributverwaltung

Attribut Handler
Objekt 3 Objekt 3 Service

Target
Attribut Handler
Objekt n Objekt n Handler-Tabelle

Generischer Kontext

Abbildung 16. Aufbau der Engine von VRS


werden, nämlich zuerst das Analytische Shape Fundament der große Implementierungsaufwand
Sphere und dann das Polygonale Netz. Nun gegenübersteht. Es reicht nicht Algorithmen als
schauen wir uns nochmal die Methode eval(..) in solche umsetzten zu können. Vielmehr erfordert
der Engine-Klasse an. Es wird zuerst wieder ein Echtzeit-Renderingsystem sowie andere
geprüft um was für ein Shape es sich handelt, das computergrafische Systeme ein qualitatives
ClassInfo Objekt liefert eine MESH_ID. Dann ordentliches Konzept, das es erlaubt trotz der
sucht die Engine nach einem Shape-Painter für das Weiterentwicklung von Grafikkarten, immer den
Mesh. Da kein Handler vom Service „Paint“ für aktuellen Anforderungen bezüglich der Umsetzung
das Mesh existiert, wird ein Simplifier gesucht. geometrischer Objekte gerecht zu werden. Das ist
Aber für das Mesh ist auch kein Simplifier in der Computergrafik besonders wichtig, da sie
vorhanden. In diesem Fall, wenn weder Painter teilweise hardwarenahe Programmierung
noch Simplifier existieren, wiederholt sich die einschliesst. VRS ist ein solches Echtzeit-
Suche für die jeweilige Superklasse des zu Renderingsystem, es wird sogar in größeren
zeichnenden Shapes. Es wird demzufolge von der Projekten wie zum Beispiel die Software für
Engine geprüft um was für ein Typ es sich handelt, Visualisierung geografischer Daten eingesetzt.
von dem das Shape abgeleitet ist. Aus dem in
Abbildung 17 dargestellten Klassendiagramm geht Literatur
hervor, dass die Klasse Mesh von der Klasse
PolygonSet erbt. Dementsprechend liefert das [1] Michael Bender, Manfred Brill.
ClassInfo Objekt diesmal eine PolygonSet_ID. Für Computergrafik. Ein anwendungs-
das PolygonSet findet die Engine schliesslich orientiertes Lehrbuch.
einen Painter, den PolygonSetPainterGL und [2] Marc Alexa, Diskrete Geometrische
beauftragt diesen, die Kugel zu rendern. Modellierung. TU Darmstadt. Slides, 2003.

6 Schlussfolgerungen Anhang
Der Leser erkennt wahrscheinlich leicht, dass
einem bereits vorhandenen mathematischen

Abbildung 17. Diagramm wichtiger Klassen von VRS.


Abbildung 18. Ablauf des Aufbereiten von Renderingobjekten
am Beispiel der Kugel
void Shader::eval(Engine* E, const MonoAttribute*, const Shape* S, unsigned int) {
VRS_Assertion(E, "no engine");
VRS_Assertion(S, "no shape");

// process the shape...


for(const ClassInfo* info = S->classInfoVRS(); info; info = info->parent()) {
const ID& name = info->name();

// if there's a painter, try to paint the shape and exit


if(ShapePainter* const shapePainter = VRS_Cast(ShapePainter, E->painter(name))) {
if(shapePainter->render(E, S)) {
return;
}
}

// look for a simplifier


if(ShapeSimplifier* const shapeSimplifier = VRS_Cast(ShapeSimplifier, E->simplifier(name))) {
if(shapeSimplifier->simplify(E, S)) {
return;
}
}
}

// no painter and no simplifier found


VRS_Warning(false, "does not know how to render " << S->classNameVRS() << " objects");
}

Abbildung 19. Ausschnitt aus dem Sourcecode der Klasse „Shader“

bool SphereSimplifier::simplify(Engine* E, const Shape* S) {


VRS_Assertion(E, "no engine");
const Sphere* sphere = VRS_GuardedCast(const Sphere, S);

Tessellation* tes = VRS_GuardedGetMonoAttribute(Tessellation, E);


int nx, ny;
tes->evaluate(E, S, nx, ny);
nx += 3;
ny += 3;

SphereGenerator* generator = new SphereGenerator(sphere, nx, ny);


SO<Mesh> mesh = ShapeSimplifier::createMesh(E, generator);
delete generator;

Vector c = sphere->getCenter();
double r = sphere->getRadius();

Matrix tf(r, 0, 0, c[0],


0, r, 0, c[1],
0, 0, r, c[2],
0, 0, 0, 1 );

E->pushTf();
E->multTf(tf);
E->eval(mesh);
E->popTf();

return true;
}

Abbildung 20. Ausschnitt aus der Klasse „SphereSimplifier“


Abbildung 21. Darstellung einer Kugel durch VRS, deren Vervollständigungswinkel 360° beträgt (links)
und deren Vervollständigungswinkel kleiner als 360° ist (rechts).

Abbildung 22. Darstellung eines Torus durch VRS, dessen Vervollständigungswinkel 360° beträgt (links)
und dessen Vervollständigungswinkel kleiner als 360° ist (rechts).

Das könnte Ihnen auch gefallen