Algorithmen der Computergraphik

Werbung
Universität Paderborn
Sommersemester 2009
S KRIPT ZUR VORLESUNG
Algorithmen der Computergraphik
Dozent: Dr. Matthias Fischer
Christian Heinzemann
15. Dezember 2009
Inhaltsverzeichnis
1 Walkthrough-Problem
1.1 Rendering Pipeline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2 Z-Buffer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3 Walkthrough-Systeme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2 Trees
2.1 kd-Bäume . . . . . . . . . . . . . . . . . . . . . . .
2.1.1 Konstruktion . . . . . . . . . . . . . . . . .
2.1.2 Bereichsanfragen . . . . . . . . . . . . . . .
2.1.3 Zusammenfassung der Eigenschaften . . . .
2.2 BSP-Bäume . . . . . . . . . . . . . . . . . . . . . .
2.2.1 Grundidee . . . . . . . . . . . . . . . . . . .
2.2.2 Anwendungsbeispiel: Painter’s Algorithmus
2.2.3 Konstruktion - 2D . . . . . . . . . . . . . .
2.2.4 Konstruktion - 3D . . . . . . . . . . . . . .
2.3 Quadtrees und Octrees . . . . . . . . . . . . . . . .
2.3.1 Speichern von Elementen . . . . . . . . . .
2.3.2 Aufbau . . . . . . . . . . . . . . . . . . . .
2.3.3 Suche im Quadtree . . . . . . . . . . . . . .
2.3.4 Balancierte Quadtrees . . . . . . . . . . . .
2.4 Loose Octrees . . . . . . . . . . . . . . . . . . . . .
2.4.1 Konstruktion . . . . . . . . . . . . . . . . .
2.4.2 Nutzen . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3 Visibility Culling
3.1 Potentially Visible Sets . . . . . . . . . . . . . . . . . . . .
3.2 Occlusion Culling mit Potentially Visible Sets . . . . . . . .
3.2.1 Idee der Methode . . . . . . . . . . . . . . . . . . .
3.2.2 Berechnung des Adjazenzgraphen . . . . . . . . . .
3.2.3 Berechnung der Cell-to-Cell Visibility . . . . . . . .
3.2.4 Berechnung der Eye-to-Cell Visibility . . . . . . . .
3.2.5 Objekte in Räumen . . . . . . . . . . . . . . . . . .
3.3 Dynamische Berechnung von Potentially Visible Sets (PVS)
3.4 Hierarchischer Z-Buffer . . . . . . . . . . . . . . . . . . . .
3.4.1 Grundideen . . . . . . . . . . . . . . . . . . . . . .
3.4.2 Z-Pyramide . . . . . . . . . . . . . . . . . . . . . .
I
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
1
2
3
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4
4
4
6
10
10
10
11
13
16
19
20
21
23
23
29
30
33
.
.
.
.
.
.
.
.
.
.
.
35
37
38
38
39
40
41
43
43
45
45
46
Inhaltsverzeichnis
3.5
3.6
3.4.3 Verwendung der Z-Pyramide . . . . . . . . .
3.4.4 Rendering mit dem Hierarchischen Z-Buffer
3.4.5 Hardwareunterstützung . . . . . . . . . . . .
Hierarchical Occlusion Maps (HOM) . . . . . . . .
3.5.1 Der HOM-Algorithmus . . . . . . . . . . . .
3.5.2 Betrachtung der Teilschritte . . . . . . . . .
3.5.3 Approximatives Visibility Culling . . . . . .
Zusammenfassung . . . . . . . . . . . . . . . . . .
4 Replacement
4.1 Rendering mit Color-Cubes . . . . . . .
4.1.1 Datenstruktur . . . . . . . . . .
4.1.2 Rendering . . . . . . . . . . . .
4.1.3 Aufbau der Hierarchie . . . . .
4.1.4 Aufwandsabschätzung . . . . .
4.1.5 Bildqualität . . . . . . . . . . .
4.2 Hierarchical Image Caching . . . . . .
4.2.1 Erster Rendering Durchlauf . .
4.2.2 Zweiter Rendering Durchlauf .
4.2.3 Partitionierung der Szene . . . .
4.2.4 Berechnung der Splittingebenen
4.2.5 Fehlermetrik . . . . . . . . . .
4.2.6 Artefakte . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
47
49
50
50
51
52
55
55
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
56
56
56
57
57
59
60
62
63
64
64
66
67
68
5 Paralleles Rendering
5.1 Paralelles Rendering als Sortierproblem . . . . . . .
5.1.1 Sort-First . . . . . . . . . . . . . . . . . . .
5.1.2 Sort-Middle . . . . . . . . . . . . . . . . . .
5.1.3 Sort-Last . . . . . . . . . . . . . . . . . . .
5.2 Hybrides Sort-First / Sort-Last Rendering . . . . . .
5.2.1 Grundidee der Partitionierung . . . . . . . .
5.2.2 Ablauf des Rendering . . . . . . . . . . . .
5.2.3 Partitionierungs-Algorithmus . . . . . . . .
5.2.4 Abschätzung des Kommunikations-Overhead
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
69
70
70
71
72
74
74
75
76
77
6 Level of Detail
6.1 Arten des Level of Detail . . . . . . . . .
6.1.1 Discrete Level of Detail . . . . .
6.1.2 Continuous Level of Detail . . . .
6.1.3 View-Dependent Level Of Detail .
6.2 LOD - Hierarchie . . . . . . . . . . . . .
6.3 Automatische Frameratenregulierung . .
6.4 Vereinfachung von Polygonmodellen . . .
6.4.1 Decimation . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
79
80
80
80
80
80
81
82
82
AlgoCG 09
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
II
Inhaltsverzeichnis
.
.
.
.
.
.
.
.
.
83
84
84
85
85
86
87
87
88
7 Aspect Graph und Viewpoint Space Partition
7.1 Viewpoint Space Partition . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.2 Aspect Graph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
89
89
91
AlgoCG 09
III
6.5
6.4.2 Sampling . . . . . . . . . . . . . . . . . .
6.4.3 Vertex Merging . . . . . . . . . . . . . . .
6.4.4 Adaptive Subdivision . . . . . . . . . . . .
Schrittweise Verfeinerung mit Progressive Meshes .
6.5.1 Vergröberung . . . . . . . . . . . . . . . .
6.5.2 Verfeinerung . . . . . . . . . . . . . . . .
6.5.3 Messung der Qualität . . . . . . . . . . . .
6.5.4 Verfeinerungsalgorithmus . . . . . . . . .
6.5.5 Anwendungen . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1 Walkthrough-Problem
Das Ziel ist die effiziente Berechnung von 3D-Ansichten in einem Walkthrough-System, d.h.
die Ansicht wird durch die Bewegung des Anwenders bestimmt und kann nicht im Voraus
berechnet werden, wie dies bei Animationsfilmen möglich ist. Die Berechnung muss deshalb
in Echtzeit erfolgen, wodurch besondere Anforderungen an die Effizienz der verwendeten
Algorithmen entstehen. Die einzelnen Algorithmen sind in einer sogenannten RenderingPipeline angeordnet und werden nacheinander ausgeführt.
1.1 Rendering Pipeline
Das Rendering ist der Vorgang zum Erstellen von 2D Bildern aus einer 3D-Szene zum Anzeigen auf einem Display. Die Rendering Pipeline in Abbildung 1.1 beschreibt die Anordnung
der dafür notwendigen Algorithmen.
3D-Modell erstellen
(Modellierung)
3D → 2D
Transformation
Versteckte Kanten
entfernen
(Culling, Z-Buffer)
Rasterung,
Anti-Aliasing
Beleuchtung
Abbildung 1.1: Rendering Pipeline.
Zunächst wird ein 3D-Modell der Szene erstellt. Oberflächen werden durch ein feines Zusammensetzen von Polygonen (Dreiecken) modelliert. Dadurch entsteht ein feines Netz von Polygonen. Jedes Dreieck ist durch die 3D-Koordinaten seiner drei Eckpunkte gegeben. Anschließend wird das 3D-Objekt über Geometrietransformationen auf 2DBildschirmkoordinaten abgebildet und dann beleuchted. Danach werden die nicht-sichtbaren
Kanten entfernt und das entstandene Bild wird gerastert, d.h. es wird auf eine 2D-Pixel-Fläche
abgebildet.
Die Rendering-Pipeline nutzt als Primitiven nur Dreiecke, Linien und Punkte. Oberflächen
und Kurven werden über NURBS (Non-Uniform Rational B-Spline) aus den Grundprimitiven
approximiert.
Die auf dem Prozessor ausgeführte Anwendung berechnet die Objekte der Szene über Libraries wie OpenGL oder DirectX, die Grafikkarte übernimmt die Geometrietransformationen
und die Rasterung.
1
Kapitel 1. Walkthrough-Problem
1.2 Z-Buffer
Für die Darstellung einer Szene braucht man zwei Puffer: den Z-Buffer und den Framebuffer.
Der Z-Buffer ist ein 2-dimensionales Feld in der Größe der Bildschirmauflösung, dass für
jedes Pixel den Tiefenwert (z-Wert) speichert. Dies ist die Entfernung zum Betrachter.
Der Framebuffer enthält die Pixel der vordersten Oberfläche, je Pixel mindestens einen
Farbwert.
Algorithmus 1 Z-Buffer Algorithmus
1: function Z-B UFFER( )
2:
Setze alle Einträge im z-Buffer auf Hintergrundentfernung
3:
Setze alle Einträge im Frame-Buffer auf Hintergrundfarbe
4:
for all Polygone P do
5:
Projiziere Polygon P auf Bildschirmebene
6:
Transformiere Resultat in Rasterkoordinaten (Pixel)
7:
for all Pixel (u, v) des Polygons do
8:
p := z - Koordinate des Polygons im Pixel (u, v)
9:
z := Eintrag im z-Buffer für das Pixel (u, v)
10:
if p < z then
11:
z-Buffer (u, v) := p
12:
Frame-Buffer (u, v) := Farbe(P, u, v)
13:
end if
14:
end for
15:
end for
16:
return success
17: end function
Die äußere For-Schleife für die Geometrietransformation aus, die innere die Rasterung.
Eine Szene, bei der die Geometrietransformation die Laufzeit dominiert, ist eine Szene mit
sehr vielen kleinen Objekten, von denen viele vielleicht gar nicht sichtbar sind. Diese müssen
alle explizit gerendert werden, obwohl sie jeweils nur eine kleine Anzahl von Pixeln haben.
Im Gegensatz dazu ist bei einer großen Fläche der Aufwand für die Geometrietransformation
gering, während viele Pixel gerastert werden müssen.
Vorteile
Nachteile
• einfach, keine Sortierung
• Alle Polygone werden gerendert
• gute Hardware-Unterstützung
• Lineare Laufzeit
• einfach zu parallelisieren
• Keine Zusammenhänge im Objektraum
• Größe der Szene beschränkt (für Echtzeitrendering)
AlgoCG 09
2
Kapitel 1. Walkthrough-Problem
1.3 Walkthrough-Systeme
Zunächst hat man eine 3D-Szene, die aus Objekten besteht, die über Polygone modelliert sind.
In einem Walkthrough-System kann sich der Betrachter frei durch die Szene bewegen. Dazu
werden die Position und die Orientierung der Kamera verändert. Die Bilder können damit
nicht vorberechnet werden, sollen aber dennoch eine hohe Qualität aufweisen. Das Rendering
muss somit in Echtzeit passieren.
Damit eine Bilderzeugung als ruckelfrei empfunden wird, benötigt man mindestens eine
Framerate von 20-30 fps. Werden alle Polygone zur Graphikkarte geschickt, erhält man ab einer bestimmten Anzahl von Polygonen keine akzeptablen Renderingzeiten mehr. Dafür benötigt man Verfahren mit sublinearer Laufzeit. Die Laufzeit soll abhängig von der Bildschirmauflösung, aber unabhängig von der Anzahl der Polygone sein.
Eine Beschleunigung der Laufzeit erreicht man durch:
1. Vermeide alle Polygone an die Graphikkarte zu schicken.
2. Vermeide häufige „Zustandswechsel“ (Farbe, Transformationen, ...)
3. Nutze spezielle CPU/GPU Befehle
Über (1) wird die Größe der darzustellenden Szene reduziert, d.h. es wird nur noch der
relevante Teil gerendert. Über (2) und (3) wird die Anzahl der Rechenschritte reduziert und
beschleunigt, die für die Darstellung eines Polygons notwendig sind.
Damit
verbessern (2) und (3)-die
Konstanten der Laufzeit, (1) hingegen
verbessert
die asymHEINZ NIXDORF
INSTITUT
Walkthrough-Problem
Echtzeit-Rendering
!"#$%&'#()(*+,-%&./&"
ptotische
Laufzeit.
gibt zwei Ansätze, dies zu erreichen:
012/&#(34%"*5"-*6/471%8#()(
Entlastung
der Es
Rendering-Pipeline
• Approximation (Level of Detail)
9:%#*0"')(;%*5"-*<%#'7#%1%
Ein weniger komplexes Modell wird erzeugt, das (fast) genauso gut aussieht wie das
= Approximation
- Level
Detail
ursprüngliche
Modell
(sieheofdazu
auch Kapitel 6).
>(%11%*%#"*:%"#2%&*?/471%8%'*@/-%11*-,&A*-,'*BC,'(D*2%",5'/*25(*,5''#%3(*
:#%*-,'*5&'7&E"21#F3%*@/-%11
• Sichtbarkeitsprüfung
(Visibility Culling)
Schicke
möglichst nur sichtbare
Polygone
zur Rendering Pipeline (siehe dazu auch Ka= Sichtbarkeitsprüfung
- Visibility
Culling
pitel>F3#F?%*4G21#F3'(*"5&*'#F3(.,&%*+/1H2/"%*;5&*I%"-%&#"2*+#7%1#"%
3).
077&/8#4,(#/"
2%/4%(&#'F3%'
JKL@/-%11
0":%"-5"2
I%"-%&%&
+#7%1#"%
<#1-
>#F3(.,&?%#('7&EC5"2
O/&1%'5"2*P012/&#(34%"*#"*-%&*Q/475(%&2&,C#?RA*>>*STTU
@,((3#,'*M#'F3%&
JN
Abbildung 1.2: Entlastung der Rendering Pipeline.
AlgoCG 09
3
2 Trees
Die in diesem Kapitel beschriebenen Datenstrukturen dienen zur effizienten Speicherung von
Punkten. Das Ziel ist es, basierend auf einem sichtbaren Ausschnitt die nicht-sichtbaren Objekte effizient berechnen zu können, um diese nicht zum Rendern an die Grafikkarte schicken
zu müssen.
2.1 kd-Bäume
kd-Bäume dienen zur Sortierung von Objekten bzw. Punkten im k-dimensionalen Raum. Sie
werden für (orthogonale) Bereichsanfragen, d.h. für die Berechnung aller Punkte, die sich
innerhalb eines Rechtecks oder Würfels befinden, eingesetzt. Eine weitere Anwendung sind
Verdeckungsberechnungen. Im Folgenden wird nur der 2D-Fall betrachtet.
Ein Punkt p = (px , py ) im 2-dimensionalen Raum liegt in einem Rechteck [x : x0 ] × [y : y 0 ]
genau dann, wenn px in [x : x0 ] und py in [y : y 0 ] liegt. Es sollen nun wie in Abbildung 2.1
dargestellt alle Punkte bestimmt werden, die im Rechteck liegen.
Abbildung 2.1: Orthogonale Bereichsanfrage: Punkte bestimmen, die im Rechteck liegen.
2.1.1 Konstruktion
Es wird ein Binärbaum aufgebaut, der als Blätter die Objekte bzw. Punkte enthält und als innere Knoten sogenannte Splitting-Geraden. Eine Splitting-Gerade teilt die Menge der Punkte
in zwei gleich große Teile, indem der Median der x-Koordinaten bzw. der y-Koordinaten berechnet wird. Dabei wird abwechselnd in x-Richtung und in y-Richtung unterteilt. Die ent-
4
Kapitel 2. Trees
stehenden Teilmengen werden über das linke bzw. rechte Kind des Baums gespeichert. Ein
Beispiel zeigt Abbildung 2.2.
Abbildung 2.2: Beispiel für einen kd-Baum.
Die Wurzel besitzt Tiefe 0, somit hat der Baum in Tiefe k immer 2k Knoten. Die SplittingGeraden verlaufen achsenparallel zur x- bzw. y-Achse. In einer geraden Baumtiefe wird immer vertikal unterteilt (bzgl. der x-Koordinate), in einer ungeraden Baumtiefe horizontal (bzgl.
der y-Koordinate). Abbildung 2.3 stellt die Unterteilung der Punktemenge dem aufgebauten
Binärbaum gegenüber.
Abbildung 2.3: Zweites Beispiel für einen kd-Baum.
Den Algorithmus zum Aufbau des kd-Baums zeigt Algorithmus 2. Der Algorithmus erhält
als Eingabe eine Menge von Punkten und gibt die Wurzel des kd-Baums als Ergebnis zurück.
Der Aufbau eines kd-Baumes mit n Punkten benötigt Platz O(n). Die Laufzeit eines Aufrufs wird von der Bestimmung der Splitting-Geraden dominiert. Dabei benötigt die Bestim-
AlgoCG 09
5
Kapitel 2. Trees
Algorithmus 2 Algorithmus zum Aufbau eines kd-Baumes
1: function B UILD KDT REE(Set of Points P , depth)
2:
if P enthält nur einen Punkt p then
3:
return Blattknoten, der p speichert
4:
else
5:
if depth gerade then
6:
Teile P mit vertikaler Linie I durch den Median bzgl. x-Koordinate in Mengen
P1 , P2
7:
else
8:
Teile P mit horizontaler Linie I durch den Median bzgl. y-Koordinate in
Mengen P1 , P2
9:
end if
10:
vlef t = BuildKDTree(P1 , depth + 1)
11:
vright = BuildKDTree(P2 , depth + 1)
12:
Erzeuge Knoten v mit linkem Nachfolger vlef t und rechtem Nachfolger vright und
Splittinggerade I
13:
end if
14:
return v
15: end function
mung des Medians Zeit O(n). Da diese Algorithmen kompliziert sind, wird in der Regel der
Punktemenge in zwei Liste (eine für x-Koordinate, eine für y-Koordinate) sortiert. Damit läuft
die Bestimmung des Medians in Zeit O(1), man benötigt aber Zeit O(n) für das Erzeugen der
Teillisten. Der Aufbau kann damit über folgende Rekurrenzgleichung beschrieben werden:
O(1)
,n = 1
T (n) =
n
O(n) + 2T (d 2 e) , n > 1
Da sich Eingabegröße in jedem Schritt halbiert, sind log(n)-Aufrufe notwendig, die jeweils
Laufzeit O(n) besitzen. Damit folgt insgesamt Laufzeit O(n log(n)). Da der Baum aber nur
einmal vor Beginn des Walkthroughs aufgebaut werden muss und dann während des gesamten
Walkthroughs benutzt werden kann, ist dies nicht schlimm. Allgemein benötigt die Konstruktion für k-Dimensionen und n Punkte Zeit O(n(k + log(n))).
2.1.2 Bereichsanfragen
Bereichsanfragen sollen zu einem achsenparallelen Rechteck alle Punkte zurückgeben, die in
dem Rechteck enthalten sind. Dazu wird geprüft, welche Regionen des kd-Baumes in dem
Rechteck enthalten sind oder sich mit diesem schneiden. Eine Region ist die Punktemenge,
die auf mindestens einer Seite durch eine Splittinggerade begrenzt ist. Für einen Knoten v des
Baums sind dies alle Splittinggeraden entlang des Pfads zur Wurzel. Eine Region kann damit
geschlossen (Rechteck) oder an mehreren Seiten offen sein. Abbildung 2.4 zeigt ein Beispiel.
Bei der Berechnung wird nun unterschieden zwischen Regionen, die vollständig im Rechteck enthalten sind, und Regionen, die von dem Rechteck geschnitten werden. Bei ersteren
AlgoCG 09
6
Kapitel 2. Trees
Abbildung 2.4: Regionen in einem kd-Baum.
werden alle Punkte ausgegeben, bei letzteren muss für jeden Punkt geprüft werden, ob er in
dem Rechteck enthalten ist. Abbildung 2.5 zeigt ein Beispiel.
Die türkis umrandete Region ist vollständig im roten Rechteck enthalten. Die im Baum
hellgrau hervorgehobenen Regionen werden durch das Rechteck geschnitten. In diesem Fall
ergibt die Einzelprüfung, dass die Punkte p6 und p11 im Rechteck enthalten sind, die Punkte
p3, p12 und p13 hingegen nicht. Das generelle Vorgehen beschreibt Algorithmus 3.
Die Funktion ReportSubTree(v) gibt den vollständigen Teilbaum mit Wurzel v aus. Die
Funktionen lc(v) bzw. rc(v) geben das linke bzw. rechte Kind des Knotens zurück. Die
Funktion p(v) liefert den Punkt, der in Knoten v gespeichert ist. Die Berechnung der Regionen
kann entweder in einem Preprocessing für alle Knoten durchgeführt werden oder „live“ bei der
Traversierung des Baums, indem die jeweilige Region mit dem Halbraum der Splittinggerade
des aktuellen Knotens ver-∩-det wird.
Um die Laufzeit der Bereichsanfrage zu bestimmen, müssen vorher output-sensitive Algorithmen definiert werden.
Definition 2.1.1 (Output-sensitiv)
Ein Algorithmus ist output-sensitiv, wenn seine Laufzeit von der Größe der Ausgabe abhängt.
Sei nun k die Anzahl aller Punkte im Rechteck [x : x0 ] × [y : y 0 ]. Eine lineare Suche
würde Zeit O(n) benötigen. Dies ist jedoch nicht notwendig. Die Ausgabe wird zum einen
durch die Aufrufe der ReportSubTree() Methode bestimmt und zum anderen durch die Anzahl
der SearchKDTree() Aufrufe für geschnittene Regionen. Die Summe aller ReportSubTree()
Aufrufe ist O(k), da maximal k Knoten ausgegeben werden.
Für die Bestimmung der Anzahl der rekursiven Aufrufe von SearchKDTree muss man wissen, wie viele Regionen das Rechteck schneidet. Das direkte Zählen ist durch die freie Platzierung nicht möglich, stattdessen zählt man, wie viele Regionen eine unendlich lange Gerade schneidet (stellvertretend für eine Seite des Rechtecks, muss für jede Seite einmal ausgeführt werden um den Gesamtaufwand zu erhalten.) Betrachtet man eine vertikale Gerade
AlgoCG 09
7
Kapitel 2. Trees
Abbildung 2.5: Auswertung von Regionen in einem kd-Baum.
Algorithmus 3 Algorithmus zur Durchführung von Bereichsanfragen auf einem kd-Baum
1: function S EARCH KDT REE(Node v, Range R)
2:
if v ist Blattknoten then
3:
wenn p(v) in R, gib p(v) aus
4:
else
5:
if region(lc(v)) vollständig in R then
6:
ReportSubTree(lc(v))
7:
else
8:
if region(lc(v)) schneidet R then
9:
SearchKDTree(lc(v), R)
10:
end if
11:
end if
12:
if region(rc(v)) vollständig in R then
13:
ReportSubTree(rc(v))
14:
else
15:
if region(rc(v)) schneidet R then
16:
SearchKDTree(rc(v), R)
17:
end if
18:
end if
19:
end if
20: end function
AlgoCG 09
8
Kapitel 2. Trees
und vertikale Splittinggeraden, so kann die Gerade immer nur einen der beiden Halbräume
der Splittinggeraden schneiden, aber nie beide (vgl. auch Abbildung 2.6)!
vertikale Gerade
vertikale Splittinggerade
Abbildung 2.6: Geschnittene Regionen bei vertikaler Gerade und vertikaler Splittinggerade.
Es beschreibt nun T (n) die Anzahl der geschnittenen Regionen eines kd-Baums, dessen
Wurzel eine vertikale Splittinggerade enthält. Da sich eine Rekursionsstufe tiefer eine horizontale Splittinggerade befindet, steigt man immer 2 Rekursionsstufen auf einmal ab, muss
dort aber beide gefundenen Knoten überprüfen wie in Abbildung 2.7 dargestellt. Jede dieser
Regionen enthält nach Konstruktion n4 Punkte.
Abbildung 2.7: Geschnittene Regionen im kd-Baum.
Damit ergibt sich insgesamt für die Anzahl der Aufrufe:
O(1)
,n = 1
T (n) =
2 + 2T (d n4 e) , n > 1
√
Dies ergibt O( n)√Aufrufe der SearchKDTree-Funktion und zusammen mit der Ausgabe
eine Laufzeit von O( n + k).
AlgoCG 09
9
Kapitel 2. Trees
2.1.3 Zusammenfassung der Eigenschaften
kd-Bäume sind Binärbäume, die über die Berechnung von Achsenparallelen Splitting-Geraden
gebildet werden. Die Teilmengen, in die die Objektmenge zerlegt wird, sind ungefähr gleich
groß (Teilung am Median der jeweiligen Schnittrichtung). In gerader Tiefe gibt es vertikale Splitting-Geraden (Unterteilung nach x-Koordinate), in ungerader Tiefe gibt es horizontale Splitting-Geraden (Unterteilung nach y-Koordinate).
Die Konstruktion benötigt Zeit
√
O(n log(n)), eine achsenparallele Bereichsanfrage O( n + k). Die Platzkomplexität beträgt
O(n).
2.2 BSP-Bäume
BSP-Bäume sind eine Form des Preprocessing, die es für statische Szenen erlaubt, den
Painter’s Algorithmus effizient und zur Laufzeit unabhängig vom Standpunkt anzuwenden.
Der Painter’s Algorithmus dient zum Hidden Surface Removal, zur Verdeckungsberechnung
(Occlusion-Culling, Kap. 3) und zur Darstellung transparenter Objekte HEINZ
bzw. NIXDORF
Schatten.
INSTITUT
!"#$!%&'
!"#$%&'#()(*+,-%&./&"
Das
Verfahren
ist
im
Vergleich
zu
anderen
Preprocessingverfahren
Zeitund
speicherinten012/&#(34%"*5"-*6/471%8#()(
!"##
siv. Dafür ist es effizient für statische Szenen und erlaubt das Display in linearer Zeit.
9#&*.%(&,:3(%"*;<+=;)54%*$/"*
2.2.1
Grundidee
> ?#"#%"*#4*@A=B,54
Es wird
eine Paritionierung der Dreiecke in einer Szene durchgeführt, die einer Tiefensortie> A&%#%:C%"*D+/1E2/"%"F*#4*GA=B,54
rung entspricht. Findet man nun eine Gerade oder Ebene, die eine Gruppierung von DreiGrundlegende Idee:
ecken (der Szene) aufteilt, dann weiß man automatisch, dass Elemente auf der gleichen Seite
H#%I%"'/&(#%&5"2*5"-*J&577#%&5"2
wie >dem
Betrachterstandpunkt nicht von Dreiecken auf der anderen Seite verdeckt werden
können.
Umgekehrt
jedoch schon. Dies stellt Abbildung 2.8 dar.
> ;%(&,:3(%*%#"%*<K%"%*,1'*J&577#%&5"2*$/"*?#"#%"LA&%#%:C%"
9%""*%#"%*Gerade/Ebene 2%I5"-%"*M%&-%"*C,""N*-#%*%#"%*J&577#%&5"2*,5I(%#1(*
Abbildung 2.8: Aufteilung einer Gruppierung von Dreiecken durch eine Splittinggerade.
-,""*2#1(O
?#"#%"LA&%#%:C%*,5I*-%&*21%#:3%"*<%#(%*M#%*-%4*;%(&,:3(%&'(,"-75"C(
Durch
die weitere Aufteilung der Gruppen erhält man einen Binärbaum dessen innere KnoM%&-%"*"#:3(*$%&-%:C(*$/"*?#"#%"LA&%#%:C%"*,5I*-%&*,"-%&%"*<%#(%*D542%C%3&(*X,F
ten Splittinggeraden (2D) bzw. -ebenen (3D) sind. Die Blätter entsprechen Regionen im
@R
P,((3#,'*Q#':3%&
S/&1%'5"2*T012/&#(34%"*#"*-%&*U/475(%&2&,I#CVN*<<*@WWR
Raum, die eine vollständige, disjunkte Aufteilung (Partionierung) der Ebene bzw. des Raums
darstellen. Jedes Blatt enthält ein Dreieck bzw. ein Fragment. Abbildung 2.9 zeigt ein Beispiel, in dem die Splittinggeraden durch die Geraden der Szene gelegt wurden, d.h. ein innerer
Knoten kodiert nicht nur die Region sondern speichert auf die Gerade. Alle übrigen Liniensegmente werden in den Blättern gespeichert. Man nennt diesen Vorgang auch Autopartition.
Es bezeichnet h- den linken und h+ den rechten Halbraum der Splittinggerade.
AlgoCG 09
10
F 1%2%"*@#&*G71#((#"22%&,-%"*-5&B3*H#"#%"%1%4%"(%:
1%2%" @#& G71#((#"22%&,-%" -5&B3 H#"#%"%1%4%"(%
F '7%#B3%&"*'#%*#"*#""%&%"*6"/(%":
F 5"-*'7%#B3%&"*&%'(1#B3%*H#"#%"%1%4%"(%*#"*E1)((%&"
5"- '7%#B3%&" &%'(1#B3% H#"#%"%1%4%"(% #" E1)((%&"
Kapitel 2. Trees
39
3;
39
3;
I,((3#,'*J#'B3%&
M/&1%'5"2*N012/&#(34%"*#"*-%&*O/475(%&2&,P#>Q:*GG*RSST
KL
Abbildung 2.9: Autopartition einer Menge von Geraden im 2D.
Es ist auch möglich, die Splittinggeraden unabhängig von den Objekten zu legen. Dieses
Verfahren ist jedoch komplizierter, da gute Geraden berechnet werden müssen, die eine kleine
Partitionierung erreichen ohne Dreiecke in Fragmente zu teilen.
2.2.2 Anwendungsbeispiel: Painter’s Algorithmus
Der Painter’s Algorithmus dient zum Zeichnen von Dreiecken. Der naive Algorithmus führt
eine Sortierung der Dreiecke nach ihrer Entfernung vom Betrachter durch (Tiefensortierung).
Anschließend zeichnet er (wie ein Maler) von hinten nach vorne das Bild. Es lassen sich
so jedoch keine zyklischen Überdeckungen auflösen. Diese bedingen, ein Dreieck in zwei
HEINZ NIXDORF INSTITUT
Fragmente zu teilen.
!"#$!%&'
!"#$%&'#()(*+,-%&./&"
zu traversieren und die Dreiecke so von
012/&#(34%"*5"-*6/471%8#()(
"#$"%&"'()$*(+*$,Die Lösung mit dem BSP besteht darin, den Baum
hinten nach vorne zu zeichnen. Der Vorteil gegenüber dem Painters Algorithmus besteht darin,
weiter Versuch dass
einerman
Lösung
nicht9+,#"(%&:'*012/&#(345';
für jeden Frame alle Dreiecke nach Tiefe sortieren muss. Hat man die Dreiecke
in den BSP einsortiert, weiß man für jeden Standpunkt, was vorne und was hinten ist.
=&,$%&'#%&% -%"einmal
=&,$%&'#%&%*-%"*>?+
>?+@>,54
>,54
Der Baum muss nur einmal im Preprocessing für die gesamte Szene aufgebaut werden.
A&%#%BC%*$/"*3#"(%"*",B3*$/&"%*D%#B3"%"
Es bezeichnet nun die Menge S(v) die Fragmente, die im Knoten des BSP-Baums gespeiE
EA&%#%BC%F*CG""%"*,5B3*H&,24%"(%*'%#"I*
2 zuvor ist Ivp der Standort des Betrachters, sowie T- der linke Teilbaum und T+
chert sind. Wie
-#%*$/4*>?+@>,54*2%(%#1(*J5&-%"
der rechte Teilbaum wie in Abbildung 2.10 dargestellt.
()*
=@
KL* H&,24%"(%I*-#%*#4*6"/(%"*-%'
>?+@>,54'*2%'7%#B3%&(*'#"-
+
KL ?(,"-/&(*-%'*>%(&,B3(%&'
KL*
?(,"-/&( -%' >%(&,B3(%&'
-.,$
KL 1#"C%&*.DJN*&%B3(%&*=%#1.,54
3@
3M
=M
$7
?9$;
Abbildung 2.10: Benennung der Elemente des BSP für den Painter’s Algorithmus.
R/&1%'5"2*S012/&#(34%"*#"*-%&*T/475(%&2&,U#CVI*??*WXXY
O,((3#,'*H#'B3%&
PQ
Der Painter’s Algorithmus ist in Algorithmus 4 aufgeführt.
AlgoCG 09
11
Kapitel 2. Trees
Algorithmus 4 Painter’s Algorithmus auf einem BSP-Baum
1: function PAINTERS(Tree T , ViewPoint vp)
2:
Sei v die Wurzel von T .
3:
if v ist Blattknoten then
4:
zeichne die Fragmente S(v) des Knotens v
5:
else
6:
if vp in h+ then
. 1. Fall
7:
Painters(T-, vp)
8:
Fragmente S(v) des Knotens v zeichnen
9:
Painters(T+, vp)
10:
else
11:
if vp in h- then
. 2. Fall, umgekehrt wie 1. Fall
12:
Painters(T+, vp)
13:
Fragmente S(v) des Knotens v zeichnen
14:
Painters(T-, vp)
15:
else
. 3. Fall
16:
Painters(T-, vp)
17:
Fragmente sind von dieser Seite unsichtbar.
18:
Painters(T+, vp)
19:
end if
20:
end if
21:
end if
22: end function
AlgoCG 09
12
Kapitel 2. Trees
Im ersten Fall liegt T- weiter hinten wie die Splittinggerade/-ebene. Da von hinten nach
vorne gezeichnet wird, wird somit zuerst T-, dann das Element im Knoten und zuletzt T+
gezeichnet. Im zweiten Fall liegt der Standort im T-, d.h. um von hinten nach vorne zu
zeichnen muss Fall 1 invertiert werden. Im 3. Fall ist der Standort weder im h+ noch im hder Splittinggerade, d.h. man befindet sich auf der Splittinggerade bzw. -ebene. Die Punkte
bzw. Dreiecke, die direkt auf der Splittinggerade/-ebene liegen sind somit nicht sichtbar.
2.2.3 Konstruktion - 2D
Im 2D Fall wird der BSP-Baum über eine Menge von Liniensegmenten aufgebaut. Eingabe
ist eine Menge von n Segmenten S = {s1 , . . . , sn }. Die Ausgabe ist ein BSP-Baum für S.
Als Splittinggerade wählen wir in jedem Schritt eine unendlich lange Gerade l(s) durch das
Segment s (Autopartition).
Das Vorgehen beschreibt Algorithmus 5.
Algorithmus 5 Aufbau eines BSP-Baums im 2D
1: function 2 D BSP(Segmente S)
2:
if |S| ≤ 1 then
3:
Erzeuge Baum T , der aus einem Blatt besteht, das S enthält.
HEINZ NIXDORF INSTITUT
4:
return T
!"#$%&'#()(*+,-%&./&"
5:
else
. Nehme erstes Segment s1
012/&#(34%"*5"-*6/471%8#()(
'+,-".,/*'
6:
Benutze l(s1 ) als Splittinggerade
7:
S + := {s ∩ l(s1 )+ |∀s ∈ S}; T + := 2dBSP(S + )
dBSP(S)
8:
S − := {s ∩ l(s1 )− |∀s ∈ S}; T − := 2dBSP(S − )
9:
Erzeuge BSP-Baum T mit Wurzel v, linkem Teilbaum T − und rechtem Teilbaum
2%*%#"%"*:,54*0;*-%&*,5'*%#"%4*:1,((*.%'(%3(;*-,'*1
%"(3)1(
+
T
.
0
10:
Speichere im Knoten v S(v) = {s ∈ S|s ⊂ l(s1 )}
%"5(9%"
%"5(9%"*23+
23+54 ,1'*=%&,-%*954*05>(%#1%"
,1'11:
=%&,-%
954
end if 05>(%#1%"?
12: end function
Abbildung 2.11 illustriert die einzelnen Variablen.
2%*%#"%"*:B+C:,54*0 4#(*6"/(%"*6
%" F%#1.,54 07
%"*F%#1.,54*0
3(%"*F%#1.,54*08
+
G3%&% #4 6"/(%" 6
G3%&%*#4*6"/(%"*6
3C
3H
0
23+4
3+4
M/&1%'5"2*N012/&#(34%"*#"*-%&*O/475(%&2&,>#EP;*BB*QRRS
AlgoCG 09
KL
I,((3#,'*J#'G3%&
Abbildung 2.11: Aufbau
eines 2D BSP-Baums.
13
Kapitel 2. Trees
2.2.3.1 Größe des BSP-Baums
Durch die Nutzung der Autopartition hängt die Größe des Baumes zum einen von der Reihenfolge der Segmentwahl ab und zum anderen von der Anzahl der aufgeteilten Segmente (je
weniger Segmente zerteilt werden, desto kleiner der Baum).
Definition 2.2.1 (Größe eines BSP-Baums)
Die Größe eines BSP-Baums bemisst sich in der Anzahl aller erzeugten Segmente.
Um einen möglichst kleinen Baum zu erzeugen, wäre eine Möglichkeit, in jedem Schritt
ein Segment zu wählen, dass möglichst wenige andere Segmente schneidet. Dieser Greedy
Ansatz kann große Bäume allerdings nicht verhindern und ist zudem rechenaufwändig. Man
wählt deshalb das Segment zufällig aus (zufällig kann gut sein, wenn die Auswahl schwer
fällt). Man kann nun die Eingabeliste S von Segmenten zuerst zufällig zu S 0 permutieren
und dann Algorithmus 5 unverändert auf der permutierten Liste ausführen. Alternativ kann
man den Algorithmus so verändern, dass in jedem Schritt ein zufälliges Element aus der Liste
genommen wird und nicht immer das erste.
Lemma 2.2.1
Die erwartete Anzahl von Fragmenten, die der Algorithmus 2dRandomBSP(S) berechnet, ist
O(n log n).
Beweis 2.2.1
Bei n Fragmenten gibt es n! viele Permutationen.
HEINZ NIXDORFWähle
INSTITUTsi beliebig aber fest. Analysiere
!%&'
!"#$%&'#()(*+,-%&./&"
nun die erwartete Anzahl von Segmenten, die
von si geschnitten werden, wenn l(si ) als Split012/&#(34%"*5"-*6/471%8#()(
"&"'(&)*'+,-".,/*'
tingsegment gewählt wird wie in Abbildung 2.12 dargestellt.
ein festes Segment !
+0
",1:'#%&%"*
",1:'#%&%"
#%*%&<,&(%(%*0"=,31*$/"*>%24%"(%"?*-#%*
%'@3"#((%"*<%&-%"?
<%""*12+/3 ,1'*>71#((#"2'%24%"(*2%<)31(*<#&-
A
Fragen:
+/
9#%*$#%1%*>%24%"(%*1#%2%"*D$/&E*+/
9,""*<#&-*%#"*>%24%"(*+0 ?*-,''*D$/&E*+/ 1#%2(?*
%'@3"#((%"A
12+/3
Abbildung 2.12: Anzahl zerteilter Segmente bei Wahl von si .
1. Wie viele Segmente liegen „vor“ si ?
Wir definieren zunächst die Distanz eines Segmentes sj zu einem Segment si :
K/&1%'5"2*L012/&#(34%"*#"*-%&*M/475(%&2&,N#OP?*>>*FQQR
G,((3#,'*H#'@3%&
IJ
dist(sj ) := Anzahl Segmente, die l(si ) zwischen si und sj schneiden.
Im Beispiel ist dist(sj ) = 2.
AlgoCG 09
14
Kapitel 2. Trees
2. Wann wird ein Segment sj , dass „vor“ si liegt, tatsächlich geschnitten?
Ein Segment s „schützt“ ein anderes Segment sj , wenn es vor dem Element si als Splittingsegment gewählt wurde. Das Segment sj wird dann nicht geschnitten. Abbildung
2.13 gibt ein Beispiel.
Abbildung 2.13: Ein Splittingsegment schützt ein anderes Segment.
In (a) wird s3 nicht von s2 geschützt, da beide zuvor durch s1 geteilt wurden. In (b) wird
s3 durch s1 geschützt, wenn s2 als Splittingsegment gewählt wird.
3. Wie hoch ist die Wahrscheinlichkeit, dass l(si ) das Segment sj schneidet, wenn si als
Splittingelement gewählt wird?
Es wird nur dann geschnitten, wenn kein Element sk , das sj schützen würde, vorher
gewählt wird. Sei nun k := dist(sj ) und seien sj1 , sj2 , . . . , sjk die Segmente zwischen si
und sj . si muss nun als erstes gewählt werden, da sj sonst geschützt würde. Somit hat
es den kleinsten Index in S. Für die Wahrscheinlichkeit folgt damit:
P r(„l(si ) schneidet sj “) ≤
1
dist(sj ) + 2
dist(sj ) ist die Anzahl der Elemente zwischen si und sj , die 2 sind si und sj selbst.
Wenn keine Elemente zwischen si und sj liegen, beträgt die Wahrscheinlichkeit 21 , da si
nur dann schneidet, wenn es vor sj liegt. Mit jedem Element dazwischen verringert sich
die Wahrscheinlichkeit, dass sj geteilt wird, da die Wahrscheinlichkeit, dass sj geschützt
wird, immer größer wird.
Für ein Segment s ergibt sich die erwartete Anzahl von Schnitten, die s erzeugt, wie
folgt:
P
1
E(„Anzahl der Schnitte erzeugt durch s“) ≤
s0 6=s dists (s0 )+2
P
n−2 1
≤ 2 i=0
i+2
≤ 2 ln n
Es wird die Summe über die Wahrscheinlichkeit eines Schnitts für alle Segmente s0 berechnet. Je nachdem welche Position si in der Permutation einnimmt variiert die Anzahl der möglichen Schnitte, die si vornehmen kann, zwischen 0 und n − 2. Man kann
also auch über alle möglichen Distanzen aufsummieren, da jede mögliche Distanz für
jede Richtung höchstens einmal auftauchen kann. Dabei summiert man in beide Richtungen auf, d.h. links und rechts des betrachteten Segments. Dies ist möglich, da hier
AlgoCG 09
15
Kapitel 2. Trees
nur eine Abschätzung nach oben betrachtet wird. Die entstehende Summe ist eine harmonische Reihe, die nach oben näherungsweise mit ln(n) plus einer kleinen Konstanten
abgeschätzt werden kann.
Die Anzahl der Schnitte für n Elemente fügt zu diesem Wert noch einen Faktor n hinzu,
so dass die gesamte Anzahl von möglichen Schnitten 2n ln(n) beträgt. Zusammen mit
den n als Eingabe gegebenen Segmenten ergibt sich eine erwartete Größe von n +
2n ln(n) = O(n log n) Segmenten für den BSP-Baum.
Es ist wichtig zu beachten, dass es sich hierbei nur um einen Erwartungswert handelt, der
über die Wahrscheinlichkeit eines Schnitts gebildet wird. Es kann somit auch BSP Bäume
geben, in denen eine höhere Anzahl von Segmentierungen passiert.
2.2.3.2 Laufzeit des Konstruktionsalgorithmus
Die Laufzeit für die Konstruktion des BSP-Baums hängt von seiner Größe ab. Die Aufteilung
in S + und S − kostet Zeit O(n), da nie mehr als n Fragemente bei der Aufteilung entstehen
können Die Anzahl der rekursiven Aufrufe ist gleich der Anzahl
der erzeugten Fragmente.
HEINZ NIXDORF INSTITUT
!"#$!%&'
!"#$%&'#()(*+,-%&./&"
Somit ergibt sich zusammen mit der zuvor berechneten erwarteten
Größe des BSP-Baums die
012/&#(34%"*5"-*6/471%8#()(
!"#$!%&'()'(*+(,%&' 2
erwartete Laufzeit O(n log n).
9#%*.%&%:3"%"*;#&*%#"%"*<=+><,54*?@&*A&%#%:B%*C+/1D2/"%E*F
2.2.4 Konstruktion - 3D
Die
besteht hier aus Polygonen (Dreiecken). Für ein Dreieck t beschreibt nun h(t)
=%#*-Eingabe
%#"*A&%#%:BG
./-0Ebene
HI*#'(*-#%*J.%"%G*#"*-%&*-,'*A&%#%:B*die
in der das Dreieck liegt wie in1#%2(
Abbildung 2.14 dargestellt.
3K
-
3>
./-0
L-%%H
Abbildung 2.14: Polygone als Splittingebenen im 3D.
M ;#&*"%34%"*",:3%#","-%&*-#%*A&%#%:B%*N54*05?(%#1%"*-%'*OA>P,54%'
MAnalog
Q%-%'*A&%#%:B*-%?#"#%&(*%#"%*=71#((#"2%.%"%*-%'*<=+><,54'
zu den Geraden im 2D werden nun die Ebenen der Polygone zur Aufteilung des
Raums
verwendet. Jedes Dreieck definiert eine Splittingebene,5"-*.1
die den Raum in zwei HalbM -#%*=71#((#"2%.%"%*(%#1(*-%"*<=+><,54*#"*N;%#*\,1.&)54%*.$
räume h+ und h− aufteilt. Der Algorithmus ist damit sehr ähnlich zum 2D Fall wie AlgorithTU
R,((3#,'*S#':3%&
mus 6 zeigt.
Für den Aufbau kann dieselbe Autopartionsvorschrift kombiniert mit Randomisierung verwendet werden, wie im 2D. Die Analyse der Größe eines 3D BSP-Baums ist bislang unbekannt. Für die weiteren Betrachtungen definieren wir zunächst Free-Splits.
V/&1%'5"2*W012/&#(34%"*#"*-%&*X/475(%&2&,?#BYG*==*ZUU[
Definition 2.2.2 (Free-Split)
Ein Dreieck (Liniensegment), das eine Zelle (Region) in zwei nicht zusammenhängende Teile
aufteilt ist ein Free-Split.
AlgoCG 09
16
Kapitel 2. Trees
Algorithmus 6 Aufbau eines BSP-Baums im 3D
1: function 3 D BSP(Segmente S)
2:
if |S| ≤ 1 then
3:
Erzeuge Baum T , der aus einem Blatt besteht, das S enthält.
4:
return T
5:
else
. Nehme erstes Dreieck t1
6:
Benutze h(t1 ) als Splittingebene
7:
S + := {t ∩ h(t1 )+ |∀t ∈ S}; T + := 3dBSP(S + )
8:
S − := {t ∩ h(t1 )− |∀t ∈ S}; T − := 3dBSP(S − )
−NIXDORF INSTITUT
!"#$!%&'
9:
Erzeuge BSP-Baum T mit Wurzel v, linkem TeilbaumHEINZ
T !"#$%&'#()(*+,-%&./&"
und rechtem Teilbaum
+
012/&#(34%"*5"-*6/471%8#()(
T !"#$!%&'()'(*+(,%&'
.
10:
Speichere im Knoten v S(v) = {t ∈ S|t ⊂ h(t1 )}
Definition:
11:
end if -.//$"01)2
12: end function
9#"*:&%#%;<*=>#"#%"'%24%"(?@*-,'*%#"%*A%11%*=B%2#/"?*#"*CD%#*
"#;3(*C5',44%"3)"2%"-%*E%#1%*,5F(%#1(
Abbildung 2.15 zeigt ein Beispiel für 2D und 3D. Ein Free-Split schneidet die Begrenzung
der Region auf allen Seiten. [TODO:Wieso ist das nicht zusammenhängend?]
F
F&%%*'71#((
1#((
K/&1%'5"2*L012/&#(34%"*#"*-%&*M/475(%&2&,F#<N@*OO*PQQR
G,((3#,'*H#';3%&
IJ
Abbildung 2.15: Beispiele für Free-Splits.
Eine Erweiterung des Algorithmus besteht nun darin, dass man immer einen Free-Split
durchführt, wenn dies möglich ist, und ansonsten ein zufälliges Dreieck als Splittingebene
auswählt. Ein weiterer Unterschied ist, dass alle möglichen (sinnvollen) Teilungen ausgeführt
werden, d.h. h(ti ) wird zum Schnitt aller Zellen verwendet, die es schneiden kann. Bislang
wurde immer nur eine Zelle geschnitten. [TODO:Das ist jetzt wirklich nicht mehr zusammenhängend, aber nicht spezifisch für den Free-Split, oder?]
Dieses Vorgehen kann jetzt nicht mehr rekursiv formuliert werden. Algorithmus 7 fasst das
iterative Vorgehen zusammen.
Die Unterschiede in der Arbeitsweise zeigt Abbildung 2.16.
Es lässt sich nun zeigen, dass für den angegebenen Algorithmus unter Verwendung aller
möglichen Free-Splits die erwartete Anzahl von Fragmenten O(n2 ) ist. Eine Analyse ohne
Free-Splits ist unbekannt. Das folgende Lemma zeigt, dass diese Grenze hart ist.
AlgoCG 09
17
Kapitel 2. Trees
Algorithmus 7 Iterativer Aufbau eines BSP-Baums im 3D mit Free-Splits
1: function 3 D R ANDOM F REE S PLIT BSP(Segmente S)
2:
Erzeuge zufällige Permutation S 0 = t1 , . . . , tn
3:
for i := 1 to n do
4:
Verwende h(ti ) zur Teilung aller Zellen, die h(ti ) schneiden (nur sinnvolle Teilungen)
HEINZ NIXDORF INSTITUT
!"#$!%&'
5:
Verwende alle möglichen Free-Splits
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
6:
end!"#$!%&'()'(*+(,%&'
for
7: end function
!"(%&'93#%-1#93%*0&.%#(':%#'%;
&%<5&'#$%& 012/&#(345'
&%<5&'#$%&*012/&#(345'
#(%&,(#$%& 012/&#(345'
#(%&,(#$%&*012/&#(345'
-/
-.
-*
-.
-/
-*
Abbildung 2.16: Unterschiede in der Arbeitsweise zwischen rekursivem und iterativem
Algorithmus.
=,"*<,""*>%#2%";
K#%*%&:,&(%(%*0">,31*$/"*?&,24%"(%"*#'(*DL&*-%"*&,"-/4#'#%&(%"*012/&#(345'*
Lemma 2.2.2
3dRandomFreeSplitBSP(S) 4#(*?&%%MG71#(*012/3
Es gibt Mengen von n sich nicht überschneidenden Dreiecken im 3D-Raum,
für die jede
Auto@@
=,((3#,'*?#'93%&
2
matische Aufteilung (Autopartition) Ω(n ) Fragmente hat.
A/&1%'5"2*B012/&#(34%"*#"*-%&*C/475(%&2&,D#<EF*GG*HIIJ
Beweis 2.2.2
Wir ordnen eine Menge R1 von n1 Rechtecken parallel zur xy-Ebene und eine Menge R2 von
n2 Rechtecken parallel zur yz-Ebene an (für Dreiecke ebenso möglich) wie in Abbildung 2.17
dargestellt.
Sei nun G(n1 , n2 ) die minimale Größe einer automatischen Aufteilung. Der Beweis erfolgt
durch Induktion über n1 + n2 .
Behauptung: G(n1 , n2 ) = (n1 + 1)(n2 + 1) − 1
Anfang: G(1, 0) = 1, G(0, 1) = 1
Schritt: n1 + n2 > 1
O.B.d.A. wählt die automatische Aufteilung ein Rechteck r aus R1 als Splittingebene.
Dies teilt alle Rechtecke aus R2 . Die entstehenden Teilszenen sehen alle so aus, wie
die Ausgangssituation. Sei nun m die Anzahl der Dreiecke von R1 , die oberhalb von r
liegen. Dann gilt:
G(n1 , n2 ) = 1 + G(m, n2 ) + G(n1 − m − 1, n2 )
= 1 + ((m + 1)(n2 + 1) − 1) + ((n1 − m)(n2 + 1) − 1)
= (n1 + 1)(n2 + 1) − 1
AlgoCG 09
18
Kapitel 2. Trees
Abbildung 2.17: Nachweis einer unteren Schranke für die Anzahl von Fragmenten.
Man kann aber auch zeigen, dass für jede Menge von n sich nicht überschneidenden Dreiecken ein BSP der Größe O(n2 ) existiert.
2.3 Quadtrees und Octrees
Quadtrees und Octrees sind Datenstrukturen, um eine räumliche Sortierung und Bereichsanfragen durchzuführen. Sie werden z.B. bei der Finite Elemente Methode, bei der Berechnung
von Meshes und bei der Verdeckungsberechnung eingesetzt.
Quadtrees werden im 2D eingesetzt. Jeder Knoten entspricht einem Quadrat. Ein innerer
Knoten hat vier Kinder, die einer Aufteilung HEINZ
des Quadrats
vier gleichgroße Quadrate entNIXDORFin
INSTITUT
+%&''(
!"#$%&'#()(*+,-%&./&"
sprechen. Die Quadrate sind entsprechend der Himmelsrichtungen mit NW, NE, SW, SE be012/&#(34%"*5"-*6/471%8#()(
"-.%/'-0'- zeichnet. Alle Quadrate auf einer Ebene des Baums
sind gleich groß. Abbildung 2.18 zeigt
ein Beispiel.
;=
/",1
;<
(%"*@/&&%'7/"-#%&(*4#(*
,-&,(
/(%"*3,.%"*$#%&*6#"-%&
,(%*#"*-%&'%1.%"*<.%"%*
*2&/C
C
D=
D<
Abbildung 2.18: Aufbau eines Quadtrees.
Octrees sind eine analoge Datenstruktur im 3D Raum. Dabei wird ein Würfel in acht gleich
große Würfel unterteilt, so dass jeder Knoten 8 Kinder besitzt. Alle Würfel auf einer Ebene
des Baums sind gleich groß. Abbildung 2.19 zeigt ein Beispiel.
/",1
Die Unterteilung kann so lange fortgesetzt werden, bis entweder eine maximale Tiefe erreicht
(%"
(%"*@/&&%'7/"-#%&(*4#(*
@/&&%'7/"-#%&( wurde
4#( oder bis in einer Box maximal c Elemente enthalten sind. Die Elemente selbst
&H%1
/(%"*3,.%"*,E3(*6#"-%&
AlgoCG 09
19
1*#"*-%&'%1.%"*<.%"%*'#"-*
C
M/&1%'5"2*N012/&#(34%"*#"*-%&*O/475(%&2&,H#@PQ*DD*:RRS
I,((3#,'*J#'E3%&
KL
,-&,(%*#"*-%&'%1.%"*<.%"%*
%#E3*2&/C
# 3
C
D=
Kapitel 2. Trees
"'#/",1
6"/(%"
6"/(%"*@/&&%'7/"-#%&(*4#(*
@/&&%'7/"-#%&( 4#(
=G&H%1
6"/(%"*3,.%"*,E3(*6#"-%&
G&H%1*#"*-%&'%1.%"*<.%"%*'#"-*
2&/C
M/&1%'5"2*N012/&#(34%"*#"*-%&*O/475(%&2&,H#@PQ*DD*:RRS
Abbildung 2.19: Aufbau
eines Octrees.
I,((3#,'*J#'E3%&
KL
werden in den Blättern gespeichert, bei Speicherung von Dreiecken je nach Implementierung
auch in inneren Knoten. Die Elemente sind damit in der Box, in der sie enthalten sind, gespeichert.
!"#$%&''()*+%&''(
!"#$%&#'()*+,-)+.'#$#%/#)
HEINZ NIXDORF INSTITUT
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
2.3.1 Speichern von Elementen
Praktikable Lösungsansätze
Die Eingabe ist eine Menge von Punkten bzw. Dreiecken. Im Fall von Punkten wird jeder
9 +/1:2/"*,5;(%#1%"
+/1:2/" ,5;(%#1%"
Punkt in genau einem
Quadrat gespeichert, das ein Blatt des Quadtrees ist. Jedes Blatt enthält
!*+/1:2/","<,31*%&3=3(*'#>3
maximal k Punkte. Durch die exakte Aufteilung enthalten innere Knoten nur die geometri9 +/1:2/"*&%-5"-,"(*'7%#>3%&"
schen Informationen
des Quadrats, aber keine Punkte.
!*?%&@,1(5"2',5;@,"-A*-,*"5&*B8*<%#>3"%"*'#""$/11
Das Speichern von Polygonen (Dreiecken) führt häufig dazu, dass Dreiecke die Begren9 +/1:2/"*#"*-%4*6"/(%"*'7%#>3%&"A*;C&*-%"*'#%*"/>3*"#>3(*5"(%&(%#1(*@%&-%"*
zungslinien bzw. 4C''%"
-flächen schneiden. Es gibt drei Möglichkeiten, damit umzugehen, die in
Abbildung 2.20 dargestellt
sind.
!*?#%1%*+/1:2/"%*1#%2%"*3=3%&*#4*D,54A*,1'*%'*#3&%&*E&=F%*%"('7&#>3(
G,((3#,'*H#'>3%&
Abbildung 2.20: Speicherung von Dreiecken in einem Quadtree.
?/&1%'5"2*K012/&#(34%"*#"*-%&*L/475(%&2&,;#MNA*OO*PQQR
IJ
Die erste Variante besteht darin, dass Polygon entlang der Begrenzungslinien in mehrere
Polygone aufzuteilen. Dadurch erhöht sich allerdings die Anzahl der Polygone. Die zweite
Möglichkeit ist, dass Dreieck in jedem Quadrat zu speichern, in dem es enthalten ist. Diese
Redundanz führt jedoch zu zusätzlichem Aufwand beim Zeichnen, da das Dreieck obwohl
mehrfach gespeichert nur einmal gezeichnet werden soll. Die dritte Möglichkeit besteht darin,
das Polygon in einem Knoten zu speichern, für den es nicht unterteilt werden muss. Damit
können auch innere Knoten Dreiecke enthalten. Es passiert so jedoch häufig, dass Dreiecke
weiter oben im Baum liegen, als dies ihrer Größe entspricht. Eine weitere Möglichkeit sind
die in Abschnitt 2.4 beschriebenen Loose Octrees, bei denen die Ebene nur von der Größe
AlgoCG 09
20
Kapitel 2. Trees
des Elements abhängt. Hier entscheidet der Mittelpunkt des Polygons darüber, in welchem
Knoten ein Objekt liegt.
Quadtrees und Octrees sind insbesondere für dynamische Daten geeignet. Durch die dynamische Unterteilung der Quadrate/Würfel können Polygone beliebig ungünstig positioniert
sein, da die Struktur nur bedingt von der Dichte der Objekte abhängig ist.
2.3.2 Aufbau
Der Aufbau eines Quadtrees beginnt mit einem Quadrat, das alle Punkte enthält (BoundingBox von allen Punkten). Dieses Quadrat wird dann in vier gleich große Teile zerteilt und die
Punkte werden aufgeteilt. Punkte, die auf der Trennlinie liegen, werden im dem linken bzw.
unteren Quadrat zugeordnet. Man unterteilt solange, bis maximal k Punkte enthalten sind oder
eine maximale Tiefe erreicht wurde. Algorithmus 8 stellt die Konstruktion für k = 1 dar. Der
Wert für k ist für die Laufzeit entscheidend und liegt deshalb in praktischen Anwendungen in
der Regel über 1.
Algorithmus 8 Aufbau eines Quadtrees
1: function BUILD Q UADTREE(Punkte P )
2:
σ := [xσ : x0σ ] × [yσ : yσ0 ] ist das oberste Quadrat für Punktemenge P
3:
if |P | ≤ 1 then
4:
Erstelle einen Knoten, der σ und P speichert und gibt diesen zurück.
5:
else
. |P | > 1
6:
Es sind σN E , σN W , σ0SE und σSW die vier0 Quadranten von σ.
σ)
σ)
7:
Es gilt xmid := (xσ +x
und ymid := (yσ +y
2
2
8:
PN E := {p ∈ P |px > xmid ∧ py > ymid }
. Berechnung der Punktemengen
9:
PN W := {p ∈ P |px ≤ xmid ∧ py > ymid }
10:
PSE := {p ∈ P |px > xmid ∧ py ≤ ymid }
11:
PSW := {p ∈ P |px ≤ xmid ∧ py ≤ ymid }
12:
Erstelle Knoten v, in dem σ gespeichert ist, die Kinder des Knotens sind PN E ,
PN W , PSE und PSW .
13:
end if
14: end function
2.3.2.1 Tiefe des Quadtrees
Die Größe und Tiefe eines Quadtrees ist nicht über die Anzahl der Punkte beschränkt, da
immer nur in Einheiten fester Größe aufgeteilt wird. Die Tiefe entspricht der Anzahl der
Aufteilungsschritte. Diese ist wiederum abhängig von der Größe s des äußersten Quadrats
und vom geringsten Abstand c zwischen zwei benachbarten Punkten.
Lemma 2.3.1
Die Tiefe eines Quadtrees für eine Punktemenge P in der Ebene ist höchstens log( sc ) + 32 .
AlgoCG 09
21
Kapitel 2. Trees
Beweis 2.3.1
Die Tiefe eines Quadrates in Tiefe i ist 2si wie in Abbildung 2.21 dargestellt. Die maximale mögliche Entfernung zweier Punkte
√ in einem Quadrat dieser Seitenlänge ist entlang
der Hauptdiagonalen und beträgt somit 2 · 2si .
Abbildung 2.21: Größe von Qudraten in Ebene i in einem Quadtree.
Jedes innere Quadrat umfasst mindestens zwei Punkte, die mindestens c voneinander entfernt sind. Für jedes Quadrat auf Tiefe i gilt damit:
√ s
s
1
2 · i ≥ c ⇒ i ≤ log( ) +
2
c
2
Da die Tiefe des Baums aufgrund der Blätter noch um eins Tiefer ist als die maximale Tiefe
eines inneren Knotens, ergibt sich die Schranke.
2.3.2.2 Größe eines Quadtrees
Die Größe des Quadtree ist abhängig von der Tiefe. Durch eine ungeschickte Anordnung von
Punkten kann der Quadtree sehr unbalanciert sein.
Lemma 2.3.2
Ein Quadtree mit n Punkten und Tiefe d hat
1. O((d + 1)n) Knoten und kann in
2. Zeit O((d + 1)n) aufgebaut werden.
Beweis 2.3.2
1. Jeder innere Knoten hat vier Kinder. Damit erhält man die Anzahl der Blätter als 3 ×
Anzahl innerer Knoten + 11 . Jeder innere Knoten umfasst mindestens einen Punkt (in
seinem Quadrat). Die Knoten auf einer Ebene sind aber alle disjunkt und überdecken
alle Knoten. Daraus folgt direkt, dass die Anzahl der inneren Knoten auf einer Ebene
nicht größer als O(n) sein kann. Da dies für alle Ebenen gilt, folgt dass der Baum
O((d + 1)n) Knoten besitzt.
2. In jedem inneren Knoten werden die Punkte auf die vier Kinder verteilt. Dies benötigt
lineare Zeit in Abhängigkeit von der Anzahl der Punkte in jedem Quadrat. Damit kostet
der Aufbau O((d + 1)n) für alle Level.
1
Für einen Binärbaum mit Tiefe d erhält man entsprechend 2d Blätter und 1 × 2d − 1 innere Knoten.
AlgoCG 09
22
%&''(
-%%
dtree
Kapitel 2. Trees
2.3.3 Suche im Quadtree
HEINZ NIXDORF INSTITUT
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
Gegeben ist ein Knoten v des Quadtrees und gesucht wird sein nördlicher Nachbar
N ordN achbar(v, T ). Die Idee, diesen zu finden, besteht darin, bis zu einem gemeinsamen
Vorgänger von v und N ordN achbar(v, T ) im Baum hochzugehen. Dieses Vorgehen ist in
Abbildung 2.22 dargestellt. Die farbige Umrandung kennzeichnet jeweils den gemeinsamen
Vorfahren. Die Pfeile kennzeichnen den Knoten bzw. den Nachbarn, die auch einheitlich
farblich gekennzeichnet sind.
"
"*6"/(%"*.
6"/(%" . #4*:5,-(&%%*5"-*
#4 :5,-(&%% 5""=&-1#;3%">*?,;3.,&"*
23
/ +/ $0 1 23
/4-+/*#$0*-1.523
&%%*3/;3*.#'*B5*%#"%4*6"/(%"C*-%&*
3 3 .#
#
6 (
/&A,3&%*$/"*. 5"-*
23 #'(
6"/(%"*.
E,((3#,'*F#';3%&
D/&1%'5"2*H012/&#(34%"*#"*-%&*I/475(%&2&,A#JKC*LL*MNNO
GG
Abbildung 2.22: Nordnachbar eines Knotens v.
Der Algorithmus zur Berechnung des N ordN achbar(v, T ) ist in Algorithmus 9 angegeben.
Die verwendeten Variablen sind in Abbildung 2.23 illustriert.
Satz 2.3.1
Der Nachbar eines Knotens v im Quadtree der Tiefe d wird in Zeit O(d + 1) gefunden.
Man läuft solange in der Hierarchie hoch, bis man einen gemeinsamen Vorfahren gefunden
hat. Dabei kann man maximal bis zur Wurzel hochlaufen und auf der Wurzel nochmal rekursiv
aufrufen. Bei einer maximalen Tiefe d ergibt sich somit die Laufzeit.
2.3.4 Balancierte Quadtrees
Eine ungünstige Anordnung der Punkte kann dazu führen, dass in einem Quadtree ein großes
Quadrat sehr viele kleine Nachbarn besitzt, wie dies in Abbildung 2.24 dargestellt ist.
Definition 2.3.1 (Balancierter Quadtree)
Ein Quadtree ist balanciert, wenn sich zwei benachbarte Quadrate in der Seitenlänge höchstens um einen Faktor zwei unterscheiden.
AlgoCG 09
23
&''(
%%
Kapitel 2. Trees
Algorithmus 9 Berechnung der nördlichen Nachbarn eines Knotens
1: function N ORD NACHBAR(Knoten v, Quadtree T )
2:
if v = root(T ) then
3:
return nil
4:
end if
5:
if v = SW-Kind von Eltern(v) then
6:
return NW-Kind von Eltern(v)
7:
end if
8:
if v = SE-Kind von Eltern(v) then
9:
return NE-Kind von Eltern(v)
10:
end if
11:
µ = NordNachbar(Eltern(v, T ))
12:
if µ = nil oder µ ist Blatt then
13:
return µ
14:
else
15:
if v = NW-Kind von Eltern(v) then
16:
return SW-Kind von µ
17:
else
18:
return SE-Kind von µ
19:
end if
20:
end if
HEINZ NIXDORF INSTITUT
21: end function
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
/(%"*. #"*%#"%4*:5,-(&%%*/
%&*6"/(%"*.0 -%''%"*;#%<%*3=>3'(%"'*'/*(#%<*
*'/-,''*!1.02 A/&-A,>3.,&*$/"*!1.2 #'(D*E,11'*
2#.(C*2#.*"#1*,5'
? @*A/&-A,>3.,&
$/"*34,%-51.2
,#+./#&01234
%"*&%(5&"*"#1
$/"*34,%-51.2 (3%"*&%(5&"*AKL6#"-*$/"*34,%-51.2
!1.2
$/"*34,%-51.2 (3%"*&%(5&"*A9L6#"-*$/"*34,%-51.2
$9*-134,%-51.2 /2
$9*-134,%-51.2:&/2
'(*%#"*Q1,((*
"*?
AKL6#"-*$/"*34,%-51.2
AK 6#"- $/" 34,%-51.2
"*&%(5&"*JKL6#"-*$/"*?
*&%(5&"*J9L6#"-*$/"*?
!;<='5+
34,%-51.2
!3<='5+
Abbildung 2.23: Suche des Nordnachbarn zu einem Knoten v.
"/(%"'*. #4*:5,-(&%%*-%&*;#%<%*+ B#&-*#"*[%#(*>1+?@2 2%<5"-%"
1%'5"2*V012/&#(34%"*#"*-%&*W/475(%&2&,<#FXC*JJ*IYYZ
AlgoCG 09
R,((3#,'*E#'>3%&
ST
24
9 B,'*$%&'(%3%"*C#&*5"(%&*%#"%&*D,1,"A%E
9 B#%*C#&-*%#"%*D,1,"A%*=/"'(&5#%&(E*
Kapitel 2. Trees
3,(*$#%1%*=1%#"%*@,A3.,&"
!"#$%&''()*+%&''(
!"#"$%&'()$*
HEINZ NIXDORF INSTITUT
!"#$%&'#()(*+,-%&./&"
Abbildung 2.24: Unbalancierter Quadtree. 012/&#(34%"*5"-*6/471%8#()(
Definition
J/&1%'5"2*K012/&#(34%"*#"*-%&*L/475(%&2&,M#=NO*??*PQQI
Das bedeutet,
die Nachbarn
eines Quadrates sind höchstens eine Ebene im BaumF,((3#,'*G#'A3%&
höher oder
9#" :5,-(&%% #'( +"#"$%&'(, ;%"" '#<3 =;%# .%",<3.,&(% :5,-&,(%
9#"*:5,-(&%%*#'(*+"#"$%&'(,>*;%""*'#<3*=;%#*.%",<3.,&(%*:5,-&,(%*
tiefer. Abbildung
2.25
zeigt
ein
Beispiel.
#"*-%&*?%#(%"1)"2%*3@<3'(%"'*54*%#"%"*A,B(/&*=;%#*5"(%&'<3%#-%"C
G/&1%'5"2*H012/&#(34%"*#"*-%&*I/475(%&2&,J#BK>*??*LFFM
D,((3#,'*A#'<3%&
EF
Abbildung 2.25: Balancierter Quadtree.
Das Vorgehen zum Aufbau eines balancierten Quadtrees besteht darin, zunächst einen unbalancierten Quadtree aufzubauen und dann alle unbalancierten Blätter solange aufzuteilen,
bis der Baum balanciert ist. Die Details zeigt Algorithmus 10.
Die Aufteilung eines Knotens kann dazu führen, dass jetzt auch ein Nachbarn aufgeteilt
werden muss, obwohl dies vor der Aufteilung nicht notwendig gewesen wäre. Zur Überprüfung, ob ein Knoten aufgeteilt werden muss, kann man den Algorithmus N ordN achbar(v, T )
benutzen.
Ein Knoten v hat einen unbalancierten Nordnachbarn, wenn der Nordnachbar von v ein SWoder SE-Kind hat, dass kein Blatt ist. Diese Situation ist in Abbildung 2.26(a) dargestellt.
Nach dem Aufteilen eines Knotens v muss der Nordnachbar von σ(v) dann aufgeteilt werden, wenn der Nordnachbar vor dem Split schon größer ist als σ(v). In diesem Fall liegen
nach dem Split zwei Baumebenen zwischen den Knoten. Dies zeigt Abbildung 2.26(b)
Satz 2.3.2
Sei T ein Quadtree mit m Knoten. Die balancierte Version T ∗ von T hat O(m) Knoten.
AlgoCG 09
25
HI
Kapitel 2. Trees
Algorithmus 10 Balancieren eines Quadtrees
1: function BALANCE Q UADTREE(Knoten v, Quadtree T )
2:
Füge alle Blätter in eine lineare Liste L.
3:
while L ist nicht leer do
4:
Entferne ein Blatt v aus L HEINZ NIXDORF INSTITUT
!"#$%&'#()(*+,-%&./&"
5:
if σ(v) muss aufgeteilt werden then
012/&#(34%"*5"-*6/471%8#()(
6:
Ersetze Blatt v als internen Knoten mit vier Kindern
7:
Falls v einen Punkt enthält, füge ihn in das entsprechende Blatt ein
8:
alle vier Kinder von v in L ein.
att aufgeteilt
werdenFüge
muss?
9:
Prüfe ob σ(v) jetzt Nachbarn enthält, die aufzuteilen sind und füge diese in L
ein.
&#(345'
&#(345'*:5&*;,<3.,&'5<3%*
:5& ;,<3.,&'5<3%
10:
end if
11:
end while
12: end function
-",<3.,&"*:5*%#"%4*6"/(%"*1>*9%""*
"*?@A /-%&*?=A6#"-*3,(>*-,''*B%#"*
!014
HEINZ NIXDORF INSTITUT
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
rden muss?
einem Split
p von , die Nachbarn von
.,&'5<3%
.,&'5<3%*
üssen?
&#(345'*:5&*;,<3.,&'5<3%*
%4*6"/(%"*1>*9%""*
"-*3,(>*-,''*B%#"*
(%"*;/&-",<3.,&"*:5*%#"%4*6"/(%"*1>*
!014
&DE%&*#'(*,1'*!014
(a)
*#"*-%&*L/475(%&2&,M#BN>*??*OPPQ
, die Nachbarn
von
Abbildung
2.26: Unbalancierte
!014
0 4
(b)
F,((3#,'*G#'<3%&
HI
Quadtree Situationen. In (a) ist die Ausgangssituation unbalanciert, in (b) entsteht die unbalancierte Situation durch Aufteilung von
σ(v).
.,&'5<3%*
"*:5*%#"%4*6"/(%"*1>*
AlgoCG 09
!014
0 4
F,((3#,'*G#'<3%&
26
HI
Kapitel 2. Trees
Zum Beweis zeigen wir, dass nur O(m) Aufteilungen notwendig sind, um T zu balancieren.
Daraus folgt dann automatisch die Größe von T . Vorher muss folgendes Lemma gezeigt
werden.
Lemma 2.3.3
Seien v1 , v2 , v3 drei benachbarte Knoten auf gleicher Tiefe, wobei v2 , v3 Blätter in T sind. Für
jede beliebige Unterteilung von σ(v1 ) bewirken die balancierenden Aufteilungen durch den
Algorithmus in σ(v2 ) keine Aufteilung in σ(v3 ).
Das bedeutet, wenn der Nachbar eines Knotens v1 unbalanciert ist, dann wirkt sind die Balancierung des Knotens nur auf den direkten Nachbarn aus, aber nicht transitiv auf Nachbarn
des Nachbarn. Damit lässt sich zeigen, dass Balancierungen nur lokal vorgenommen werden
müssen. Abbildung 2.27 illustriert die Ausgangssituation.
Abbildung 2.27: Balancierung eines Quadtree.
Beweis 2.3.3
Der Beweis des Lemmas erfolgt per Induktion über die Tiefe d des Teilbaums unter v1 .
Anfang: Für d = 1 hat σ(v1 ) eine Unterteilung, σ(v2 ) und σ(v3 ) werden nicht unterteilt.
Schritt: Habe jetzt v1 Tiefe d > 1.
– Nach Voraussetzung verursacht die Balancierung im SW-Quadrat von σ(v2 ) (notwendig wegen kleiner SE-Quadrate in σ(v1 )) keine Aufteilung im SE-Quadrat von
σ(v2 ). Dies zeigt Abbildung 2.28.
– Das gleiche gilt nach Voraussetzung auch für das NE-Quadrat von σ(v2 ) bei einer
Balancierung im NE-Quadrat von σ(v1 ).
– ⇒ NE und SE in σ(v2 ) werden nicht aufgeteilt.
– ⇒ σ(v3 ) braucht nicht aufgeteilt zu werden.
Mit dem Lemma kann nun auch Satz 2.3.2 bewiesen werden.
AlgoCG 09
27
Kapitel 2. Trees
Abbildung 2.28: Auswirkung der Balancierung eines SE-Quadrats.
Abbildung 2.29: Auswirkung der Balancierung eines Quadrats auf benachbarte Knoten.
AlgoCG 09
28
Kapitel 2. Trees
Beweis 2.3.4
Die Unterteilung eines Quadrates σ(v) verursacht in anderen Quadraten σ(v 0 ) gleicher Größe
nur dann eine weitere Aufteilung, wenn v 0 eins der 8 benachbarten Quadrate von v ist. (Beweis
siehe Lemma) Abbildung 2.29 illustriert diesen Zusammenhang.
Die alten Quadrate seien die Quadrate von T . Die neuen Quadrate die zusätzlichen Quadrate von T ∗ . Betrachte nun den Split eines Quadrates σ:
• Der Split kostet 4 neue Knoten (die Kinder von σ).
• Eines der umgebenden Quadrate muss ein altes Quadrat σ ∗ sein, das den Split verursacht hat.
• Die Kosten des Splits (4) werden dem alten Quadrat σ ∗ zugewiesen.
⇒ Ein Quadrat kann nur maximal 8-mal (von jedem seiner 8 Nachbarn) Kosten zugewiesen bekommen. Damit ist die Steigerung der Knotenanzahl linear und die Größe des
balancierten Quadtrees folgt.
2.3.4.1 Laufzeit
Zuletzt soll noch die Laufzeit für die Balancierung berechnet werden.
Lemma 2.3.4
Sei T ein Quadtree mit m Knoten. Die balancierte Version kann in Zeit O((d + 1)m) konstruiert werden.
Beweis 2.3.5
Es wird nur eine konstante Anzahl von Nachbarschaftssuchen durchgeführt, weil ein Knoten
nur eine Konstante Anzahl von Nachbarn besitzt. Ein Blatt der Liste L kann damit in Zeit
O(d + 1) behandelt werden. Da es maximal O(m) Knoten gibt, beträgt die Laufzeit O((d +
1)m).
2.4 Loose Octrees
Quadtrees und Octrees führen eine vollständige Partitionierung des Raumes durch, die keine
Redundanz enthält und die Lage der Objekte nicht berücksichtigt. Der Nachteil der Vorgehensweise ist, dass nur Punkte eindeutig einsortiert werden können. Objekte, die eine Ausdehnung besitzen wie z.B. Dreiecke, müssen gesondert behandelt werden (siehe auch Abschnitt 2.3.1). Bevorzugt wird in der Regel die Variante, bei der ein Objekt in die tiefstgelegene Bounding-Box einsortiert wird, in die es vollständig hineinpasst. Falls aber ein sehr
kleines Objekt genau auf der Splittinggerade oder -ebene von zwei großen Boxen liegt, wie
in Abbildung 2.30 dargestellt, dann wird es sehr weit oben im Baum einsortiert. Man spricht
hierbei von sog. „Sticky Planes“. Dies kann durch Loose Octrees vermieden werden. Im folgenden werden alle Abbildungen im 2D gezeigt, da das Verfahren für Loose Quadtrees auf
die gleiche Weise funktioniert.
AlgoCG 09
29
HEINZ NIXDORF INSTITUT
$$
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
(+,-."."/#"'-'#("0(12.-''
Kapitel 2. Trees
"*$/"*9.:%;(%"*-5&<3*%#"%"*9<(&%%
2*-%'*?,54%'*%&>/12(
2 -%' ?,54%' %&>/12(
-5"-,"A%"
-#2
&C<;'#<3(#25"2*,5>*-#%*D,2%*-%&*9.:%;(%
&*9.:%;(%*%#"G
Abbildung 2.30: Objekte, die Splittinggeraden schneiden, liegen in großer Bounding-Box.
Ein Knoten eines Octrees enthält immer den Mittelpunkt der Bounding-Box, Referenzen
auf alle 8 Kinder, sowie einen Vektor mit allen enthaltenen Objekten. Für das Einfügen eines
;(%*1,''%"*'#<3*%#">,<3*5"-*%#"-%5(#2*%#"'/&(#%&%"
Objektes wird zunächst eine Klassifikation durchgeführt, die in Algorithmus 11 dargestellt ist.
;(%*4#(*05'-%3"5"2*'#"-*A5')(A1#<3%*DH'5"2%"*2%>&,2(
2
2 2
2
Algorithmus 11 Klassifikation eines Knotens beim Einfügen in einen Octree
1: function C LASSIFY(Plane p, Volume v)
Lösung
2:
if v ist vollständig hinter p then
3:
return 0;
9.:%;(*'/*(#%>*F#%*4H21#<3*%#"*
4:
else if v ist vollständig vor p then
KL
I,((3#,'*J#'<3%&
M/&1%'5"2*N012/&#(34%"*#"*-%&*O/475(%&2&,>#;PQ*RR*LSSK
5:
return 1;
6:
else
. v wird von p durchtrennt
7:
return 2;
8:
end if
9: end function
Die Funktion zum Einfügen eines Objektes prüft nun das Bounding Volume des Objektes
gegen Ebenen durch den Mittelpunkt der Octree-Box, die parallel zur x-Achse, zur y-Achse
und zur z-Achse liegen. Falls das Objekt eine der Ebenen schneidet, wird es im Knoten
gespeichert. Falls nicht, passt es in einen Kindknoten.
2.4.1 Konstruktion
Das Ziel der Loose Octree Konstruktion ist es, dass kleine Objekte nicht mehr auf den StickyPlanes großer Boxen liegen bleiben, sondern tiefer durchfallen. Dies wird durch eine Vergrößerung der Bounding-Boxen erreicht. In einem herkömmlichen Octree gilt für die Größe der
Boxen und die Abstände der Mittelpunkte (in x, y, z Richtung):
L(d) =
W
2d
S(d) =
W
2d
Dabei beschreibt W die Größe der äußersten, alles umschließenden Box, sowie d die Tiefe
des Octree. Das bedeutet, die Seitenlängen der Boxen und die Abstände der Mittelpunkte sind
gleich groß wie in Abbildung 2.31 dargestellt.
In einem Loose-Octree wird die Kantenlänge der Bounding-Box um einen Faktor k vergrößert, ohne jedoch den Abstand zwischen den Boxen anzupassen. Dies führt dazu, dass sich
die Boxen überlappen wie in Abbildung 2.32 dargestellt.
AlgoCG 09
30
HEINZ NIXDORF INSTITUT
"#$%&'()$$
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
#$%&'(%)"#
Kapitel 2. Trees
HEINZ NIXDORF INSTITUT
*3%&:;441#<3%"*=<(&%%*2#1(>
!""#$%&'()$$
!"#$%&'(%)"#
antenlänge
der Octree-Box
Octree Box
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
),-,./0/1/2/3%),-,
Loose Octrees
?
9%&2&:;%&% -%" $/" -%" 6"/(%" .%1%2(%" <,54 #" ,11%"
9%&2&:;%&%*-%"*$/"*-%"*6"/(%"*.%1%2(%"*<,54*#"*,11%"
bstände =#4%"'#/"%"
der Boundingboxen
*8ABACDE#<3(5"2F
%),-,./0/1/2/3
> %),-,
?#&*$%&)"-%&"*-#%*6,"(%"1)"2%*-%&*@A(&%%BC/8%"
*+%),-,./0/(/1/2/3/4%),-,
( DE*%#"*F,G(/&*H*I
HEINZ NIXDORF INSTITUT
$$
-, >H*I#%J%*-%'*=<(&%%
!"#$%&'#()(*+,-%&./&"
G
012/&#(34%"*5"-*6/471%8#()(
Abbildung 2.31: Größe der Bounding-Box
>H*G)"2%*-%&*K/5"-#"2DK/8A*-#%*-#%*$#&(5%11%*?C%"%*54'<31#%L(
> ?#&*1,''%"*-#%*0.'()"-%*21%#A3
%),-,
es
5+%),-,./0/2/3/4
+
.
und Abstand der Mittelpunkte.
%"
%"*$/"*-%"*6"/(%"*.%1%2(%"*<,54*#"*,11%"
$/" -%" 6"/(%" .%1%2(%" <,54 #" ,11%"
> ?#&*1,''%"*J5K*-,''*'#A3*-#%*L//'%BC/5"-#"2./8%"*
-%& 6#"-%& M.%&1,77%"
-%&*6#"-%&*M.%&1,77%"
"-%&"*-#%*6,"(%"1)"2%*-%&*@A(&%%BC/8%"
/(/1/2/3/4%),-, Q/&1%'5"2*R012/&#(34%"*#"*-%&*S/475(%&2&,J#:TA*??*UVVO
F,G(/&*H*I
%"*-#%*0.'()"-%*21%#A3
0/2/3/4%),-,
M,((3#,'*N#'<3%&
9/&1%'5"2*Q012/&#(34%"*#"*-%&*R/475(%&2&,S#GTK*UU*VWWO
Abbildung
%"*J5K*-,''*'#A3*-#%*L//'%BC/5"-#"2./8%"*
%&
%&*M.%&1,77%"
M.%&1,77%"
(a)
OP
(b)
N,((3#,'*F#'A3%&
OP
2.32: Vergrößerte Bounding-Boxen im Loose Octree
Für die Kantenlänge und den Abstand der Mittelpunkte gilt damit:
L(d) = k ·
9/&1%'5"2*Q012/&#(34%"*#"*-%&*R/475(%&2&,S#GTK*UU*VWWO
N,((3#,'*F#'A3%&
W
2dOP
S(d) =
W
2d
Falls ein Objekt im Überlappungsbereich zweier Boxen liegt, entscheidet die Lage des Objektmittelpunktes bezogen auf die ursprünglichen Octree Boxen über die Einordnung. Das
Objekt wird in die Box einsortiert, in der ihr Mittelpunkt liegt. Durch die Redundanz wären
theoretisch auch andere Lösungen denkbar.
Über den Faktor k wird die Größe der Überlappung gesteuert. In der Literatur wird ein Faktor k = 2 als guter Kompromiss beschrieben. Er sorgt dafür, dass kleine Objekte tiefer im Octree durchfallen. Über die tatsächliche Tiefe entscheidet nun die Größe des Objektes und nicht
seine Position bezüglich der Splittingebenen. Abbildung 2.33 zeigt die Überlappungsbereich
ist grau für zwei verschiedene k-Werte.
Lemma 2.4.1
Ein Objekt mit Radius (k−1)· L4 fällt mindestens bis auf Tiefe d, wobei L =
der Octree Bounding-Box ist.
W
2d
die Kantenlänge
Beweis 2.4.1
Die Objekte bleiben nur im grau schraffierten Bereich liegen. Liegt das Objekt komplett im
weißen Bereich, wird es noch eine Ebene tiefer einsortiert. Die Größe des grau schraffierten
AlgoCG 09
31
(
123
%%/)0
E#"*<.=%:(*4#(*F,-#5'*41+56&7&(&8&9 ;)11(*4#"-%'(%"'*.#'*
HEINZ NIXDORF INSTITUT
,5;*@#%;%*'?*>/.%#*(&:&;&8&3' -#%*6,"(%"1)"2%*-%&*
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
<G(&%%HI/5"-#"2./8
<G(&%%
I/5"-#"2./8*#'(
#'(
Kapitel 2. Trees
3"
I%>%#'J
%:(*>%&-%"?*54*,5;*%#"%4*
K <.=%:(%*.1%#.%"*"5&*#4*2&,5*'G3&,;;#%&(%"*I%&%#G3*
=
2
%2%"*B5*.1%#.%"CD
2
1#%2%"
(
123
K 3"&:&174(836&< 4(836&:&41+567&4(836
" : 41 567(89
"&:&41+56
(89
'*41+56&7&(&8&9 ;)11(*4#"-%'(%"'*.#'*
&;&8&3' -#%*6,"(%"1)"2%*-%&*
3"
#'(
1:3
(a)
(b)
"5&*#4*2&,5*'G3&,;;#%&(%"*I%&%#G3*
2
Q/&1%'5"2*R012/&#(34%"*#"*-%&*S/475(%&2&,;#:T?*UU*POOV
L,((3#,'*M#'G3%&
NOP
Abbildung 2.33: Überlappungsbereiche in Abhängigkeit des Parameters k.
36&:&41+567&4(836
Bereichs ist:
1:3
2r = k · L2 − L2 = (k − 1) ·
⇒ r = (k − 1) · L4
L
2
Der grau schraffierte Bereich entspricht dem Überstand der Bounding-Box. Eine original
L
Bounding-Box hat Größe L,((3#,'*M#'G3%&
. MultipliziertNOPman mit k erhält man die neue Größe, subtrahiert
2
L
man dann 2 erhält man nur den Überstand.
Wählt man k < 2 fallen nur ganz kleine Objekte in die nächste Ebene. Für k = 2 passen
alle Objekte, deren Kantenlänge gleich der original Octree Bounding-Box ist, in den entspreHEINZ NIXDORF INSTITUT
""#$%&'()$$ chenden Knoten. Für k > 2 werden die Überlappungen
zu groß.
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
"#$%&'%"&())*%+,-."%%/)0
Ein Nachteil des Loose Octrees ist, dass der Raum, den die Elternknoten inklusive ihrer
vergrößerten Bounding-Box aufspannen, nicht mehr vollständig von den Kindern abgedeckt
Verlust der vollständigen
wird. DieAufteilung
ist in Abbildung 2.34 dargestellt.
2/&#(34%"*#"*-%&*S/475(%&2&,;#:T?*UU*POOV
9 :%&
:%&*2%',4(%*;,54*-%'*<1(%&"="/(%"*
2%',4(% ;,54 -%' <1(%&"="/(%"
123.%"4 >#&-*"#?3(*4%3&*-5&?3*-#%*
@544%*,11%&*6#"-%&*1564'%" ,.2%-%?=(
AB
A<1(%&"
A6#"-%&
A
C,'*4,?3%"*>#&*4#(*D.E%=(%"*,F*-#%*"#?3(*
2&GH%& '#"- ,1' -#% D?(&%%IA/5"-#"2./8
2&GH%&*'#"-*,1'*-#%*D?(&%%
A/5"-#"2./8*1
1
-%&*6#"-%&*1564'%" F*-#%*"#?3(*#"*-%4*
,.2%-%?=(%"*A%&%#?3*1#%2%"J
9 :#
:#%'%*K#"-%"*#"*-%"*6#"-%&"*-%&*
K# - # - 6# L%'?3>#'(%&*-%&*<1(%&"*+1,(M*
NO/5'#"P%Q
D
Abbildung 2.34: Kinder decken den Raum der Eltern nicht mehr vollständig ab.
TUV
B ist die Bounding-Box des Kindes, währendR,((3#,'*S#'?3%&
BL die Bounding-Box
des Elternknotens ist.
BKinder und BEltern bezeichnen jeweils die vergrößerten Bounding-Boxen. Es kann nun Objekte O geben, die innerhalb der Bounding-Box des Elternknotens liegen und von der Größe
her in einen Kindknoten hineinpassen, aber nicht vollständig innerhalb der von den Kindern
W/&1%'5"2*X012/&#(34%"*#"*-%&*O/475(%&2&,K#=YF*@@*ZUU[
AlgoCG 09
32
Kapitel 2. Trees
abgedeckten Fläche liegen. Diese Knoten werden dann in einem Kind eines Geschwisterknotens des Elternknotens gespeichert (Cousin/e). Im Beispiel ist dies ein Kind des linken
Geschwisters von BL.
2.4.1.1 Direkte Platzierung
Die Vergrößerung der Bounding-Boxen um den Faktor k = 2 kann man eine direkte Platzierung der Objekte in Zeit O(1) im Loose Octree durchführen. Eine Traversierung des Baums
ist nicht mehr notwendig.
Wie zuvor gezeigt passen alle Objekte mit einem Radius von weniger 14 der Seitenlänge
(Durchmesser halbe Seitenlänge) der originalen Bounding-Box in den entsprechenden LooseOctree-Knoten. Dies ist unabhängig von der Position, da die Bounding-Box durch den Faktor
k = 2 in alle Richtungen um ein Viertel der orginalen Seitenlänge vergrößert wurde. Ein
Knoten mit Radius von weniger als 18 der Ausgangsbox sollte eine Ebene tiefer gespeichert
werden.
Sei nun Rmax (d) der maximale Objektradius, der in Tiefe d gespeichert werden kann. Es
wird nun von unten nach oben die erste Ebene gesucht, die ein Objekt mit Radius R aufnehmen
kann. Diese Ebene habe Tiefe d(R).
. Damit ergibt sich
Die Kantenlänge einer Box in Tiefe d ist L(d) = 2 · W
2d
1
1W
Rmax (d) = L(d) =
4
2 2d
Damit ein Objekt in eine Ebene passt, muss sein Radius kleiner als der maximal mögliche
Radius sein. Damit ergibt sich:
R ≤ Rmax (d(R))
≤ 12 W
2d
d(R) ≤ log( W
)−1
R
Die direkte Platzierung speichert einen Knoten jedoch nicht immer auf der tiefst möglichen
Ebene. Dies liegt daran, dass abhängig von seiner Position auch ein Knoten mit Durchmesser
L(d) in einer Box gespeichert werden könnte. Dieser wird jedoch höher im Baum abgelegt.
Eine Optimierung ist daher, über die Berechnungsformel die passende Ebene auszurechnen
und dann die Kinder abzutesten, ob diese das Objekt aufnehmen können. Falls ja, wird das
Objekt in den Kindknoten geschoben, sonst bleibt es auf der berechneten Ebene.
2.4.2 Nutzen
Das Frustum Culling funktioniert mit Loose Octrees genauso wie mit normalen Octrees. Dazu
wird der Baum von der Wurzel aus traversiert. Falls ein Knoten nicht sichtbar ist, wird die
Traversierung direkt abgebrochen, ohne die Kinder zu berücksichtigen. Ansonsten werden
die Objekte des Knoten ausgegeben und die Kinder werden betrachtet (bei vollständiger oder
teilweiser Sichtbarkeit).
AlgoCG 09
33
Kapitel 2. Trees
Messungen haben gezeigt, dass durch die Verwendung von Loose Octrees und die damit
verbundene tiefere Einsortierung von kleinen Objekten bei einer Sichtbarkeitsanalyse weniger „möglich sichtbare“ Objekte zurückgegeben werden. Der Nachteil ist, dass durch die vergrößerten Bounding-Boxen mehr Knoten untersucht werden müssen.
AlgoCG 09
34
3 Visibility Culling
HEINZ NIXDORF INSTITUT
Walkthrough-Problem - Echtzeit-Rendering
!"#$%&'#()(*+,-%&./&"
In einer
Szene
sind
nicht
immer
alle
Teile
eines
Objektes
sichtbar.
Man
muss aber jedes
012/&#(34%"*5"-*6/471%8#()(
Visibility Culling
Objekt einmal anfassen und prüfen, ob es sichtbar ist. Der zeitliche Aufwand hängt damit von
allen Objekten ab und nicht nur von den sichtbaren. Dies ist ineffizient. Deshalb möchte man
Lösungsansatz
nicht sichtbare Objekte oder nicht sichtbare Teile von Objekten nicht explizit rendern. Eine
9#& .%&%:3"%"
9#&*.%&%:3"%"*,11%*/-%&*,5:3*"5&*%#"#2%*5"'#:3(.,&%*+/1;2/"%
,11% /-%&
,5:3 "5&
%#"#2%
5"'#:3(.,&%
Übersicht
über mögliche
Verfahren
zeigt
Abbildung
3.1. +/1;2/"%
/.<%:(
7/1;2/"
Frustum Culling
/.<%:(
Backface Culling
Occlusion Culling
Abbildung 3.1: Übersicht über verschiedene Culling Techniken.
= Frustum Culling
>.<%?(%*/-%&*+/1;2/"%*,5@%&3,1.*-%'*A#:3(?%2%1'*B%&-%"*"#:3(*2%C%#:3"%(
Der Sichtkegel des Benutzers wird Frustum genannt. Alles was außerhalb dieses Kegels
= nicht
Backface
Culling
liegt ist
sichtbar
und muss nicht betrachtet werden. Diese Funktion ist in jedem einfa+/1;2/"%D*-#%*$/"*3#"(%"*C5*'%3%"*'#"-D*B%&-%"*"#:3(*2%C%#:3"%(
chen Renderer implementiert und wird auch Clipping genannt. Von einem Polygon können
Occlusion
Culling
einige= Flächen
nur von
hinten betrachtet werden (backfaces). Diese sind dann nicht sichtbar
>.<%?(%D*-#%*#4*A#:3(?%2%1*3#"(%&*,"-%&%"*+/1;2/"%"*$%&-%:?(*1#%2%"D*B%&-%"*
und werden
nicht gezeichnet. Diese Funktion wird typischerweise von der Grafiklibrary oder
Hardware"#:3(*2%C%#:3"%(
unterstützt.Die schwierigste Technik ist das Occlusion Culling. Dabei werden PoGH
E,((3#,'*F#':3%&
I/&1%'5"2*J012/&#(34%"*#"*-%&*K/475(%&2&,L#?MD*AA*NOOP
lygone berechnet, die von anderen Polygonen verdeckt werden. Diese Technik befindet sich
noch in der Erforschung. Man bezeichnet die Techniken des Backface Culling und des Occlusion Culling auch als Hidden Surface Removal, da hier nicht sichtbare Oberflächen entfernt
werden.
Eine Berechnung der Sichtbarkeit für jedes Polygon ist zu aufwändig. Dies kann von der
Rendering Pipeline mit dem Z-Buffer-Algorithmus schneller durchgeführt werden. Der Grund
für den Einsatz von Occlusion Culling ist Effizienz, d.h. man möchte noch schneller sein als
der Z-Buffer. Man benutzt deshalb Datenstrukturen wie die in Kapitel 2 vorgestellten Octrees,
BSP-Trees oder kd-Bäume, die einen schnellen Zugriff auf Teile der Szene erlauben. Sie
erlauben es, schnell große Mengen von Objekten als nicht sichtbar zu klassifizieren.
Ein wichtiges Maß für dafür, ob sich ein Culling lohnt ist die Tiefenkomplexität. Die Tiefenkomplexität beschreibt die Anzahl der verdeckten Dreiecke, die hinter einem sichtbaren
Dreieck liegen. Sie ist standpunktabhängig und fällt für unterschiedliche Szenen unterschiedlich hoch aus. Für eine Wiese ist sie sehr gering, in einer Stadtszene abhängig vom Standpunkt
hoch (vgl. Abbildung 3.2).
35
Kapitel 3. Visibility Culling
Abbildung 3.2: Abhängigkeit der Tiefenkomplexität vom Standpunkt.
AlgoCG 09
36
ility Culling
dbegriffe
Kapitel 3. Visibility Culling
Probleme für das Culling entstehen, wenn nur wenige unsichtbare Dreiecke existieren. In
diesem Fall ist der Aufwand für die Berechnung der unsichtbaren Dreiecke höher als die tatsächliche Einsparung. Falls die Anzahl der unsichtbaren Dreiecke stark schwankt, z.B. die
Kamera fährt dicht hinter einem Pfahl entlang, entstehen ebenfalls Probleme. Der Algorithmus kann dann unter Umständen nicht alle Dreiecke in akzeptabler Zeit klassifizieren. Man
muss somit einen Trade-off zwischen Culling-Test und Renderingzeit finden:
• Eine Szene hat n0 Dreiecke, davon werden n durch den Cullingalgorithmus in Zeit tc (n)
als unsichtbar klassifiziert.
• Das Rendering von n Dreiecken kostet Zeit tr (n), für die restlichen n0 − n Dreiecke
kostet tr (n0 − n).
• Man erhält die Gesamtlaufzeit tges (n) = tr (n0 − n) + tc (n)
Falls tc (n) ≥ tr (n) gilt, dann lohnt sich das Culling offensichtlich nicht, d.h. die auf der
HEINZ
NIXDORF
INSTITUT
CPU durchgeführte
Berechnung der unsichtbaren Polygone darf nicht
länger
dauern
als ihre
Visibility Culling
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
„Darstellung“
durch die Rendering Pipeline.
Grundbegriffe
9%#*O -#%*:%"2%*-%&*;.<%=(%>+&#4#(#$%*#"*-%&*$#&(5%11%"*9?%"%*
@A&*%#"%"*2%2%.%"%"*9(,"-75"=(*'%#B
3.1 Potentially
Visible Sets
HEINZ NIXDORF INSTITUT
!"#$%&'#()(*+,-%&./&"
C S -#%*:%"2%*-%&*'#D3(.,&%"*E%#1%F012/&#(34%"*5"-*6/471%8#()(
Ein Potentially Visible Set (PVS) enthält die Objekte, die wahrscheinlich sichtbar sind. Dies
C keine
U -#%*:%"2%*-%&*5"'#D3(.,&%"*E%#1%G
9
ist jedoch
exakte Sichtbarkeitslösung. Man berechnet schnell!eine konservative
Über-#%*:%"2%*-%&*;.<%=(%>+&#4#(#$%*#"*-%&*$#&(5%11%"*9?%"%*
schätzung der sichtbaren Primitive, das PVS. Die exakte Sichtbarkeit wird durch die Anwen"%"*2%2%.%"%"*9(,"-75"=(*'%#B
HEINZ NIXDORF INSTITUT
dung des
Z-Buffer
Algorithmus auf dem PVS in der Rendering-Pipeline berechnet.
:,"*5"(%&'D3%#-%(*:%(3/-%"*",D3*-%&*0&(F
!"#$%&'#()(*+,-%&./&"
S -#%*:%"2%*-%&*'#D3(.,&%"*E%#1%F
012/&#(34%"*5"-*6/471%8#()(
ManI#%*'#%*-,'*9#D3(.,&=%#('7&/.1%4*1H'%"B
kann
drei
Arten
für eine Menge O von Objekten einer
# # - 9# 3(.von
= #(Sichtbarkeitsberechnungen
.1
1H
U -#%*:%"2%*-%&*5"'#D3(.,&%"*E%#1%G
virtuellenC Szene
durchführen. Für einen!gegebenen
und U
9
9 Standpunkt sind!S die sichtbaren
$%*#"*-%&*$#&(5%11%"*9?%"%*
!"#$%&'()(*(+(%,
die unsichtbaren
Objekte.
Die verschiedenen Ansätze sind in Abbildung 3.3 dargestellt.
-#%*:%"2%*S
2
I#&-*.%&%D3"%(G
#B
5"(%&'D3%#-%(*:%(3/-%"*",D3*-%&*0&(F
C -./)012#%(20&'()(*(+(%,
%F
%*-,'*9#D3(.,&=%#('7&/.1%4*1H'%"B
- 9# 3(. = #(
.1
1H-#%*:%"2%*S 715'*%(I,'*,5'*U I#&-*.%&%D3"%(F
%#1%G
J-%& E%#1 ,5'
J-%&*E%#1*,5'*U
'/11 4H21#D3'( =1%#" '%#"K 9
9 U '/11*4H21#D3'(*=1%#"*'%#"K*
9
!
!
!
!"#$%&'()(*(+(%,
#%*:%"2%*S
2
I#&-*.%&%D3"%(G
C 3441."(5#%(20&'()(*(+(%,
%#"*E%#1*$/"*S 715'*%(I,'*,5'*U I#&-*.%&%D3"%(
%&*0&(F
-./)012#%(20&'()(*(+(%,
(a)
(c)
J-%&*E%#1*,5'*S
'/11*4H21#D3'(*2&/UF* (b)
%"B
#%*:%"2%*S 715'*%(I,'*,5'*U I#&-*.%&%D3"%(F
-%&*E%#1*,5'*U '/11*4H21#D3'(*=1%#"*'%#"K*
-%&*E%#1*,5'*U
-%& E%#1 ,5' U '/11*4H21#D3'(*=1%#"*'%#"K*
'/11 4H21#D3'( =1%#" '%#"K 9
9
!
:,((3#,'*@#'D3%&
Abbildung !
3.3: (a) zeigt
einen exact visibility
Test, (b) einen conservative
Test und (c)LMeinen
N/&1%'5"2*O012/&#(34%"*#"*-%&*P/475(%&2&,Q#=RF*99*SMMT
3441."(5#%(20&'()(*(+(%,
approximative Test.
#"*E%#1*$/"*S 715'*%(I,'*,5'*U I#&-*.%&%D3"%(
-%&*E%#1*,5'*S '/11*4H21#D3'(*2&/UF*
I#&-*.%&%D3"%(F
%&*E%#1*,5'*U '/11*4H21#D3'(*=1%#"*'%#"K*
#" '%#"K
#"*'%#"K*
• Exact! Visibility9
LM
:,((3#,'*@#'D3%&
N/&1%'5"2*O012/&#(34%"*#"*-%&*P/475(%&2&,Q#=RF*99*SMMT
I#&-*.%&%D3"%(
/UF*
"*'%#"K*
Berechne nur die sichtbaren Objekte.
• Conservative Visibility
Berechne die sichtbaren und einen (möglichst kleinen) Teil der unsichtbaren Objekte.
:,((3#,'*@#'D3%&
RF*99*SMMT
AlgoCG 09
LM
37
Kapitel 3. Visibility Culling
• Approximative Visibility
Berechne einen (möglichst großen) Teil der sichtbaren und einen (möglichst kleinen)
Teil der unsichtbaren Objekte.
3.2 Occlusion Culling mit Potentially Visible Sets
Es soll ein Occlusion Culling durchgeführt werden, so dass beim Walkthrough möglichst wenig Objekte gerendert werden müssen. Dazu sollen die architektonischen Eigenschaften der
Szene ausgenutzt werden. Dazu gehören verdeckende Elemente wie Räume, Flüre, Nischen,
Stockwerke (Wände) und nicht verdeckende Elemente wie Durchgänge, offene Türen, sowie
Fenster. Während Menschen eine natürliche Vorstellung davon haben, was eine Tür ist und
was ein Raum, muss dies für einen PC berechnet werden. Es werden daher zwei strukturelle
Elemente eingeführt.
Definition 3.2.1 (Zelle)
Eine Zelle definiert einen „Raum“, der von Wänden und Portalen
umschlossen
ist. Wände
HEINZ NIXDORF
INSTITUT
Occlusion Culling mit Potentially Visible Sets
!"#$%&'#()(*+,-%&./&"
sind grundsätzlich
undurchsichtig.
012/&#(34%"*5"-*6/471%8#()(
Eigenschaften architektonischer Modelle
Definition 3.2.2
(Portal)
!"#$%#"&"'()*'+"&&",'-,.'/0*12&"
Ein Portal definiert einen durchsichtigen oder offenen Teil eines Raums. Portale verbinden die
9%11%"*5"-*+/&(,1%*%"('7&%:3%"*"#:3(*#44%&*5"'%&%&*;/&'(%115"2*$/"*<)54%"*
einzelnen Räume
miteinander.
5"-*=>&%"?
Eine 3D-Szene
besteht nun aus Zellen und Portalen, die wie in Abbildung 3.4 dargestellt
@#%*%&A%""(*5"-*.%&%:3"%(**4,"*<)54%*5"-*=>&%"*B
nicht immer der menschlichen Vorstellung von einem Raum entsprechen.
EF
Abbildung 3.4: Wände (schwarz) und Portale (rot gestrichelt),C,((3#,'*D#':3%&
die verschiedene
Zellen
definieren.
;/&1%'5"2*G012/&#(34%"*#"*-%&*H/475(%&2&,I#AJK*LL*MNNF
3.2.1 Idee der Methode
Die Sichtbarkeitsberechnung wird in zwei Schritte aufgeteilt.
1. Cell-to-Cell Visibility (C2C-Visibility)
Wird im Preprocessing (vor dem Walkthrough) berechnet und umfasst sichtpunktunabhängige Sichtbarkeitsaussagen. Dazu wird ein Adjazenzgraph berechnet, der benachbarte Zellen verbindet.
AlgoCG 09
38
Kapitel 3. Visibility Culling
2. Eye-to-Cell Visibility (E2C-Visibility)
Wird während des Walkthrough berechnet und umfasst sichtpunktabhängige Sichtbarkeitsaussagen. Dazu wird der Adjazenzgraph traviersiert und die Sichtlinien des Beobachters gegen eine Folge von Portalen geprüft. Dadurch erhält man sichbare Zellen.
Die Zellen sind die Grundelemente des PVS über HEINZ
die NIXDORF
der Adjazenzgraph
berechnet wird.
INSTITUT
Occlusion Culling mit Potentially Visible Sets
Während
des Walkthroughs ist eine Zelle nur dann sichtbar, wenn sie durch eine Folge von
Berechnungsbeispiel
Portalen sichtbar ist, wie in Abbildung 3.5 dargestellt.
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
;/*<#%*0*#'(*,5=3*>*%#"*
?,=3.,&*$/"*9
6,"" 4," #" ,11%
6,""*4,"*#"*,11%*
.%",=3.,&(%"*D)54%*
'%3%"E
:
0
9
B
@
A
C
>
0
B
:
A
9
@
C
>
QB#1-%&R*9,$#-*S5%.L%N*!"#$%&'#(T*/K*I#&2#"#,U
I/&1%'5"2*J012/&#(34%"*#"*-%&*A/475(%&2&,K#LMN*;;*GOOP
F,((3#,'*@#'=3%&
GH
Abbildung 3.5: Sichtbarkeit verschiedener Räume mit einem gegebenen Adjazenzgraphen.
Die Sichtbarkeit einer Zelle reduziert sich auf das Testen von Sichtlinien durch eine Folge
von Portalen. Der Adjazenzgraph enthält für jede Zelle einen Zustand und eine Kante zwischen zwei Knoten, wenn die entsprechenden Räume durch ein Portal verbunden sind. Ausgehend von Raum E, in dem der Betrachter steht, sieht der Betrachter natürlich Raum E, aber
auch alle direkt benachbarten Räume durch die Portale in Raum E. Dies sind die Räume D,
F und G. Die zu diesen Räumen adjazenten Räume werden nur gesehen, wenn eine Sichtverbindung durch Portale besteht. Dies ist für Raum A der Fall, für Raum H kreuzen die
Sichtbarkeitslinien undurchsichtige Wände. H ist somit nicht sichtbar.
3.2.2 Berechnung des Adjazenzgraphen
Es wird eine 2D-Projektion eines Gebäudes oder Stockwerks auf die Grundrisse bestehend
aus Wänden und Portalen durchgeführt. Dabei wird eingeschränkt angenommen, dass alle
Wände senkrecht zueinander stehen. Damit sind alle Liniensegmente achsenparallel. Für
das entstehende 2D-Problem wird ein BSP-Baum zur räumlichen Aufteilung berechnet. Die
Blätter des BSP-Baums stellen räumliche Bereiche dar, die die Zellen bilden. Die Wurzel des
BSP ist die Bounding-Box der Eingabe. Abbildung 3.6 zeigt ein Beispiel für die Berechnung
des Adjazengraphen.
Die Elemente der Szene werden als Splittinggeraden gewählt. Dabei wird zunächst auf
die Existenz von spanning faces geprüft. Diese teilen eine Zelle ohne andere Segmente zu
AlgoCG 09
39
@ >%-%'*91,((*#'(*%#"*6"/(%"*#4*9,54
@ .%",B3.,&(%*6"/(%"*=%&-%"*-,""*$%&.5"-%"C*=%""*%#"*+/&(,1*
HEINZ NIXDORF INSTITUT
%8#'(#%&(
mit Potentially Visible
Sets
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
Kapitel 3. Visibility Culling
%"*;#"#%"'%24%"(%"*%#"%"*<=>
:%&-%"*,1'*B71#((#"22%&,-%"
B71#((#"22%&,-%"@
(a)
*C,E%'D*%8#'(#%&%"G*-,""*:)31%*
C
D # (#
)31
%&%*B%24%"(
Abbildung 3.6:
'7,""#"2 C,E%
'7,""#"2*C,E%
(b)
A%11%"*4#(*0->,?%"?2&,73
Für einen Grundriss zeigt (a) eine spanning face und (b) die Zellen mit dem
FG
D,((3#,'*E#'B3%&
Adjazenzgraphen.
H/&1%'5"2*I012/&#(34%"*#"*-%&*J/475(%&2&,K#<LC*::*GMMN
E%*(%#1(*%#"%*H%11%G*/3"%*,"-%&%*
( #1( # H 11
3
E3"%#-%"*JC&%%*'71#(KL
N
<
schneiden (Free-Split!).
Falls mehrere existieren, wird die mittlere ausgewählt. Ansonsten
<
wird das Segment verwendet, das möglichst wenige andere Segmente schneidet. Falls mehrere
%"(G*-,'*4O21#E3'(*:%"#2*,"-%&%* N
zur Auswahl stehen, wird das mittlere verwendet.
%#-%(P
N Q
N Q Q N Q einer
Q Q NZelle und wird somit zu einem Knoten des AdjazenzJedes Blatt des BSP
entspricht
I,31*:)31%*-,'*4#((1%&%*B%24%"(
graphen. Banachbarte Knoten werden dann verbunden, wenn ein Portal existiert. Dazu muss
es möglich sein, Nachbarn zu
identifizierenTQund die Portale der Szene zu enumerieren.
R,((3#,'*S#'E3%&
Der Algorithmus führt eine Klassifikation der Eingabesegmente durch.
012/&#(34%"*#"*-%&*W/475(%&2&,C#XYG*BB*<NNZ
• disjunkt: Segment hat keinen Schnitt mit der (Wurzel-)Zelle
• spanning: Ein Segment F partitioniert die Zelle in Komponenten, die sich nur an den
Rändern schneiden.
• covering: Ein Segment F liegt auf dem Rand einer Zelle.
• incident: sonst
Falls eine Zelle keine inzidenten Segmente hat und somit leer ist, wird die rekursive Berechnung abgebrochen.
3.2.3 Berechnung der Cell-to-Cell Visibility
Es wird an Hand des Adjazenzgraphen für eine Zelle C eine Berechnung der direkt oder
indirekt von C aus sichtbaren Zellen durchgeführt. Dabei ist der Standpunkt innerhalb von
C egal. Die Berechnung wird über einen Stabtree durchgeführt. Jeder Knoten im Stabtree
entspricht einer von C aus sichtbaren Zelle. Die Knoten werden im Stabtree mit einer Kante
verbunden, wenn sie durch ein Portal direkt benachbart sind und die Sichtlinie durch dieses
Portal verläuft. Ein Beispiel für einen Stabtree zu einer Szene zeigt Abbildung 3.7.
Die Räume F, H und G, sowie die Räume D und A sind über direkte Sichtlinien von E
aus zu sehen. Die konkrete Position des Beobachters in E wird dabei in diesem Schritt nicht
berücksichtigt. Die Räume B und C sind nicht sichtbar.
Die Berechnung des Stabtrees wird nun über eine Tiefensuche im Adjanzenzgraphen durchgeführt. Für jedes gefundene Portal werden die Endpunkte des Portals in einer Menge Lp für
die linken und Rp für die rechten Endpunkte gespeichert. Eine Sichtlinie kann die Folge von
AlgoCG 09
40
HEINZ NIXDORF INSTITUT
Occlusion Culling mit Potentially Visible Sets
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
Cell-to-Cell Visibility - 2
Kapitel 3. Visibility Culling
!"#$%#"&'()*+,*-""
:
:
9
9
;
<
=
HEINZ NIXDORF INSTITUT
Occlusion Culling mit Potentially Visible Sets
Cell-to-Cell Visibility - 3
;
<
!"#$%&'#()(*+,-%&./&"
>012/&#(34%"*5"-*6/471%8#()(
0
!"#"$%&'&()*"#)+,$%-.,&,"&)*'#$%)",&")/0.(")10&)
=#%*@%11%"*?*5"-*>*AB""%"*$/"*A%#"%&*
+/'#(#/"*#"*9*%#"2%'%3%"*C%&-%"
20#-3."&
=
0
?
9 %#"%*:/12%*$/"*+/&(,1%"*%"('(%3(*-5&;3*(&,$%&'#%&%"*
Abbildung 3.7: Stabtree
zu einer Menge von Zellen.
HEINZ NIXDORF INSTITUT
ulling -%'*0-<,=%"=2&,73%"
mit Potentially Visible Sets
!"#$%&'#()(*+,-%&./&"
D,((3#,'*:#'E3%&
H/&1%'5"2*I012/&#(34%"*#"*-%&*>/475(%&2&,J#AKL*MM*NOOP
sibility - 3
FG
012/&#(34%"*5"-*6/471%8#()(
Portalen nur durchstechen, wenn Lp und Rp linear trennbar sind, d.h. es existiert eine Gerade
9 >?&*<%-%'*(&,$%&'#%&(%*+/&(,1*'7%#;3%&"*@#&*-#%*
S
für die gilt
A"-75"B(%*-%'*+/&(,1'*#"*%#"%&*C%"2%*D
7 5"-*E7
)*"#)+,$%-.,&,"&)*'#$%)",&")/0.(")10&)
S · L ≥ 0, ∀L ∈ Lp
S · R ≤ 0, ∀R ∈ Rp
D
HEINZ NIXDORF INSTITUT
Visible
Sets
!"#$%&'#()(*+,-%&./&"
2%*$/"*+/&(,1%"*%"('(%3(*-5&;3*(&,$%&'#%&%"*
A#"%*F#;3(1#"#%*B,""*-#%*:/12%*$/"*+/&(,1%"*"5&*
Ein Beispiel für
eine solche lineare Trennung zeigt Abbildung 3.8. Für eineD Menge von m
012/&#(34%"*5"-*6/471%8#()(
D
=%"=2&,73%"
-5&;3'(%;3%"G*@%""*D
5"-*E
'#"-G*-H3H*%'*mit 2m Randbedingungen,
7
7 linear
Portalen ist dies ein Problem
der trennbar
linearen Programmierung
dass in
E
E
%8#'(#%&(*%#"%*I%&,-%*FG*'/*-,''*2#1(J
Zeit
O(m)
für
eine
Linie
lösbar
ist.
Für
die
Berechnung
des
Stabtree
muss
dieses
Problem
*(&,$%&'#%&(%*+/&(,1*'7%#;3%&"*@#&*-#%*
&")/0.(")10&)also mehrfach gelöst werden.
B(%*-%'*+/&(,1'*#"*%#"%&*C%"2%*D
7 5"-*E7
E
5&;3*(&,$%&'#%&%"*
%*B,""*-#%*:/12%*$/"*+/&(,1%"*"5&*
"G*@%""*D7 5"-*E7 linear trennbar '#"-G*-H3H*%'*
%&"*@#&*-#%*
*I%&,-%*FG*'/*-,''*2#1(J
"2%*D7 5"-*E7
D
(a)
M/&1%'5"2*N012/&#(34%"*#"*-%&*O/475(%&2&,>#BPG*FF*QRRS
D
D
E E
D D
E
(b)
D
D D
E E
E
(c)
C,((3#,'*:#';3%&
KL
,1%"*"5&*
Abbildung 3.8: Für den Grundriss
in (a) zeigtD(b)
D D
D eine existierende lineare Trennung und (c)
ennbar '#"-G*-H3H*%'*
RS
eine
E Ezweite.
E E
E
Das Vorgehen fasst Algorithmus
12 zusammen.
E
Der Algorithmus Stabbing_Line(P ) berechnet,
ob für eine gegebene
Folge von Portalen
KL
C,((3#,'*:#';3%&
M/&1%'5"2*N012/&#(34%"*#"*-%&*O/475(%&2&,>#BPG*FF*QRRS
eine Sichtlinie existiert, die Dalle Portale durchquert. Falls diese existiert, wird versucht, eine
weitere Zelle anzufügen.
D
D
E E
3.2.4 Berechnung der Eye-to-Cell Visibility
E
Mit dem berechneten
Stabtree für dieKL Zelle, in der der Beobachter steht, müssen nur die von
C,((3#,'*:#';3%&
dort aus sichtbaren Zellen gerendert werden. Dies entspricht jedoch einer 360 Grad Sicht
AlgoCG 09
41
Kapitel 3. Visibility Culling
Algorithmus 12 Algorithmus zum Berechnen eines Stabtree
1: function F IND _V ISIBLE _C ELLS(Cell C, Portal-Sequenz P , Visible-Cell-Set V )
2:
V := V + C
3:
for each Nachbar N von C do
4:
for each Portal p, das C und N verbindet do
5:
Orientiere p von C nach N
6:
P0 = P ◦ p
7:
if Stabbing_Line(P 0 ) exists then
8:
Find_Visible_Cells(N , P 0 , V )
9:
end if
10:
end for
11:
end for
12: end function
von allen möglichen Standorten innerhalb der Zelle ausgehend. Dies lässt sich jedoch weiter
optimieren, indem man zusätzlich den Sichtkegel (Frustum) des Beobachters mit in Betracht
zieht.
Es gibt vier Verfahren, um den Standpunkt und den Sichtkegel des Beobachters auszunutzen. Die Verfahren steigen in Effektivität und Komplexität von oben nach unten an. Sei im
Folgenden S der Stabtree und C das Frustum des Beobachters. Wir schneiden nun das Frustum gegen den Stabtree und rendern nur die Zellen, die der Beobachter wirklich sehen kann.
1. Zellentest mit Frustum
Prüfe für jede Zelle den Schnitt mit dem Frustum wie in Abbildung 3.9 (a) dargestellt.
Der Schnitt mit dem Frustum ergibt die Zellen O, G und H, von denen G und H jedoch
unsichtbar sind. Die übrigen Zellen fallen weg. Die Laufzeit dieser Methode ist O(|V |),
wobei V die Menge der Zellen ist.
2. Tiefensuche mit Zellentest
Führe eine Tiefensuche von O in S durch mit der Abbruchbedingung, dass alle traversierten Zellen im Frustum liegen. Ist eine Zelle nicht sichtbar, wird die Suche an dieser Stelle abgebrochen. Das Beispiel in Abbildung 3.9(b) zeigt, dass F, G, H und O zurückgegeben werden, obwohl G und H unsichtbar sind. Die Laufzeit dieser Methode ist
O(|S|), d.h. die Laufzeit ist linear in der Größe des Stabtrees. Diese ist abhängig von
der Anzahl der Pfade, die jedoch größer als die Anzahl der Knoten sein kann.
3. Tiefensuche mit Portaltest
Suche von O aus alle Zellen in S, die über Portale erreichbar sind und im Frustum liegen.
Damit fällt in Abbildung 3.9(c) die Zelle G weg, die Zelle H bleibt jedoch erhalten,
obwohl sie unsichtbar ist. Die Laufzeit dieser Methode ist O(|S|), wobei S wiederum
die Größe des Stabtree ist.
4. Exakte Eye-To-Cell Visibility
Prüfe für die erreichbaren Portalsequenzen, ob eine im Frustum liegende Sichtlinie vom
Beobachter existiert. Damit fällt in 3.9(c) die Zelle H auch weg. Die Laufzeit dieser
AlgoCG 09
42
HEINZ NIXDORF INSTITUT
Occlusion Culling mit Potentially Visible Sets
HEINZ NIXDORF INSTITUT
!"#$%&'#()(*+,-%&./&"
Occlusion
Culling mit Potentially Visible Sets
012/&#(34%"*5"-*6/471%8#()(
Eye-to-Cell Visibility - 3
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
Eye-to-Cell Visibility - 4
9%1:3%*;%11%"*-%'*<(,.(&%%*'#"-*'#:3(.,&=
C
>%&':3#%-%"% ?@21#:3A%#(%"B
>%&':3#%-%"%*?@21#:3A%#(%"B
Kapitel 3. Visibility Culling
!"#$#%&'()#*+",*-./,01,#&,
9
?
'5:3% $/" ; #" < -#% =%11%" -#% >.%& +/&(,1%
E'5:3%*$/"*;*#"*<*-#%*=%11%"@*-#%*>.%&*+/&(,1%*
%&&%#:3.,&*'#"-*5"-*#4*A&5'(54*1#%2%"
F
C
G
D
Methode ist O(|V | · |S|),9 wobei
V Länge der Portalsequenzen beschreibtB (maximal
alle
A
B@*C*D,11%"*#"*EFG*H%(I(*IJ,&*J%2@*
S
Zellen
hintereinander)
undO,.%&*C*.1%#.(*#"*E?G@*/.J/31*5"'#:3(.,&
S Visible
dieQ Anzahl
Stabtree.
HEINZim
NIXDORF
INSTITUT
7&HI%*J%-%*%#"K%1"%*;%11%*4#(*<:3"#((*-%'*F&5'(54
Occlusion
Culling mit Potentially
Sets der Pfade
G
!"#$%&'#()(*+,-%&./&"
Visibility - 4
L" MCN I,11%" OP FP Q R%2 Eye-to-Cell
L"*MCN*I,11%"*OP*FP*Q*R%2
012/&#(34%"*5"-*6/471%8#()(
!"##"$%"&% '(% )*+&%+'
!"##"$%"&%,'(%,)*+&%+'
ially Visible Sets
HEINZ NIXDORF INSTITUT
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
K
2 3,
2603,#*#7#8,.8(#11*4"&"51",7
,
11 4" "51",
G DP*E*.1%#.%"*/.R/31*'#%*5"'#:3(.,&*'#"!"#$#%&'()#*+",*-./,01,#&,
'#:3(.,&=
9
7&>D%*D>&*-#%*%&&%#:3.,&%"*+/&(,1'%M5%"I%"@*/.*
?
T
9 '5:3%*$/"*;*#"*<*-#%*=%11%"@*-#%*>.%&*+/&(,1%*
'5:3% $/" ; #" < -#% =%11%" -#%%#"%*<#:3(1#"#%*$/4*N%(&,:3(%&*%8#'(#%&(
>.%& +/&(,1%
C
%&&%#:3.,&*'#"-*5"-*#4*A&5'(54*1#%2%"
-("."$&+/0",'(%,!"##"$%"&%
C
E
E
9 C*D)11(*#"*E?G*H%(I(*,5:3*J%2
A
F
F
9 D B@*C*D,11%"*#"*EFG*H%(I(*IJ,&*J%2@*
B
D
G IH3&%*U#%I%"'5:3% $/"*S*#"*<*-5&:3
,.%&*C*.1%#.(*#"*E?G@*/.J/31*5"'#:3(.,&
G 4#(*-%&*0..&5:3.%-#"25"2P*-,''*,11%*(&,$%&'#%&(%"*
;
S
S
K
O
O
*<:3"#((*-%'*F&5'(54
;%11%"*#4*F&5'(54*1#%2%"
Q
L
Q
2 3,
2603,#*#7#8,.8(#11*4"&"51",7
,
11 4" "51",
D*5"-*E*I,11%"*#"*MCN*,5:3*R%2P
(a)
(b)
,.%&*DP*E*.1%#.(*#"*MTN*/.R/31*5"'#:3(.,&
:3(.,&*'#"9 7&>D%*D>&*-#%*%&&%#:3.,&%"*+/&(,1'%M5%"I%"@*/.*
?,((3#,'*F#':3%&
>/&1%'5"2*X012/&#(34%"*#"*-%&*Y/475(%&2&,I#AZP*<<*TWW[
%#"%*<#:3(1#"#%*$/4*N%(&,:3(%&*%8#'(#%&(
T
G
<*-5&:3
-,''*,11%*(&,$%&'#%&(%"*
%2P
31*5"'#:3(.,&
2&,I#AZP*<<*TWW[
;
O
C
B
A
K
(c)
VW
L
L
(d)
O
P,((3#,'*A#':3%&
C
3.9: Vier Methoden für die Berechnung
der Eye-to-cell visibility.
9 Abbildung
C*D)11(*#"*E?G*H%(I(*,5:3*J%2
R/&1%'5"2*S012/&#(34%"*#"*-%&*T/475(%&2&,D#UV@*<<*FWWX
B
E
;
OQ
A
F
D
;
K
In praktischen Anwendungen wird man sich wahrscheinlich
L für Variante 2 oder 3 entscheiS
O
Q
den, da hier das
Verhältnis von Laufzeit zu Nutzen am besten ist. Bei sehr komplexer Geometrie in jedem Raum kann sich der zusätzliche Aufwand für die exakte Eye-To-Cell Visibility
Bestimmung jedoch auszahlen.
?,((3#,'*F#':3%&
R/&1%'5"2*S012/&#(34%"*#"*-%&*T/475(%&2&,D#UV@*<<*FWWX
VW
P,((3#,'*A#':3%&
OQ
3.2.5 Objekte in Räumen
Die Einrichtung einer Zelle (z.B. Stühle, Tische, Schränke, etc.) wird zusammen mit der Zelle
gerendert und geht nicht in die Sichtbarkeitsberechnung mit ein.
3.3 Dynamische Berechnung von Potentially Visible
Sets (PVS)
Das Ziel ist eine dynamische, sichtpunktabhängige Berechnung der PVS zur Laufzeit während
des Walkthrough. Dadurch wird es möglich, durchsichtige Bereiche während des Walkthrough
zu verschieben. Für die Berechnung wird zunächst eine räumliche Aufteilung mit einem BSPBaum in Zellen und Portale durchgeführt und anschließend eine sichtpunktabhängige Berechnung der PVS durchgeführt.
Die Idee besteht darin, die Zelle des Betrachters zu rendern und von dort ausgehend nur
doch die Zellen, die durch Portale zu sehen sind. Algorithmus 13 beschreibt das Vorgehen zur
Berechnung der PVS. Abbildung 3.10 zeigt ein Beispiel.
Die rote Cullbox geht vom Standpunkt des Beobachters aus. In dieser Box liegen nur die
Portale zu den Zellen C und F, d.h. D wird nicht gerendert. Der Schnitt der Cullbox mit
den Portalen ergibt die blauen Cullboxen. Innerhalb dieser Boxen liegt nur das Portal zu H,
weshalb die Boxen B und G unsichtbar sind. Der nächste Schnitt des blauen Kegels mit dem
Portal F-H erzeugt die grüne Cullbox.
AlgoCG 09
43
Kapitel 3. Visibility Culling
Algorithmus 13 Algorithmus zur dynamischen PVS Berechnung
1: function DYN PVS
2:
Bestimme die Zelle V des Betrachters
3:
Initialisiere eine 2-dimensionale Boundingbox P in der Größe des Bildschirms.
4:
Rendere die Geometrie der Zelle V , führe dabei Frustum Culling durch, wobei die
Spitze des Frustum vom Betrachter zum Rechteck P geht.
5:
Verfahre rekursiv für alle Nachbarn der Zelle V .
6:
for all Portal der aktuellen Zelle V do
7:
Projiziere das Portal auf den Schirm und bestimme die Boundingbox BB der Projektion.
8:
Bestimme die Schnittmenge von P und BB.
9:
for all Schnittmenge von P und BB. do
10:
if Schnittmenge leer then
11:
Benachbartes Portal unsichtbar
12:
else
13:
Führe Culling der Nachbarzelle mit Frustum durch, das durch die Schnittmenge begrenzt ist.
14:
end if
15:
Falls die Schnittmenge nicht leer war, können die Nachbarn sichtbar sein.
Setze P := Schnittmenge von P und BB und fahre rekursiv in Schritt 3 fort.
16:
end for
17:
end for
18: end function
HEINZ NIXDORF INSTITUT
Dynamische Berechnung von PVS
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
Berechnungsbeispiel - 6
!"#$%#"&
9 - : 11. ; < # = - 3
9"*-%&*:511./8*;?<*#'(*=%-/@3*
-,'*+/&(,1*A5*>*A5*'%3%"B
<
;
>
C
D,&54*E#&-*F%11%*>*2%&%"-%&(
:
D
0
G
Abbildung 3.10: Dynamische Berechnung der PVS.
K/&1%'5"2*L012/&#(34%"*#"*-%&*:/475(%&2&,M#NOP*QQ*RSSJ
AlgoCG 09
H,((3#,'*<#'@3%&
IJ
44
Kapitel 3. Visibility Culling
3.4 Hierarchischer Z-Buffer
Die bisher vorgestellten Occlusion Techniken über PVS eignen sich gut für Szenen in Gebäuden. Für Waldszenen, sich bewegende Menschmassen oder anderes, offenes Gelände eignen
sie sich jedoch nicht. Unter den Annahme, dass Zweige, Blätter und Nadeln der Bäume ausmodelliert sind, erhält man einen großen Occluder, der aus sehr vielen kleinen, jeweils wenig verdeckenden Objekten besteht. Man spricht dabei auch von aggregierter Verdeckung.
Hier lassen sich Zellen mit beschränkter Sichtbarkeit nur sehr schlecht bilden und der Stabtree
würde sehr groß.
Der hierarchische Z-Buffer ist ein weiterer Occlusion Culling Algorithmus. Die Idee ist,
von vorne nach hinten zu rendern und alles was verdeckt ist, nicht zu zeichnen. Dabei geht das
Verfahren konservativ vor, d.h. jedes sichtbare Dreieck wird auch garantiert gezeichnet. Das
Ziel ist, die Redundanzen bei der Sichtbarkeitsabfrage (Abfrage der Z-Werte) zu reduzieren
und die Redundanzen bei der Darstellung von HEINZ
verdeckten
Dreiecken
NIXDORF
INSTITUT zu reduzieren.
rchischer Z-Buffer
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
3.4.1 Grundideen
%"&'$%()**"&+,--".&/)(&01($%2,%(".3
Im klassischen Z-Buffer Algorithmus wird die Sichtbarkeit für jeweils ein Pixel gelöst. Dabei
5'
5'*:%(&,;3(%&'#;3(*$/"*$/&"%*",;3*3#"(%"*&%"-%&"=
:%(&,;3(%&'#;3(
$/" $/&"%
",;3
3#"(%"
werden
auch die
Pixel
von &%"-%&"
Objekten bzw. Gruppen von Objekten betrachtet, die vollständig
hinter einem anderen Objekt liegen. In Abbildung 3.11 werden die Smileys komplett von
%&%;3"%"=*?@,""*%#"*A.B%C(*$%&-%;C(*#'(D=
dem Zylinder verdeckt, da der tiefste Z-Wert des Zylinders näher am Betrachter liegt als der
"%*%#"F#2%
"%
%#"F#2% 0.G&,2%*GH&*4I21#;3'(
0.G&,2%
GH& 4I21#;3'(
A.B%C(%
A.B%C(%*
naheste
Z-Wert der$#%1%
Smileys.
5&;3GH3&%"
.%&%#('
2%F%#;3"%(
2
.B%C(*#'(*2%",5*-,""*$%&-%;C(=*@%""*'%#"*4#"#4,1%&*
(*2&IN%&*#'(*,1'*-%&*4,8#4,1%*KLM%&(*.%&%#('*
;3"%(%&*A.B%C(%
B
"/;3*F5
F%#;3"%"
F4,8*
P
Q
4,8 OOKP1#"-%&Q
F4#"*OY4#1%P2&577%Q
U/&1%'5"2*V012/&#(34%"*#"*-%&*W/475(%&2&,G#CX=*YY*>ZZ[
R,((3#,'*S#';3%&
TE
Abbildung 3.11: Vollständige Verdeckung von Objekten durch ein größeres Objekt.
Man rendert nun von vorne nach hinten um schnell abfragen zu können, ob Objekte von bereits gezeichneten Objekten verdeckt werden. Ein Objekt ist genau dann verdeckt, wenn sein
minimaler Z-Wert größer ist als der maximale Z-Wert bereits gezeichneter Objekte. Um die
Berechnung effizienter als den normalen Z-Buffer Algorithmus zu machen, wird eine solche
Abfrage immer für eine Menge von Objekten auf einmal durchgeführt. Dazu wird ein Octree
AlgoCG 09
45
Kapitel 3. Visibility Culling
HEINZ NIXDORF INSTITUT
rchischer Z-Buffer
!"#$%&'#()(*+,-%&./&"
est
für die Szene aufgebaut, der die einzelnen Dreiecke enthält.
Ein Dreieck wird so tief wie mög012/&#(34%"*5"-*6/471%8#()(
lich einsortiert. Das Vorgehen im Paper speichert kleine Dreiecke, die auf den Sticky-Planes
zwischen großen Oktanten hängen bleiben, mehrfach in allen geschnitteten Oktanten. Dabei
%&$'&
enthält eine Octree-Box höchstens k Dreiecke. Passt ein Dreieck nicht in eines der 8 Kinder,
wird es im Elternknoten gespeichert.
Anstatt die Sichtbarkeit einzelner Dreiecke zu testen wird immer die ganze Box auf ihre
3&%"*%#"%*%1%4%"(,&%*<%'(/7%&,(#/"*%#"=
Sichtbarkeits geprüft. Dazu werden die Flächen der BoundingBox genutzt. Falls die Box unist, sind auch alleA/5"-#"2./8
Objekte in der Box und in allen Kindern unsichtbar. Der entschei?%2%.%" #'( sichtbar
?%2%.%"*#'(*%#"%*,@3'%"7,&,11%1%*A/5"-#"2./8*
%#"% ,@3'%"7,&,11%1%
dende
Faktor
für
die
Laufzeit
ist die Anzahl der Elemente, die unterhalb einer Box im OcBAA/8C
tree hängen. Der Test
Boundingbox
darf nicht länger dauern als das Rendern der Objekte
HEINZ der
NIXDORF
INSTITUT
!"#$%&'#()(*+,-%&./&"
+&;:%*#4*A#1-&,54D*/.*<%#1%*-%&*A/8*'#@3(.,&*'#"unterhalb der Box. 012/&#(34%"*5"-*6/471%8#()(
Sonst
würde sich der Test nicht mehr lohnen.
Die Testoperation prüft für eine achsenparallele Boundingbox, ob Teile von ihr im Bildraum
sichtbar sind wie in Abbildung 3.12 dargestellt.
$Funktion !"%&'(&)(*$!!"%$++,
f
*++$-)($-.$!-#/012.$)-34(+10,
%'(/7%&,(#/"*%#"=
0&(20'$(02&
'%"7,&,11%1%
'%"7,&,11%1%*A/5"-#"2./8*
A/5"-#"2./8
lse
*<%#1%*-%&*A/8*'#@3(.,&*'#"0&(20'$51#)&
(a)
)(*$!!"%$++,
(b)
012.$)-34(+10,
Abbildung 3.12: Prüfe für eine achsenparallele Boundingbox ob Teile von ihr unsichtbar sind.
E,((3#,'*F#'@3%&
I/&1%'5"2*J012/&#(34%"*#"*-%&*K/475(%&2&,:#LMD*NN*OPPH
GH
Mögliche Verfahren zur Durchführung des Boxentests sind die folgenden:
• Die Boundingbox kann aus 6 × 2 Dreiecken modelliert werden (2 Dreiecke pro Seite).
Man kann nun die Boundingbox in einem extra Puffer rendern und prüfen, wie viele
Pixel sichtbar sind.
E,((3#,'*F#'@3%&
K/475(%&2&,:#LMD*NN*OPPH
GH
• Projiziere die 8 Eckpunkte der Boundingbox in den Bildraum und berechne davon im
Bildraum die 2D Boundingbox.
• Unterstütze die Operation in spezieller Hardware.
Man prüft dann Pixelweise für die Z-Werte der Boundingbox gegen den Z-Buffer. Falls
alle Werte des Z-Buffers größer sind, ist die Box unsichtbar. Der Nachteil dieses Verfahrens
ist, dass Kosten in Größe der projizierten Box entstehen (in Anzahl der Pixel). Dies ist insbesondere für große Boxen ineffizient. Man verwendet daher die im nachfolgenden Abschnitt
vorgestellte Z-Pyramide.
3.4.2 Z-Pyramide
Die Z-Pyramide bildet eine Hierarchie von Z-Werten. Auf der untersten Ebene hat man die
Werte des normalen Z-Buffers. Für die nächst höhere Ebene werden jeweils vier benachbarte
AlgoCG 09
46
HEINZ NIXDORF INSTITUT
Hierarchischer Z-Buffer
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
Aufbau der Z-Pyramide
Kapitel 3. Visibility Culling
!"#$%&'()*
9 :#&**.#1-%"*%#"%*;#%&,&<3#%*$/"*=C>%&(%"*?,4*.%'(%"*'#"-*@%&*+/(%"A%"B
:#& .#1-%" %#"% ;#%&,&<3#% $/" = >%&(%" ?,4 .%'(%" '#"- @%& +/(%"A%"B
HEINZ NIXDORF INSTITUT
Hierarchischer Z-Buffer
Z-Werte zu einem neuen, gröberen Quadranten zusammengefasst wie in einem regelmäßig
9 ,"*-%&*D7#(A%*-%&*;#%&,&<3#%*'(%3(*%#"*%#"A#2%&*=C>%&(
aufgebauten Quadtree. Abbildung 3.13(a) zeigt ein Beispiel. Dies wird solange fortgesetzt
!"#$%&'()*
#" -%" E1)((%&" '#"- -#% >%&(% -%' =CE5FF%&'
#"*-%"*E1)((%&"*'#"-*-#%*>%&(%*-%'*=CE5FF%&'
bis,
wie in Abbildung 3.13(b) dargestellt,9 nur
noch ein Wert an der Spitze der Pyramide steht.
9 :%;%#1'*$#%&*.%",<3.,&(%*=B>%&(%*-%'*=B?5@@%&'*;%&-%"*A5*%#"%4*"%5%"*
:%;%#1' $#%& .%",<3.,&(% = >%&(% -%' = ?5@@%&' ;%&-%" A5 %#"%4 "%5%"
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
Aufbau der Z-Pyramide
2&C.%&%"*D5,-&,"(%"*A5',44%"2%@,''(
9 -#%*0&(*-%&*=5',44%"@,''5"2*%&@/12(*;#%*#"*%#"%4*&%2%14)E#2*,5@2%.,5(%"*
D5,-(&%%
=CE5FF%&:%&(%
Hierarchischer Z-Buffer
Aufbau der(a)
Z-Pyramide
F,((3#,'*G#'<3%&
J/&1%'5"2*K012/&#(34%"*#"*-%&*L/475(%&2&,@#MNO*PP*IQQR
!"#$%&'()*
U*05F1T'5"2
V*>%&(
S*05F1T'5"2HEINZ
NIXDORF INSTITUT
G,((3#,'*H#'<3%&
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
K/&1%'5"2*L012/&#(34%"*#"*-%&*M/475(%&2&,F#NOP*DD*@QQR
HI
(b)
Abbildung 3.13: Aufbau der Z-Pyramide.
+*,-.*% +*%/ 0/*./ (1 )*' 2%34*%*1 56&)%&1/*17
+*,-.*%8+*%/80/*./8(18)*'82%34*%*1856&)%&1/*17
In einem höheren
Quadrat steht jeweils der maximale Z-Wert aller seiner Kinder, d.h. der
9 #44%&*-%&*:;<%&(=*-%&*,4*>%#(%'(%"*$/4*?%(&,@3(%&*%"(A%&"(*#'(=*-B3B
-,'*C,8#454*-%&*$#%&*6#"-%&
Z-Wert, der am weitesten vom Betrachter entfernt ist. Lediglich im Z-Buffer selbst, d.h. der
9 "5&*#4*:;?5AA%&*D5"(%&'(%*E.%"%F*'(%3(*-%&*:;<%&(=*-%'*,4*")@3'(%"*
untersten Ebene
der Pyramide, steht der Wert des am nahegelegendsten Pixels. Abbildung
'(%3%"-%"*G&%#%@H'I
3.14 zeigt ein Beispiel für die hierarchische Propagierung der Z-Werte.
9
9
9
9
9
9
9
!
9
9
:
9
9
9
!
!
9
9
9
9
;
9
!
!
9
9
9
;
;
9
!
9
9
;
;
:
:
;
!
;
;
9
:
:
!
!
!
:
:
!
!
:
:
:
9
9
9
!
!
9
;
;
!
;
!
!
!
;
:
!
!
!
:
!
!
!
:
!
:
:
!
:
:
:
M/&1%'5"2*N012/&#(34%"*#"*-%&*O/475(%&2&,A#HP=*QQ*RSST
!
C,((3#,'*J#'@3%&
KL
Abbildung 3.14: Propagierung der Z-Werte in der Pyramide.
Ändert sich ein Wert im Z-Buffer, wird die Änderung solange nach oben propagiert, bis sich
der Wert des höheren Quadrats nicht mehr ändert.
3.4.3 Verwendung der Z-Pyramide
Für eine Seite der Boundingbox BBox des zu testenten Oktanten soll die Sichtbarkeit geprüft
werden. Jede der 6 Seiten wird als PolyBBoxi mit i = 1, . . . , 6 bezeichnet. Die 2DBBox
ist die 2D Boundingbox der PolyBBoxi im Bildraum. Dann ist Min(PolyBBoxi ) der kleinste
(näheste) Z-Wert einer Seite PolyBBoxi der Octreebox. Nun wird der feinste Level in der
Pyramide gesucht, in dem die 2D Box gerade noch vollständig in einen Quadranten passt. Sei
ZP.z der Z-Wert dieses Quadranten. Falls nun Min(PolyBBoxi ) ≥ ZP.z gilt, dann ist die Box
AlgoCG 09
47
IJ
9 :#&*;<""%"*"5&*-%"*=>?%&(*-%&*2&<.'(%"*@%$%1*#"*-%
HEINZ NIXDORF INSTITUT
Hierarchischer Z-Buffer
Kapitel
3.- Visibility
9 -#
-#%'*#'(*"#B3(*.%'/"-%&'*:#&;',4C*-,*%'*"5&*-%"*:%#
# ( # 3(
.
# ; Culling
#
2%&%"-%&(%&*D.E%;(%*1#%F%&(*
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
Verwendung der Z-Pyramide
!"#$%#&'#()#($'"&$)"#$*+,-&./")#0
vollständig
verdeckt.
In Abbildung
3.15 wird
der
9 '5:3%
'5:3%*-%"*;%#"'(%"*<%$%1*#"*-%&*=B+>&,4#-%C*#"*-%"*-#%*?@AA/8*2%&,-%*
-%"
;%#"'(%" <%$%1
#" -%& = +>&,4#-%
#" -%" -#% ?@AA/8
2%&,-%
"/:3*&%#"*7,''(D*=+DE
'%#*-%&*-,E52%3F&#2%*=BG%&(
umrandet.
ausgewählte Quadrant für ein Dreieck in rot
9 H,11'*I#"JPolyBBoxiK*!*=+DE #'(*-,'*+/1>2/"*-%&*AA/8*$%&-%:L(
I,((3#,'*H#':3%&
O/&1%'5"2*P012/&#(34%"*#"*-%&*Q/475(%&2&,;#LRC*SS*?TTU
(a)
MN
J/&1%'5"2*K012/&#(34%"*#"*-%&*L/475(%&2&,F#;MC*NN*OPPQ
(b)
Abbildung 3.15: Prüfung der Sichtbarkeit von Dreiecken auf dem gröbsten möglichen Level.
Hierarchischer Z-Buffer
Verwendung der Z-Pyramide
HEINZ NIXDORF INSTITUT
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
Das beschriebene Vorgehen funktioniert schlecht für Dreiecke, die genau in der Mitte des
Bildes liegen. Diese
schneiden die Quadranten der Pyramide häufig schon sehr früh, so dass
!"#$%&'(%)(*%&(+,-./01%*&
9 2%3%*:54*");3'(*<%#"%&%"*=%$%1*#"*-%&*>@+?&,4#-%
2%3%
:54 ");3'(
=%$%1 #"zum
-%& > +?&,4#-%
man nur den gröbsten
Level
der <%#"%&%"
Pyramide
Vergleich nehmen kann. Dies ist nicht sehr
7&A<%B*/.*-,'*+/1?2/"*#"*,11%"*CA.%&';3"%#-%"-%"D*E5,-&,"(%"*$%&-%;F(*#'(
effektiv, da es nur 9den
weitesten Z-Wert aller bereits gezeichneten Objekte enthält. Fällt der
9 '%(:%*0.'(#%2*&%F5&'#$*</&(*.#'*!"'#;3(.,&F%#(*<A&*,11%*E5,-&,"(%"*2%:%#2(*#'(B*
'%(:%die
0.'(#%2
&%F5&'#$ </&( .#' !"'#;3(.,&F%#(
<A& ,11%gezeigt
E5,-&,"(%"
2%:%#2( #'( dann wird in der ZTest negativ aus, d.h.
Unsichtbarkeit
kann nicht
werden,
/-%&*.#'*4,"*,5<*-%4*<%#"'(%"*=%$%1*'#;3(.,&%*+#8%1*2%<5"-%"*3,(*
Pyramide auf den nächst feineren Level abgestiegen wie in Abbildung 3.16 gezeigt.
K/&1%'5"2*L012/&#(34%"*#"*-%&*M/475(%&2&,<#FNB*OO*PQQJ
G,((3#,'*H#';3%&
IJ
Abbildung 3.16: Abstieg in der Z-Pyramide zur Auflösung kleiner Elemente, die große Boxen
schneiden.
Prüfe für alle überschneidenden Quadranten, ob das Polygon darin verdeckt ist. Falls dies
nicht der Fall ist, setzt man den Abstieg rekursiv für die Quadranten fort, in denen die Unsichtbarkeit nicht gezeigt werden konnte. Auf dem untersten Level wird ganz normal Pixel für Pixel der Z-Wert bestimmt und über den Z-Buffer-Algorithmus eingetragen. Ein Problem dieser
Vorgehensweise ist, dass der minimale Z-Wert für einen Teil des Polygons schwer zu bestimmen ist. Stattdessen verwendet man den Z-Wert des gesamten Polygons für alle Teile. Dies
geht wesentlich schneller, ist aber auch ungenauer, so dass nicht mehr alle Unsichtbarkeiten
gefunden werden können.
AlgoCG 09
48
Kapitel 3. Visibility Culling
3.4.4 Rendering mit dem Hierarchischen Z-Buffer
Beim Rendering wird der Octree von vorne nach hinten durchlaufen (front-to-back traversal).
Für jede Box wird mit Hilfe der Z-Pyramide die Sichtbarkeit geprüft. Falls die Box nicht
unsichtbar ist, werden alle enthaltenen Objekte gerendert und dann die Kinder traversiert. Das
Vorgehen fasst Algorithmus 14 zusammen.
Algorithmus 14 Rendering mit dem Hierarchischen Z-Buffer
1: function R ENDERO CTREE(OctreeNode N )
2:
if N ist außerhalb des Frustum then
3:
return
4:
end if
5:
if IsOccluded(N , Zp) then
6:
return
7:
end if
8:
for all Objekte o in OctreeBBox N do
9:
Rendere Objekt o
10:
Aktualisiere Z-Pyramide Zp
11:
end for
12:
for all Kinder C von N in front-to-back order do
13:
RenderOctree(C)
14:
end for
15: end function
. Zelle nicht im Sichtkegel
. Zelle ist verdeckt
Der hierarchische Z-Buffer versucht, drei Kohärenzen auszunutzen, die in einer 3D Szene
vorkommen können. Diese sind:
• Objektraumkohärenz (object space coherence)
Polygone in der Nähe eines verdeckten Polygons sind wahrscheinlich auch verdeckt.
Dies lässt sich über die Octree Traversierung ausnutzen, da dicht beieinanderliegende
Polygone in der gleichen Box sind, die dann mit hoher Wahrscheinlichkeit komplett
verdeckt ist.
• Bildraumkohärenz (image space coherence)
Ein Polygon mit einem verdeckten Pixel hat wahrscheinlich auch benachbarte Pixel, die
verdeckt sind. Durch die Hierarchie der Pyramide können viele Pixel auf einmal getestet
werden.
• Zeitliche Kohärenz (temporal coherence)
Falls ein Objekt in einem Frame sichtbar ist, ist es mit hoher Wahrscheinlichkeit auch
im nächsten Frame noch sichtbar.
Der Algorithmus wird wahrscheinlich am besten laufen, wenn für eine gegebene Position
die Z-Pyramide einmal aufgebaut wurde. Man führt eine Liste von Octree Boundingboxen,
die im letzten Frame sichtbar waren. Vor der Traversierung rendert man zuerst alle Boxen, die
im letzten Frame sichtbaren gewesen sind. Dabei werden nicht mehr sichtbare Boxen aus der
Liste entfernt und neu sichtbare Boxen in die Liste eingefügt.
AlgoCG 09
49
Kapitel 3. Visibility Culling
3.4.5 Hardwareunterstützung
Die Evaluierung des Algorithmus hat gezeigt, dass er ohne eine Hardwareunterstützung kaum
wirksam ist, da die Testoperationen zu teuer sind. Das Problem ist, dass sich Z-Pyramiden aufgrund der Hierarchie nur schlecht in Hardware implementieren lassen. Zudem führt die unterschiedlich lange Berechnungszeit für den Boxentest zu einem Abriss in der Pipeline. Stattdessen wurde ein einfacher Boxentest in Hardware implementiert. Dieser ist nicht blockierend
und erlaubt das gleichzeitige Rendern weiterer Geometrie. Die Methode gibt die Anzahl der
sichtbaren Pixel zurück.
HEINZ NIXDORF INSTITUT
Hierarchical Occlusion Maps
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
Beobachtung und Ausgangspunkt
!"#$%&$#'"&()
3.5 Hierarchical
Occlusion Maps (HOM)B511#"2*
9 2&/:%*;<<15-%&*1,''%"*'#<3*25(*$%&=%"-%">*54*%??#@#%"(*;<<15'#/"
2&/:% ;<<15-%& 1,''%" '#<3 25( $%&=%"-%"> 54 %??#@#%"( ;<<15'#/"AB511#"2
-5&<3@5?C3&%"
Die Ausgangsidee 9 besteht
darin, dass sich große Occluder gut dazu verwenden lassen, um
D1%#"%*;<<15-%&*$%&-%<D%"*E@5*=%"#2F*5"-*%#2"%"*'#<3*-,3%&*=%"#2%&
effizient Occlusion Culling durchzuführen, da diese große Teile der Szene verdecken. Kleine
Occluder eignen sich dafür nicht so gut wie Abbildung 3.17 zeigt.
Abbildung 3.17: Verdeckungspotential verschieden großer Occluder.
HEINZ NIXDORF INSTITUT
Occlusion Maps nutzt
man aus, dass viele kleine Occluder zusammen
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
einen großen Occluder ergeben, der sich für
das Culling eignet. Es wird deshalb aus einer
Menge von Occludern ein sogenannter aggregierter Occluder gebildet, der wie in Abbildung
!"#$%&'()&"*'+,'-+.*/0(1%2&#3.18 dargestellt mehr
verdeckt als die einzelnen Occluder separat verdecken können.
95',44%"'%(:5"2 %#"%& ;<&577%=*,5'*>1%#"%"*
95',44%"'%(:5"2*%#"%&*;<&577%
,5' >1%#"%"
Hierarchical Occlusion
Für die Maps
Hierarchical
L/&1%'5"2*M012/&#(34%"*#"*-%&*B/475(%&2&,?#DN>*OO*PJJQ
G,((3#,'*H#'<3%&
IJK
Idee
?@@15-%&"A*-#%*#"*B)3%*:5%#","-%&*'(%3%"
?@@15-%%
344*#,'(+5#-106
C D%&%#"#25"2*%#"%&*?@@15-%&4%"2%
C %'*%"('(%3(*%#"*,22&%2#%&(%&*?@@15-%&
C %#"*,22&%2#%&(%&*?@@15-%&*$%&-%@>(*4%3&A*,1'*-#%*
%#":%1"%"*>1%#"%"*?@@15-%&*'%7,&,(*$%&-%@>%"*
>E""%"
,22&%2#%&(%&*?@@15-%&
.**/'&'16/7*%1/)'1%
C >%#"%*'7%:#%11%"*F(&5>(5&%"*GH#%*.%#*+DFI*#4*
Abbildung 3.18:
J/-%11*"/(H%"-#2
Verdeckungspotential eines aggregierten Occluders.
C >%#"%*K%'(&#>(#/"%"*,"*-#%*?@@15-%&(V7%"
>%#"% K%'(&#>(#/"%" ," -#% ?@@1 -%&( 7%"
Die Hierarchical Occlusion Maps stellen dabei im Gegensatz zu PVS keine Anforderungen
Form der Occludertypen. Sie eignen sich daher sehr gut für
MNO
J,((3#,'*L#'@3%&
CAD- und Outdoor Szenen.
C -,3%&*25(*2%%#2"%(*RW&*Q0XY
an die Struktur5"-*?5(-//&YF:%"%"
der Szene oder die
D/&1%'5"2*P012/&#(34%"*#"*-%&*Q/475(%&2&,R#>SA*FF*TNNU
AlgoCG 09
50
Kapitel 3. Visibility Culling
HEINZ NIXDORF INSTITUT
Hierarchical Occlusion Maps
3.5.1 Der
HOM-Algorithmus
HOM-Algorithmus
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
Der Algorithmus
baut zunächst im Preprocessing eine Occluder-Datenbank auf. Diese ent!"#$%&'()*+,-./
hält eine 9%&*012/&#(345'*,&.%#(%(*#"*:;%#*<=3&#((%">*
Menge
von
Occludern.
Anschließend werden online für jeden Frame zwei
9%& 012/&#(345'guten
,&.%#(%(
#" :;%# <=3&#((%">
Berechnungsschritte
durchgeführt:
-#%*.%#-%"*<=3&#((%*;%&-%"*?@&*A%-%'
B&,4%*.%&%=3"%(C
DE F%&%=3"5"2*-%&*G==15'#/"HI,7*J#%&,&=3#%
1. Berechnung der Occlusion-Map-Hierarchie
KE L#'#.#1#(M*N511#"2*5"-*O%"-%&#"2
2. Visibility Culling und Rendering
JGI*P*J#%&,&=3#=,1*G==15'#/"*I,7'
Die dazu
notwendigen Schritte fast das Ablaufdiagramm in Abbildung 3.19 zusammen.
G==15-%&
9,(%".,"Q
L#%;HB&5'(54
N511#"2
G==15-%&
05';,31
G==15-%&
O%"-%&#"2
F%&%=3"5"2*G==15'#/"H
I,7*J#%&,&=3#%
R9H<:%"%
9,(%".,"Q
L#%;HB&5'(54
N511#"2
L/&1%'5"2*U012/&#(34%"*#"*-%&*N/475(%&2&,?#QVW*<<*KSST
O%"-%&#"2
R9H<:%"%
JGIHN511#"2
I,((3#,'*B#'=3%&
DST
Abbildung 3.19: Ablauf des Rendering unter Verwendung von HOM Culling.
3.5.1.1 Aufbau der Hierarchie
Zunächst wird die 3D-Szene in Form einer Bounding-Volume Hierarchie repräsentiert. Dies
ist vermutlich ein Octree. Anschließend wird daraus eine Occluder-Datenbank mit einer
Menge von Occludern abgeleitet. Diese Schritte werden im Preprocessing durchgeführt. Um
einen Frame zu rendern wird eine Teilmenge der Occluder aus der Datenbank genommen, die
im View-Frustum enthalten ist. Es werden jedoch nicht alle möglichen Occluder ausgewählt,
da das anschließende Rendern dieser Objekte nicht lange dauern soll. Die Objekte werden aus
diesem Grund als weiße Objekte (schwarz-weiß Bild) in den Framebuffer gerendert. Das entstandene Bild wird dann aus dem Framebuffer zurückgelesen und bildet den Ausgangspunkt
für die Berechnung der Occlusion-Map Hierarchie. In einem Zwischenschritt wird ein Tiefenpuffer zur Tiefenabschätzung der Occluder berechnet. Das aus dem Framebuffer gelesene
Bild ist die feinste Auflösung für die Occlusion-Map Hierarchie. Die Hierarchie entsteht ähnlich zum Hierarchischen Z-Buffer dadurch, dass immer Quadranten von 4 Pixeln zu einem Pixel zusammengefasst werden. Dabei erhält das gröbere Pixel als Wert das arithmetische Mittel
der 4 Einzelwerte. Auf der feinsten Ebene ist ein Wert 1, wenn das Pixel von den Occludern
abgedeckt ist, und 0, wenn nicht. In der Praxis wird der Mittelwert als bilineare Interpolation
durch die Graphik-Hardware mit Texture-Mapping-Unterstützung berechnet. Abbildung 3.20
zeigt ein Beispiel für eine solche Hierarchie von Occlusion Maps (HOM).
Das Rendern über den Texture-Mapper funktioniert so, dass eine Occlusion Map der Größe
2N × 2N in den Framebuffer gerendert wird. Anschließend wird das Bild in den Texturspeicher geladen und auf ein Rechteck mit halber Seitenlänge gerendert. Dies wird solange
durchgeführt, bis eine vordefinierte gröbste Auflösung erreicht wurde.
AlgoCG 09
51
Kapitel 3. Visibility Culling
Abbildung 3.20: Occlusion-Map Hierarchie.
3.5.1.2 Visibility Culling und Rendering mit HOM
Für das Rendering der Szene wird zunächst ein normales Frustum Culling durchgeführt. Anschließend wird über den Tiefenpuffer getestet, ob das Objekt hinter den Occludern liegt. Falls
nicht, muss es gezeichnet werden. Ansonsten wird im dritten Schritt die 2D Projektion des
Objektes für den Überlappungstest berechnet. Dabei wird die Occlusion-Map Hierarchie von
oben nach unten durchgegangen und jeweils geprüft, ob der Occludee durch undurchsichtige
Teile der Occlusion-Map verdeckt wird.
3.5.2 Betrachtung der Teilschritte
3.5.2.1 Überlappungstest
Das Objekt wird konservativ in den Bildraum projiziert. Dazu werden die Eckpunkte der
3D-Boundingbox in den Bildraum projiziert und anschließend die 2D-Boundingbox der Projektion betrachtet. Anschließend wird eine Map verwendet, deren Pixelgröße der Größe der
Box entspricht. Danach wird für jedes Pixel, dass die Boundingbox schneidet, geprüft, ob es
sichtbar ist oder nicht. Falls das Pixel das Objekt nicht vollständig verdeckt, werden die Pixel
rekursiv ausgewertet. Falls alle geprüften Pixel undurchsichtig (Schwellwert = 1) sind, wird
das Objekt potentiell vollständig von den Occludern verdeckt. Gewissheit darüber erhält man
durch den zusätzlichen, in Abschnitt 3.5.2.4 beschriebenen Tiefentest.
AlgoCG 09
52
Kapitel 3. Visibility Culling
3.5.2.2 Occluderauswahl im Preprocessing
Im Preprocessing werden alle Objekte der 3D-Datenbank untersucht. Als Occluder eignen
sich Objekte, die
• nicht zu klein sind, da sich kleine Objekte nur schlecht als Occluder eignen
• nicht redundant zu anderen Occludern sind (z.B. ist eine Uhr an einer Wand redundant
zu der Wand, die einen besseren Occluder darstellt).
• nicht zu komplex sind, da die Occluder schnell gerendert werden müssen und komplexe
Objekte zuviel Zeit in Ansprucht nehmen.
3.5.2.3 Occluderauswahl zur Laufzeit
Zur Laufzeit wird eine Menge von Occludern aus der Occluder-Datenbank ausgewählt. Dazu
werden zunächst alle Occluder des Frustums bestimmt und dann nach Entfernung sortiert
(3D-BBox Mittelpunkt). Als Occluder eignen sich vor allem solche, die nah an der Kamera
stehen und wenige Polygone haben. Entsprechend werden startend von der Kameraposition
sukzessive Occluder ausgewählt, bis eine maximale Polygonkomplexität erreicht wurde. Die
Polygonkomplexität ist die Summe der enthaltenen Polygone.
3.5.2.4 Tiefentest
Nachdem festgestellt wurde, dass sich ein Objekt mit der Occlusion Map vollständig überlappt, muss festgestellt werden, ob es auch hinter dem aggregierten Occluder liegt. Dafür gibt
es zwei Varianten.
Variante 1 Für die Occlusion Map wird ein z-Wert einer z-Ebene gespeichert, die die aggregierten Occluder von möglichen Occludees trennt. Der gewählte z-Wert ist der z-Wert des
am weitesten entfernten Occluders (bzw. der weitest entfernte Eckpunkt dieses Occluders).
Alle Objekte, die vollständig hinter dieser z-Ebene liegen, werden vollständig verdeckt wie in
Abbildung 3.21(a) dargestellt.
Variante 2 Bei dieser Variante werden mehrere z-Ebenen verwaltet. Dazu wird der 2DBildraum z.B. in 64 × 64 gleichgroße Kacheln partitioniert, um einen Tiefenpuffer zu erhalten. Für jede Kachel wird ein Tiefenwert gespeichert. Dieser entspricht dem z-Wert des am
weitesten entfernten Occluders, der auf diese Kachel projiziert wird. Abbildung 3.21(b) zeigt
dieses Vorgehen.
Für den Aufbau des Tiefenpuffers werden die Ecken aller 3D-Boundingboxen der Occluder
in den 2D-Bildraum projiziert. Aus diesen wird die 2D-Boundingbox berechnet. Der z-Wert
entspricht dem größten z-Wert unter allen 3D-Eckpunkten der 3D-Boundingbox. Man aktualisiert nun die Tiefenwerte aller Kacheln, die von der 2D-Boundingbox geschnitten werden.
AlgoCG 09
53
HEINZ NIXDORF INSTITUT
Hierarchical Occlusion Maps
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
HEINZ NIXDORF INSTITUT
l Occlusion Maps
Tiefentest - 2
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
Kapitel 3. Visibility Culling
!"#$"%&'()
%#'()*+#,&#'(-"&(.#/()0012'"3%4567
9%&:%#"%&% -#% ;-%% 4#( %#"%& <
9%&:%#"%&%*-#%*;-%%*4#(*%#"%&
<=>.%"%
>.%"%*5"-*$%&?%"-%*
5"- $%&?%"-%
(2%'(%11(
(2%'(%11(*<5&-%=*-,''*'#:3*%#"*>.?%@(*4#(*-%&*
<5&-%= -,'' '#:3 %#" >.?%@( 4#( -%&
4%3&%&% <=>.%"%"
,7*$/11'()"-#2*C.%&1,77(=*4C''%"*<#&*7&C;%"=*/.*%'*
2&%2#%&(%"*>::15-%&" 1#%2(
*$'+'%,-++'#
3%&"*;C&*-#%*>::15'#/"AB,7*-%"*EAF%&(*%#"%&*EA
@ ?#&*7,&(#(#/"#%&%"*-%"*AB=C#1-&,54
#%*-#%*>::15-%&*$/"*4H21#:3%"*>::15-%%'*(&%""(
D.'7? #" EF8EF 21%#G3 2&/H% 6,G3%1"I
D.'7?J*#"*EF8EF*21%#G3*2&/H%*6,G3%1"I
-%&*EAG.%"%*#'(*-%&*EAF%&(*-%'*,4*<%#(%'(%"*
@ .#1-%*:K&*L%-%*6,G3%1*-%'*M#%:%"75::%&'*%#"%*<=>.%"%
"*>::15-%&'*
EAG.%"%
JJ*-%&*<%#(%'(%*G:@75"@(*-%&*K/5"-#"2./8L
-%& <%#(%'(% G:@75"@( -%& K/5"-#"2./8L
@ L%-%
L%-%*6,G3%1*%"(3)1(*-%"*<=N%&(*-%'*,4*?%#(%'(%"*
6,G3%1 %"(3)1( -%" <=N%&( -%' ,4 ?%#(%'(%"
%"(:%&"(%"*OGG15-%&'P*-%&*#"*-#%'%*6,G3%1*7&/L#<#%&(*?#&-
,22&%2#%&(%*>::15-%&*
#
> 1 N#%*.%&%G3%"*?#&*-%"*M#%:%"75::%&Q
-%&*>::15'#/"AB,7
<=>.%"%"*+,&(#(#/"%"
#4*AB=C#1-&,54
>::15-%%
N#%*?#&-*%&*$%&?%"-%(Q
B,((3#,'*M#':3%&
Q/&1%'5"2*R012/&#(34%"*#"*-%&*S/475(%&2&,;#@T=*UU*OVVW
(a)
NOP
TAE
Abbildung 3.21: Tiefentest der überlappenden Occludees,HEINZ
(a) zeigt
die Variante mit einer zNIXDORF INSTITUT
Hierarchical Occlusion Maps
!"#$%&'#()(*+,-%&./&"
Ebene, (b) zeigt die Variante mit mehreren 012/&#(34%"*5"-*6/471%8#()(
z-Partitionen.
Tiefentest - 4
!"#$"%&'()(
9%&:%"-5"2*-%'*;#%<%"75<<%&
9%&:%"-5"2
-%' ;#%<%"75<<%&
=>??15-%%@;%'(A
B :#&*7&/C#D#%&%"*-#%*E?F%"*-%&*GH@I./8*-%'*D5*
(%'(%"-%"*>.C%F(%'*#"*-%"*JH@I#1-&,54
HEINZ NIXDORF INSTITUT
clusion MapsB $/"
$/"*-%"*E?F%"*.#1-%"*:#&*-#%*JH@I./8
-%" E?F%" .#1-%" :#& -#% JH
I./8
!"#$%&'#()(*+,-%&./&"
;#%<%"75<<%&
(b)
R,((3#,'*S#'G3%&
9/&1%'5"2*U012/&#(34%"*#"*-%&*V/475(%&2&,:#WXP*YY*AZZ[
D5*(%'(%"-%'*>.C%F(
C
012/&#(34%"*5"-*6/471%8#()(
B :#&*.%&%?3"%"*-%"*")?3'(%"*K@L%&( ,11%&*
E?F%"*-%&*GH@I./8*
")?3'(%& K@L%&(
")?3'(%&*K@L%&(
B :#&*7&M<%"*-#%'%"*L%&(*4#(*,11%"*E#"(&)2%"*-%'*
;#%<%"75<<%&'N*-#%*$/"*-%&*JH@I./8*
2%'?3"#((%" :%&-%"
2%'?3"#((%"*:%&-%"*
*-#%*E?F%"*-%&*GH@I./8*-%'*D5*
%F(%'*#"*-%"*JH@I#1-&,54
D5*(%'(%"-%'*>.C%F(
C
"*.#1-%"*:#&*-#%*JH@I./8
" .#1-%" :#& -#% JH I./8
"*-%"*")?3'(%"*K@L%&( ,11%&*
@I./8*
O,((3#,'*P#'?3%&
(a)
(b)
9/&1%'5"2*S012/&#(34%"*#"*-%&*T/475(%&2&,<#FUN*VV*JWWX
'%"*L%&(*4#(*,11%"*E#"(&)2%"*-%'*
Abbildung 3.22:
*-#%*$/"*-%&*JH@I./8*
%&-%"*
%&-%"
'5"2*S012/&#(34%"*#"*-%&*T/475(%&2&,<#FUN*VV*JWWX
AlgoCG 09
")?3'(%& K@L%&(
")?3'(%&*K@L%&(
QJR
Ausführung des Tiefentests, (a) zeigt die 2D Projektion von Occluder und
Occludee, (b) zeigt eine 3D Übersicht mit eingezeichneten z-Ebenen.
O,((3#,'*P#'?3%&
QJR
54
Kapitel 3. Visibility Culling
Für den in Abbildung 3.22 illustrierten Tiefentest wird die 3D-Boundingbox des Occludees
in den Bildraum projiziert. Anschließend wird der am nahesten zur Beobachterposition gelegene z-Wert der Boundingbox verwendet. Dieser z-Wert wird gegen alle Kacheln des Tiefenpuffers geprüft, die von der projizierten 2D-Boudingsbox des Objektes geschnitten werden.
3.5.3 Approximatives Visibility Culling
Das bisher betrachtete exakte Culling betrachtet ein Pixel der Occlusion Map nur dann als undurchsichtig, wenn es den Wert 1 hat. Bei einem approximativen Culling betrachtet man auch
Pixel mit einem Wert < 1 als undurchsichtig. Damit betrachtet man kleine Löcher als undurchsichtig und kann mehr Objekte verwerfen, die jedoch durch die kleinen Löcher sichtbar
sind. Die Motivation, es trotzdem zu tun, ist, dass die kleinen Löcher in der Darstellung kaum
auffallen und das Rendering beschleunigt werden kann. Je kleiner man den Schwellwert setzt,
desto größer sind die zugelassenen Löcher und damit die zugelassenen Bildfehler. Man muss
nun für jede Ebene in der Occlusion-Map Hierarchie einen solchen Schwellwert berechnen.
Betrachtet man als Beispiel eine Auflösung von 1024 × 1024 Pixeln und eine OcclusionMap von 64 × 64 Pixeln, dann entspricht jedes Pixel der Occlusion-Map 16 × 16 gerenderten
Pixeln im Bild. Möchte man auf dieser Fläche maximal ein Loch von 25 Pixeln zulassen,
25
≈ 0.9 setzen.
muss man den Schwellwert auf 1 − 16·16
Nummeriert man die Ebenen durch, kann man eine allgemeingültige Formel angeben. Dabei entspricht Ebene 0 der nativen Auflösung und somit der feinsten Occlusion Map. Möchte
man n fehlerhafte Pixel unter insgesamt m Pixeln einer Kachel auf Ebene k zulassen, dann
n
. Auf der nächsthöheren Ebene k + 1 erhält man
ergibt sich als Schwellwert Ok = 1 − m
die vierfache Menge an Pixeln, da jeweils 4 Pixel zu einem Pixel zusammengefasst werden.
Damit erhält man
n
1 − Ok
3 + Ok
Ok+1 = 1 −
=1−
=
4m
4
4
Beim Überlappungstest wird die Überprüfung abgebrochen, sobald der Undurchsichtigkeitswert eines überprüften Pixels oberhalb des Schwellwertes liegt. Man betrachtet das Objekt als vollständig verdeckt.
3.6 Zusammenfassung
Die bislang vorgestellten Techniken haben die folgenden Einsatzbereiche:
• Effizientes Frustum Culling wird mit räumlichen Datenstrukturen (Octrees oder Loose
Octrees durchgeführt)
• Effizientes Occlusion Culling für Indoor Szenen berechnen wir über Potentially Visible
Sets (PVS).
• Effizientes Occlusion Culling für Outdoor Szenen oder dynamische Szenen berechnen
wir über einen hierarchischen Z-Buffer oder über Hierarchical Occlusion Maps.
AlgoCG 09
55
4 Replacement
Es kann passieren, dass eine Szene zu viele Artefakte enthält, um sie zeichnen zu können. Die
in diesem Kapitel vorgestellten Techniken sollen das Zeichnen unter der in Kaufnahme von
Qualitätsverlusten trotzdem ermöglichen.
4.1 Rendering mit Color-Cubes
Große Szenen enthalten oft zuviele Objekte, um sie zeichnen zu können. Mit Occlusion Culling (siehe Kapitel 3) und den in Kapitel 6 vorgestellten Level of Detail Techniken kann die
NIXDORF INSTITUT
Color-Cubes
Anzahl der Objekte
in der Szene reduziert werden. Dafür gibt HEINZ
es aber
Grenzen, denn beim
!"#$%&#'()#('
Level of Detail ist ein Dreieck die untere Grenze und auch für dieses entstehen Renderingkosten. Beim Rendering
mit
Color-Cubes werden in einer solchen Situation ganze Gruppen von
Zentrale
Idee
Objekten zusammengefasst
und
9 (
9&'%(<%*%#"%"*$/11'()"-#2%"*:%&%#=3*%#"%&*$#&(5%11%*;<%"%*-5&=3*%#"%"*
#
11 () durch
-#
: eine
# 3 #Ersatzrepräsentation
# ( 11 ;
- 3 # ersetzt. Man ersetzt einen
2%>)&.(%"*?@&>%1*-%&*54'=31#%A%"-%"*:/5"-#"2./8
vollständigen Bereich der virtuelle Szene durch einen gefärbten Würfel der umschließenden
Boundingbox wie in Abbildung 4.1 dargestellt.
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
Abbildung 4.1: Generelle Idee der Color-Cubes.
E/&1%'5"2*F012/&#(34%"*#"*-%&*G/475(%&2&,>#HIJ*;;*KLLM
B,((3#,'*C#'=3%&
DD
4.1.1 Datenstruktur
Die Szene wird über einen 3D-Octree repräsentiert, der alle Dreiecke in den Blättern abspeichert. Dreiecke, die die Kanten der Octreeboxen schneiden, werden mehrfach gespeichert.
Um sie nicht mehrfach zu zeichnen, wird ein Flag gesetzt, das angibt, ob das Dreieck bereits
gezeichnet wurde. Zu jeder Octreebox wird ein Würfel (Color-Cube) gespeichert, der genauso
groß ist wie die Zelle. Jede der sechs Seiten des Würfels hat einen Farbwert und einen Undurchsichtigkeitswert (Transparenz), dabei ist 1.0 undurchsichtig und 0.0 vollständig transparent. Der Farbwert und der Transparenzwert approximieren die orthogonale Sicht auf die
Geometrie der Zelle. Dies wird im Preprocessing berechnet. Abbildung 4.2 zeigt ein Beispiel
für einen Color-Cube.
56
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
"#$%&#'()#('
Wie berechnen wir die Ersetzungen?
Kapitel 4. Replacement
= 9#
9#&*'7%#>3%&"*4#(*:%-%&*;>(&%%?<%11%*%#"%"*
# 3
#( : - ; (
< 11 #
9@&A%1*B*+,+'-*(.$CD*-%&*2%",5'/*2&/E*#'(*F#%*
-#%*<%11%
= :%-%&*-%&*G*H%#(%"*3,(*%#"%"*I,&.F%&(*5"-*%#"%"*
J!"-5&>3'#>3(#2K%#('F%&(L*BM&,"'7,&%"NC
BOPQR!"-5&>3'#>3(#2D*
QPQR$/11'()"-#2*(&,"'7,&%"(C
Abbildung 4.2: Ein Color-Cube mit unterschiedlichen Seitenfarben, die die unterschiedlichen
orthogonalen Aufsichten approximieren
Color-Cubes
U/&1%'5"2*V012/&#(34%"*#"*-%&*W/475(%&2&,A#KXD*HH*YQQZ
4.1.2 Rendering
!"#$"%&#'
S,((3#,'*I#'>3%&
HEINZ NIXDORF INSTITUT
OT
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
Wie
Szene gerendert?
Fürwird
alledieOctree-Zellen,
deren
projizierte Größe kleiner als ein Schwellwert ε ist, wird der
Color-Cube
gezeichnet.
Ein7möglicher
Wert ist ε gleich ein Pixel zu setzen. Für alle Octree9 :;&*,11%*<=(&%%>?%11%"@*-%&%"*7&/A#B#%&(%*C&DE%*F1%#"%&*,1'*%#"*:%'(%&*
@
A
G=3H%11H%&(*!*#'(*IBJKJ*%#"*+#8%1L@*B%#=3"%*-%"*M/1/&>M5.%*I.1,5%*?%11%"L
Zellen, deren Projektion größer ist als ε wird die Geometrie gerendert. Das Vorgehen wird
von
Algorithmus 15 zusammengefasst und von Abbildung 4.3 graphisch illustriert.
9 :;&*,11%*<=(&%%>?%11%"@*-%&%"*7&/A#B#%&(%*C&DE%*2&DE%&*#'(@*B%#=3"%*-#%*
%"(3,1(%"% C%/4%(&#% I2&;"% ?%11%"L
%"(3,1(%"%*C%/4%(&#%*I2&;"%*?%11%"L
R/&1%'5"2*S012/&#(34%"*#"*-%&*M/475(%&2&,:#FT@*GG*UVVW
N,((3#,'*O#'=3%&
PQ
Abbildung 4.3: Rendering mit Color-Cubes. Für die grünen Zellen wird die Geometrie gerendert, für die blauen der Color-Cube gezeichnet und die roten liegen außerhalb
des Frustums.
4.1.3 Aufbau der Hierarchie
Der Aufbau der Color-Cube Hierarchie geschieht in drei Schritten:
1. Aufbau eines Octree und Verteilung der Dreiecke
2. Berechnung der Color-Cubes für die Blätter (initial)
AlgoCG 09
57
Kapitel 4. Replacement
Algorithmus 15 Rendering mit Color-Cubes
1: function R ENDER(Octreecell)
2:
if kein Teil der Octree-Zelle überlappt das Frustum then
3:
return
4:
end if
5:
if projizierte Größe der Octree-Zelle < ε then
6:
Rendere den Color-Cube der Octree-Zelle
7:
else if Octree-Zelle ist ein Blatt then
8:
Rendere die Geometrie der Zelle
9:
else
10:
for all Kinder der Octree-Zelle (in back-to-front-order) do
11:
Render(Kind)
12:
end for
13:
end if
14: end function
3. Berechnung der Color-Cubes für innere Knoten
Die Schritte 2 und 3 werden in einem Post-Order Durchlauf durch den Octree berechnet,
d.h. erst werden die Color-Cubes für die Kinder berechnet und dann der ColorCube für die
Eltern.
HEINZ NIXDORF INSTITUT
Color-Cubes
In Schritt
1 startet man mit einer Wurzelzelle, die die gesamte Geometrie
umfasst. An!"#$%&'#()(*+,-%&./&"
!"#$%"&'()&*+()%),-+(
schließend
werden die Dreiecke solange rekursiv auf die Kinder aufgeteilt,012/&#(34%"*5"-*6/471%8#()(
bis die Anzahl der
Dreiecke pro Zelle genügend klein ist. Die Anzahl ist genügend klein, wenn die RenderingBerechnung der Color-Cubes für die Blätter (initial)
zeit der Geometrie kleiner ist als die Renderingzeit der Color-Cubes aller Kinder. Diese Zeit
kann man experimentell bestimmen oder an Hand der Dreiecke abschätzen.
9:&*,11%*;*<%#(%"*-%&*=>(&%%?@%11%A
.%&%>3"%*%#"*D#1-*$/"*-%4*@%11%"#"3,1(*#"*/&(3/2&,73#'>3%&*+&/E%F(#/"*
4.1.3.1 BC
Berechnung
der initialen Farbwerte
G0 H1I' "2 J J +# %1 /-%& 2&IK%&L
G05H1I'5"2*J8J*+#8%1*/-%&*2&IK%&L
Die Berechnung wird für alle 6 Seiten der Octree-Zelle durchgeführt. Im ersten Schritt wird
MC .%&%>3"%*-%"*N5&>3'>3"#((*-%&*9,&.O%&(%*,11%&*2%&,'(%&(%"*+#8%1*-%'*D#1-%'
eine orthographische Projektion des Zelleninhalts auf eine Auflösung von 4 × 4 Pixel berechP ist .%&%>3"%*%#"%"*S!"'#>3(.,&F%#('O%&(
.%&%>3"%
%#"%" !"'#>3(.,&F%#('O%&(QA
-%&Durchschnitt
2#.( ," O#% $#%1
-%& +#8%1
net (mehrPC
auch möglich).
Anschließend wird A*-%&*2#.(*,"*O#%*$#%1*+&/R%"(*-%&*+#8%1*
der
der+&/R%"(
Farbwerte
aller gera-%&*<%#(%"H1)>3%*4#(*T%/4%(&#%*.%-%>F(*#'(
sterten Pixel des Bildes berechnet, sowie ein Unsichtbarkeitswert, der angibt, wie viel Prozent der Pixel
der Seitenfläche von Geometrie bedeckt sind. Dieser Wert wird als α-Wert des
JC '7%#>3%&%*-%"*U%&(*#4*0173,?U%&(*-%'*9,&.O%&('*GVTD0W*X&,"'7,&%"RL
Farbwertes für die Seitenfläche gespeichert. Abbildung 4.4 illustriert dieses Vorgehen.
Z/&1%'5"2*[012/&#(34%"*#"*-%&*\/475(%&2&,H#F]W*<<*M^^_
Y,((3#,'*9#'>3%&
MB
Abbildung 4.4: Berechnung des initialen Farbwerts eines Color-Cubes.
AlgoCG 09
58
Kapitel 4. Replacement
4.1.3.2 Berechnung der Farbwerte für innere Knoten
Der Farbwert des Color-Cubes für einen inneren Knoten wird aus den Farbwerten der ColorCubes der Kinder berechnet. Dazu betrachtet man auf jeder Seite der Octree-Zelle die entHEINZ NIXDORF INSTITUT
sprechenden Color-Cubes
Seiten der Color-Cubes der Kinder aus derselben Blickrichtung
(8 Farbwerte).
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
!"#$%"&'()&*+()%),-+(
Dabei wird von der vorne liegenden Box nach hinten durchgesehen und der Farbwert des vorderen Color-Cube
wird mit
direkt dahinterliegenden
Color-Cube gemittelt. Dabei muss
Berechnung
derdem
Color-Cubes
für interne Octree-Zellen
der Transparenzwert
α berücksichtigt werden. Die Farbe ergibt sich dann als
9:& ,11% ; <%#(%" -%& =>(&%%?@%11%A
9:&*,11%*;*<%#(%"*-%&*=>(&%%?@%11%A
BC
4#((1%*D%E%#1'*7,,&E%#'%*-%"*9,&.E%&(*-%&*$/&-%&%"*<%#(%*-%'*$/&"%*1#%2%"-%"*
c = α · cf g + (1 − α) · cbg
F/1/&?F5.%'*4#(*-%4*9,&.E%&(*-%&*<%#(%*-%'*-,3#"(%&1#%2%"-%"*F/1/&?F5.%'C*
wobei cf g die Farbe
des vorderen Würfels ist und cbg die Farbe des hinteren Würfels. Dieser
GC .%&:>H'#>3(#2%*-,.%#*-%"*I&,"'7,&%"JE%&(*!&A
.'7ECA*,.,
1&234genannt.
!50,$/ .JEC*>/47/'#(%*K/$%&L*",>3*M+/&(%&NO5PP*BQRST
Schritt wird auch „composite
over“
Aus den auf diese Weise ermittelten vier Farb#/ 0&!
werten wird dann
der- Durchschnitt
um1 die( P:Farbe
U wie
UC
. zuvor
.%&%>3"%*,5'*-%"*S*9,&.E%&(%"*-%"*9,&.4#((%1E%&(*P:&*-#%*<%#(%*-%'*J5*
3
S9 .
( berechnet
- 9 . #((
-# <für
#( die
- entsprechende
.%&%>3"%"-%"*F/1/&?F5.%'
Seite des Color-Cubes
zu erhalten. Abbildung 4.5 illustriert diesen Vorgang.
A
B
C
D
E
F
G
H
AE BF
CG DH
>/47/'#(%*K/$%&L
W/&1%'5"2*X012/&#(34%"*#"*-%&*F/475(%&2&,P#HYN*<<*GZZQ
O5&>3'>3"#((*:.%&*,11%*$#%&*+#8%1
V,((3#,'*9#'>3%&
GU
Abbildung 4.5: Berechnung des Farbwerts eines Color-Cubes für einen inneren Knoten.
4.1.4 Aufwandsabschätzung
Der Rendering Algorithmus benötigt Zeit O(log(n)). Für den Nachweis werden die beiden
folgenden, verfeinfachenden Annahmen getroffen:
1. Die Tiefe d des Octree ist d = O(log(n)), wobei n die Anzahl der Dreiecke ist.
2. Die maximale Anzahl geometrischer Primitive pro Blattzelle ist konstant.
Die Szene wird dann, wie in Abbildung 4.6 dargestellt, in einen Nahbereich und einen Weitbereich aufgeteilt. Im Nahbereich wird die vollständige Geometrie gerendert, im Weitbereich
nur Color-Cubes. Im Weitbereich erhält man mehrere Subfrusta i, die jeweils einer Ebene i
des Octrees entsprechen, deren projizierte Größe kleiner als ε ist. Die Color-Cubes können
unterschiedlich großen Bounding-Boxen entsprechen, je nachdem wie weit die Box entfernt
ist.
Da die Tiefe des Octree maximal O(log(n)) ist, erhält man auch nur maximal O(log(n))
Subfrusta im Weitbereich; eines für jeden Level des Octree. Die Anzahl der Zellen ist für
einen festen Level konstant und die Zeit für das Rendering eines Color-Cube ist ebenfalls
konstant. Damit erfolgt das Rendering aller Weitbereichszellen in O(log(n)). Die Anzahl der
Zellen ist konstant, da ein Octreeknoten immer eine feste Anzahl von Nachfolgern besitzt.
AlgoCG 09
59
bereich<*3#%&*=%&-%"*"5&*?/1/&@?5.%'*2%&%"-%&(
rustum i<*
Kapitel 4. Replacement
%&*B%&%#C3D*#"*-%4*"5&*E%11%"*-%'*?/1/&@?5.%'*$/"*FC(&%%@G.%"%*#*2%&%"-%&(*
%&-%"
%&%"*7&/H#I#%&(%*>&JK%*#'(
%#"%&*,1'*!*MINBN*O*+#8%1P
-
S,3.%&%#C3
Z
-@O
-@Q
-@R
9%#(.%&%#C3
3
V/&1%'5"2*W012/&#(34%"*#"*-%&*?/475(%&2&,;#LXD*YY*QZZ[
Q3
\3
]3
T,((3#,'*:#'C3%&
QU
Abbildung 4.6: Aufteilung in Nah- und Weitbereich für das Rendern der Szene.
Im Nahbereich ist die Anzahl der Blattzellen konstant. Zusammen mit der Annahme, dass
die Anzahl der Dreiecke in einer Zelle konstant ist, ergibt sich eine konstante Renderingzeit
von O(1) für den Nahbereich.
Der dritte Faktor sind die rekursiven Tests der Octree-Boxen gegen das View-Frustum. Sei
nun Fk der Teil des View-Frustum, der den Nahbereich und die Weitbereiche d, d − 1, . . . , k
enthält. Betrachte nun die 8 Geschwisterzellen auf Level k, die von der Render-Routine untersucht werden. Mindestens eines davon muss in Fk liegen. Sonst wäre die Elternzelle entweder gecullt worden oder ihr Color-Cube wäre gezeichnet worden. Fk enthält aber nur eine
Konstante Anzahl von Level-k Zellen, womit die insgesamt untersuchte Anzahl von Levelk Zellen konstant ist. Zusammen mit der Tiefe O(log(n)) ergeben sich maximal O(log(n))
getestete Zellen und die Gesamtlaufzeit folgt entsprechend.
Mit jedem Subfrustum, das man in Abbildung 4.6 nach rechts geht, verdoppelt sich die
Größe des Color-Cube. Dies liegt daran, dass die entsprechende Octree-Box weiter entfernt
ist und somit bereit die Box eines um 1 höheren Levels kleiner als ist.
4.1.5 Bildqualität
Bei der Verwendung einer sehr feinen Geometrie erscheinen Bilder mit Color-Cubes „glatter“ als vollständig gerenderte. Durch die Filterung der Geometrie auf verschiedenen Stufen
entsteht eine Art Antialiasing Effekt.
Allgemein muss man bei der Bildqualität zwischen „guten Szenen“ und „schlechten Szenen“ für das Rendering mit Color-Cubes unterscheiden. Eine gute Szene hat Primitive, die
im Vergleich zu den Color-Cubes klein sind und zufällig verstreut (unkorreliert) liegen. Bei
einer schlechten Szene hat man große Primitive im Vergleich zur Größe der Color-Cubes und
lange, zusammenhängende Oberflächen. Bei schlechten Szenen können Artefakte entstehen.
Betrachte dazu das Beispiel in Abbildung 4.7.
AlgoCG 09
60
9#:3( $/" /.%";
9#:3(*$/"*</.%"
= >%-%*?%11%*#'(*$/11'()"-#2*5"-5&:3'#:3(#2
@!"-5&:3'#:3(#2A%#(*BCDE
Kapitel 4. Replacement
HEINZ NIXDORF INSTITUT
Color-Cubes
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
!"#$%&'#$(
Artefakte
9#:3( $/" 1#";'<
9#:3(*$/"*=1#";'
BCD BCD BCD BCD BCD
> ?5&*@%11%"*4#(*A1,:3%4*?%#25"2'B#";%1*'#"-*$/11'()"-#2*5"-5&:3'#:3(#2
BCD
C!"-5&:3'#:3(#2;%#(*DEFG
BCD
> @%11%"*4#(*'(%#1%4*?%#25"2'B#";%1*'#"-*"5&*7,&(#%11*$%&-%:;(
C!"-5&:3'#:3(#2;%#(*CFEHI*FEJG
(a)
FEH
FEJ FEJ
FEJ FEJ
J/&1%'5"2*K012/&#(34%"*#"*-%&*L/475(%&2&,M#ANO*99*PDDQ
HI
F,((3#,'*G#':3%&
DEF
DEF
(b)
N/&1%'5"2*O012/&#(34%"*#"*-%&*P/475(%&2&,A#;QI*99*JFFR
HM
K,((3#,'*L#':3%&
Abbildung 4.7: Artefaktbildung bei langen, gekrümmten Oberflächen, in der Aufsicht ((a))
sind die Color-Cubes undurchsichtig, von der Seite ((b)) erscheinen sie teilweise transparent.
In der Aufsicht von oben ist jede Zelle vollständig undurchsichtig,
da sie
vollständig durch
HEINZ NIXDORF
INSTITUT
Color-Cubes
das Dreieck !"#$%&'#$
ausgefüllt wird. Von der Seite sind einige Zellen nicht vollständig durch die
Oberfläche abgedeckt. Die Color-Cube werden deshalb mit einem Undurchsichtigkeitswert
von 0, 2 bis 0,Artefakte
3 belegt und erscheinen transparent. Dadurch kann es passieren, dass der Hin9#:3(
9#:3(*$/"*A':3&)2
$/" ':3&)2;
<=> ?&,-@
tergrund durchscheint.
Bei *<=>*?&,-@
einer
schrägen, seitlichen Sicht ergibt sich das Problem, dass zwei
Problem
Seiten des Color-Cubes zu sehen sind. Davon eine undurchsichtige und eine transparente. Es
CD%# 9%#(%"
CD%#*9%#(%"*-%'*E/1/&FE5.%'*'#"-*C5*'%3%"
-%' E/1/&FE5.%'
'#"-in
C5der
'%3%"
kann passieren,B dass
transparente
Löcher
Oberfläche entstehen, wie in Abbildung 4.8
<%#"%*5"-5&:3'#:3(#2G*%#"%*4#(*H&,"'7,&%"C@
dargestellt. Die Oberfläche wirkt dann an einigen Stellen heller, falls sich die benachbarten
B -#%*(&,"'7,&%"(%"*I.%&1,2%&"*'#:3*"#:3(*$/11'()"-#2
transparenten Color-Cubes nicht genügend überdecken.
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
B 4,"*'#%3(*-5&:3G*%'*%"('(%3%"*JK:3%&
P/&1%'5"2*Q012/&#(34%"*#"*-%&*E/475(%&2&,R#STG*99*UVVW
L,((3#,'*M#':3%&
NO
Abbildung 4.8: Schräge Aufsicht auf gekrümmte Oberfläche aus Color-Cubes kann zu Löchern führen.
Ein weiteres Problem entsteht, wenn undurchsichtige Geometrie und transparente ColorCubes nebeneinander gezeichnet werden, wie dies in Abbildung 4.9 dargestellt ist.
AlgoCG 09
61
re Artefakte
Kapitel 4. Replacement
9,'*7,''#%&(>*?%""*:%/4%(&#%*;5"-5&@3'#@3(#2<*5"-*
9
# (
:
( # ; - 3 # 3(# < ,"'7,&%"(%*A/1/&BA5.%'*"%.%"%#","-%&*2%C%#@3"%(*
?%&-%"D
E%#3%"F/12%*#'(*%"('@3%#-%"-G
!"-5&@3'#@3(#2%*:%/4%(&#%*$%&-%@H(*(&,"'7,&%"(%*
#8%1
em
E%#3%"F/12%*H,""*'#@3*-5&@3*H1%#"%*+/'#(#/"'?%@3'%1*
"-%&"I
"(?%-%&*$%&-%@H(*-#%*:%/4%(&#%*-%"*A/1/&BA5.%*
( - H(Abbildung
-# :
( 4.9:
# - Artefaktbildung
A 1 A .
Geometrie.
/11'()"-#2>
durch benachbarte Zeichnung von Color-Cube und
2
-%&*-%&*A/1/&BA5.%*K.%&1,2%&(*-#%*:%/4%(&#%I
In diesem Fall ist die Reihenfolge entscheidend, da die undurchsichtige Geometrie den
transparenten Pixel verdeckt. Das Problem
ist, dass sich
die Reihenfolge durch einen PoNO
L,((3#,'*M#'@3%&
sitionswechsel ändern kann. Entweder wird der Color-Cube vollständig von der Geometrie
verdeckt, oder der Color-Cube überlagert die Geometrie.
P/&1%'5"2*Q012/&#(34%"*#"*-%&*A/475(%&2&,F#HR>*SS*TUUV
4.2 Hierarchical Image Caching
Bei einem Walkthrough bewegt man sich typischerweise auf einem Pfad durch eine Szene.
Dabei haben die aufeinanderfolgenden Bilder auf diesem Pfad eine hohe zeitliche Kohärenz.
Die Grundidee von Hierarchical Image Caching besteht darin, benachbarte Objekte in eine
Textur zu rendern und diese Textur für die nachfolgenden Bilder zu verwenden. Die Objekte
werden erst dann neu gerendert, wenn sich die Kameraposition zu weit entfernt hat. Abbildung
4.10 illustriert dieses Vorgehen.
An Stelle der Objekte wird die Textur auf ein Rechteck gelegt. Das Rechteck wird dann mittig in die Boundingbox des Knotens in der Hierarchie gesetzt. Bei einer leichten Bewegung
der Kameraposition wird das Rechteck entsprechend mit bewegt. Auf diese Weise lassen sich
Parallaxe Fehler reduzieren, aber nicht vermeiden. Eine Parallaxe ist eine scheinbare Positionsänderung eines Objektes, die durch die Änderung der Position des Beobachters verursacht
wird.
Ein Caching einzelner Objekte wird typischerweise nicht durchgeführt, da die Anzahl der
Objekte und damit die Anzahl der Texturen zu groß wäre. Die Szene wird in Form eines
BSP-Baums aufbereitet, dessen Blätter jeweils eine konvexe Region des Raumes darstellen.
In jedem (inneren) Knoten der Hierarchie kann nun eine Textur gespeichert werden, die einem
Blick auf die im Knoten enthaltenen Objekte entspricht. Das Rendering muss dann in back-tofront-order durchgeführt werden, da sich einzelne Texturen überlappen können und Texturen
teilweise transparent sind.
Das Rendering besteht in jedem Frame aus zwei Durchläufen, die in den folgenden Unterabschnitten beschrieben werden.
AlgoCG 09
62
Hierarchical Image Caching
!"##
HEINZ NIXDORF INSTITUT
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
Kapitel 4. Replacement
Idee des Verfahrens
9 &%"-%&%
&%"-%&%*.%",:3.,&(%*;.<%=(%*#"*%#"%*
.%",:3.,&(% ;.<%=(% #" %#"%
>%8(5&
9 $%&?%"-%*-#%*>%8(5&*@A&*",:3@/12%"-%*
B#1-%&
9 &%"-%&%*-#%*;.<%=(%*%&'(*?#%-%&C*?%""*-#%*
6,4%&,7/'#(#/" '#:3 $/" -%&
6,4%&,7/'#(#/"*'#:3*$/"*-%&*
5&'7&A"21#:3%"*+/'#(#/"*D5*?%#(*%"(@%&"(
I/&1%'5"2*J012/&#(34%"*#"*-%&*K/475(%&2&,@#=LC*MM*NOOP
E,((3#,'*F#':3%&
GH
Abbildung 4.10: Objekte werden in eine Textur gerendert und erst bei großer Kameraverschiebung neu gerendert.
4.2.1 Erster Rendering Durchlauf
Im ersten Durchlauf wird ein Culling der Knoten außerhalb des Frustums durchgeführt und
der Image Cache aktualisiert. Dabei werden alle Knoten aktualisiert, für die die Fehler in
der Textur zu groß sind. Diese Überprüfungen werden vom Algorithmus U PDATE C ACHES
ausgeführt.
Die Funktion UpdateNode() berechnet, ob die Geometrie gezeichnet wird oder ob es sich
lohnt, einen Cache anzulegen. Die Geometrie wird immer gezeichnet, wenn der Beobachter
im Knoten steht. Sonst werden die Kosten zum Zeichnen der Geometrie mit den Kosten
zur Erstellung des Caches verglichen. Beide Werte werden experimentell bestimmt (Werte
hängen auch von der konkreten Hardware ab). Die Funktion UpdateNode() beschreibt der
nachfolgende Algorithmus 17.
Die Funktion CreateCache() legt die gecachete Textur an. Dazu wird zunächst die achsenparallele Boundingbox des BSP-Knotens im Bildraum berechnet. Dazu werden wie gehabt
die Eckpunkte der Box in den Bildraum projiziert und die Minima/Maxima betrachtet. Anschließend wird der Knoten gezeichnet. Für ein Blatt wird dazu die Geometrie gezeichnet, für
einen inneren Knoten werden die Kinder gezeichnet. Das Bild wird dann als Textur im Cache
des Knotens gespeichert. Für einen inneren Knoten muss nicht die vollständige Geometrie
gezeichnet werden. Stattdessen können beim Zeichnen auch Texturen der Kinder verwendet
werden.
AlgoCG 09
63
Kapitel 4. Replacement
Algorithmus 16 Aktualisierung des Image Caches
1: function U PDATE C ACHES(node, viewpoint)
2:
if node außerhalb des Frustum then
3:
node.status := CULL
4:
else if node.cache ist für viewpoint noch gut genug then
5:
node.status := DRAWCACHE
6:
else if node ist Blatt then
7:
UpdateNode(node, viewpoint)
8:
else
. Erst Kinder aktualisieren, dann den Knoten selbst
9:
UpdateCaches(node.back, viewpoint)
10:
UpdateCaches(node.front, viewpoint)
11:
UpdateNode(node, viewpoint)
12:
end if
13: end function
4.2.2 Zweiter Rendering Durchlauf
Im zweiten Durchlauf wird der BSP-Baum erneut durchlaufen. Dieses mal jedoch in back-tofront-order. Dabei wird entweder die Geometrie oder die Textur für einen Knoten gezeichnet.
Dabei werden die im ersten Durchlauf vergebenen Zustände verwendet. Das Zeichnen wird
von der Funktion Render ausgeführt, die Algorithmus 18 zusammenfasst.
4.2.3 Partitionierung der Szene
Die Szene wird mit einem 3D BSP-Baum partitioniert. Das Bild für eine Zelle wird als Textur
gespeichert und auf ein Rechteck gerendert. Dabei sind die Ziele der Partitionierung:
1. So wenige Objekte wie möglich zerteilen
Geteilte Objekte werden möglicherweise durch unterschiedliche Texturen dargestellt,
wodurch visuelle Artefakte entstehen können.
2. Die hierarchische Aufteilung bestmöglich balancieren.
Man erhält dadurch eine bessere Performance und ein besseres Frustum Culling.
3. Das Seitenverhältnis jedes Knotens sollte möglichst 1 sein.
Boundingboxen mit ausgewogenem Seitenverhältnis sind länger gültig.
Die Splittingebenen werden zwischen die Objekte gelegt. Dabei sollen möglichst wenige
Objekte geschnitten werden, wie in Abbildung 4.11 dargestellt. Mit den entstandenen Mengen
wird rekursiv weiter verfahren.
Um das Finden der Splittingebenen zu vereinfachen, legt man N Richtungen fest und nutzt
Splittingebenen, die senkrecht zu diesen Richtungen stehen. Ein Möglichkeit besteht darin,
die x-, y- und z-Achse als Richtungen zu nehmen und damit die yz-, die xz und die xy-Ebene
als Splittingebenen zu benutzen. Im Rahmen dieser Vorlesung werden Landschaftsszenen
als Zielszenen betrachtet. Die haben ein großes Oberflächennetz, auf dem die Objekte, z.B.
AlgoCG 09
64
Kapitel 4. Replacement
Algorithmus 17 Aktualisierung eines Knotens
1: function U PDATE N ODE(node, viewpoint)
2:
if viewpoint innerhalb von node then
3:
if node ist Blatt then
4:
node.status := DRAWGEOM
5:
else
6:
node.status := RECURSE
. Rekursiv auf Kindern berechnen
7:
return
8:
end if
9:
end if
10:
k := EstimateCacheLifeSpan(node, viewpoint) . Schätzt die Anzahl der Frames ab,
für die sich das Caching lohnt
11:
amortizedCost := „cost to create cache“ / k + „cost to draw cache“
. amortisierte
Kosten
12:
if amortizedCost < „cost to draw contents“ then
. Caching lohnt sich
13:
CreateCache(node, viewpoint)
14:
node.status := DRAWCACHE
15:
node.drawingCost := „cost to draw cache“ . Kosten für das Zeichnen der Textur
16:
else
. Caching lohnt sich nicht
17:
if node ist Blatt then
18:
node.status := DRAWGEOM
19:
node.drawingCost := „cost to draw geometry“ . Kosten für eigene Geometrie
20:
else
21:
node.status := RECURSE
HEINZ NIXDORF INSTITUT
Hierarchical Image Caching
!"#$%&'#()(*+,-%&./&"
22:
node.drawingCost
:=
node.back.drawingCost
+
node.front.drawingCost
.
012/&#(34%"*5"-*6/471%8#()(
!"#$#%&'('()*(+&,*-./+&.0(&',+11+*."2+*+
Kosten der Kinder
23:
end
if
Wie partitionieren
wir den 3D BSP-Baum?
24:
end if= >#&*1%2%"*-#%*971#((#"2%.%"%"*?>#'@3%"
# 1
-# 9 1#((#
.
# 3 -#%*:.;%<(%
-# :.; <(
25: end function
= 4A21#@3'(*/3"% :.;%<(%*?5*'@3"%#-%"B
= 4#(*-%&*C%"2%*-%&*2%(%#1(%"*:.;%<(%*$%&D,3&%"*>#&*&%<5&'#$
4#( -%& C%"2% -%& 2%(%#1(%" :.;%<(% $%&D,3&%" >#& &%<5&'#$
Abbildung 4.11: Wahl der Splittingebenen.
H/&1%'5"2*I012/&#(34%"*#"*-%&*J/475(%&2&,D#<KL*99*MNNO
AlgoCG 09
C,((3#,'*E#'@3%&
FG
65
Kapitel 4. Replacement
Algorithmus 18 Zeichnen der Geometrie und der Texturen
1: function R ENDER(node, viewpoint)
2:
if node.status == CULL then
3:
return
4:
else if node.status ∈ { DRAWCACHE, DRAWGEOM } then
5:
Draw(node)
6:
else if node ist vor der node.splittingplane then
7:
Render(node.back, viewpoint)
8:
Render(node.front, viewpoint)
9:
else
10:
Render(node.front, viewpoint)
11:
Render(node.back, viewpoint)
12:
end if
13: end function
Bäume oder Häuser, aufgestellt sind. Die Objekte stehen alle auf der xz-Ebene,
allerdings mit
HEINZ NIXDORF INSTITUT
HEINZ NIXDORF INSTITUT
Hierarchical
Image
Caching
HEINZ NIXDORF INSTITUT
ical Image Caching
!"#$%&'#()(*+,-%&./&"
Hierarchical
Image Caching
unterschiedlichen
Höhenwerten.
Damit sind !"#$%&'#()(*+,-%&./&"
alle Splittingebenen senkrecht zur
xz-Ebene (die
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
!"#$#%&'('()*(+&,*-./+&.0(&',+11+*."2+*+
012/&#(34%"*5"-*6/471%8#()(
012/&#(34%"*5"-*6/471%8#()(
()*(+&,*-./+&.0(&',+11+*."2+*+
!"#$#%&'('()*(+&,*-./+&.0(&',+11+*."2+*+
verwendeten
Richtungen sind die x- und die
z-Achse. Das Verfahren benötigt
keine Informationen über die semantische Definition von Objekten und ist nicht auf einen bestimmten Typ
Wie
berechnen
wirwir
diedie
Splittingebenen?
Wie
Ebene mit den wenigsten Schnitten?
von
Szene
festgelegt.
der * Richtungen
(bei
uns
2):finden
? #4*9@,"A1#"%A:%&;,3&%"*1,5;%*<%B%#1'*=.%&*%#"%*>#'(%
# 9
1# : ; 3
1 ; <
#1 =.
# ># (
52%*;<%#*'/&(#%&(%*9#'(%"
#
(# ( 9# (
4.2.4
Berechnung
der Splittingebenen
? C)31%*-#%*2%&,-%*2%'@3"#((%"*D.<%E(%*FG*H,E(#$%*D.<%E(%IJ
9,'*7,''#%&(:*;%""*;#&*<%#"%*=71#((#"2%.%"%*>#"-%":*
*'7%#=3%&(*-#%*5"(%&%
>%2&%";5"2*-%'*?.@%A(%'
/3"%*?.@%<(%*A5*'B3"%#-%"C
@ ? .%&%@3"%*,11%*K"(%&$,11%*4#(*-%"*B%"#2'(%"*H,E(#$%"*D.<%E(%"
.%&%@3"%
,11%?.@%A(%'
K"(%&$,11%
4#( -%"
B%"#2'(%"
,E(#$%"
D.<%E(%"I
passieren,
dass keine
Splittingebene
gefunden
werden
kann,
die keine Objekte zerteilt.
<%#(%
<%#(%*'7%#=3%&(*-#%*/.%&%
'7%#=3%&( Es
-#%kann
/.%&%
>%2&%";5"2
>%2&%";5"2*-%'*?.@%A(%'
-%'
Für jede der N Richtungen (in diesem Fall 2 bei der Landschaftsszene) werden 2 sortierte
Listen erzeugt. Eine speichert die untere Begrenzung des Objektes, die andere die obere
L5')(C1#@3 '/11(% -#% 05;(%#15"2 #" CB%# 21%#@3 2&/M% N%"2%" %&;/12%"
L5')(C1#@3*'/11(%*-#%*05;(%#15"2*#"*CB%#*21%#@3*2&/M%*N%"2%"*%&;/12%"
Begrenzung. Abbildung 4.12 zeigt ein Beispiel dafür.
O,' #'( <%-/@3 "#@3( #44%& 4P21#@3Q
O,'*#'(*<%-/@3*"#@3(*#44%&*4P21#@3Q
(a)
(b)
(c)
N,((3#,'*R#'@3%&
:/&1%'5"2*U012/&#(34%"*#"*-%&*V/475(%&2&,;#EWX*99*YZZ[
B,((3#,'*C#'=3%&
ST
DE
FF
D,((3#,'*E#'B3%&
G/&1%'5"2*H012/&#(34%"*#"*-%&*I/475(%&2&,>#<J:*==*KLLM
Abbildung 4.12: Berechnung
der Splittingebenen. (a) zeigt die Ausgangssituation,
(b) die beiden Listeneinträge und (c) den Korridor mit den wenigsten geschnittenen
Objekten.
F/&1%'5"2*G012/&#(34%"*#"*-%&*H/475(%&2&,I#AJK*LL*MNNO
Anschließend wird im Scan-line Verfahren über jeweils eine Liste gegangen. Dabei werden
die gerade geschnittenen Objekte (= aktive Objekte) gezählt. Auf diese Weise werden alle
AlgoCG 09
66
Kapitel 4. Replacement
Intervalle mit den wenigsten geschnittenen Objekten ermittelt. Eine Anforderung war, dass
die Aufteilung möglichst in zwei gleich große Mengen erfolgen soll. Dies ist jedoch nicht
immer möglich. Stattdessen wird eine Funktion aus Anzahl der geschnittenen Objekte und
dem Verhältnis der Aufteilung berechnet. Die Heuristik beschreibt einen Trade-off zwischen
beiden Faktoren, in dem immer der minimale Funktionswert genommen wird.
Über die zusätzliche Heuristik, immer die längere von beiden Seiten zu schneiden, erhält
man zudem ein relativ ausgeglichenes Seitenverhältnis.
4.2.5 Fehlermetrik
Die Fehlermetrik soll zwei Fragen beantworten, die für die Leistungsfähigkeit des Hierarchical
Image Cache von grundlegender Bedeutung sind.
1. Für einen gegebenen Knoten in der Hierarchie und seine Textur im Cache: Ist die Textur
HEINZ NIXDORF INSTITUT
auch Caching
für die aktuelle Kameraposition eine gute Approximation?
Hierarchical Image
!"#$%&'#()(*+,-%&./&"
!"#$"%&"'%()
2. Für einen gegebenen Knoten in der Hierarchie und eine 012/&#(34%"*5"-*6/471%8#()(
Kameraposition: Wie lange
wird eine neu berechnete Textur gültig sein?
9/*1#%2%"*-#%*+5":(%;*-#%*%#"%"*<%31%&*%&=%52%";*-%&*2&>?%&*,1'*
HEINZ NIXDORF INSTITUT
aching
Die Metrik soll einen Unterschied
zwischen der Textur im Cache und der gerenderten Geo!"#$%&'#()(*+,-%&./&"
%#"*@A3B%11B%&(*! #'(C
012/&#(34%"*5"-*6/471%8#()(
metrie quantifizieren. Ist der
Unterschied kleiner als ein Schwellwert ε, dann ist die Textur
noch gültig. Da diese Berechnung zur Laufzeit für sehr viele Texturen ausgeführt wird, muss
sie schnell zu berechnen sein.
+,- 4#''(*-,'*
# (!011%*+5":(%*21%#A3*!
?.%&*,11%
1#%2%"*,5D*=B%#*6&%#'%"*4#(*E,-#5'*%
%'*6"/(%"'*
F
C*****@+&/D%>(#/"*$/"*
,*,5E*-#%*F%8(5&B
!
-%'*6"/(%"'B
5"-*H#((%175":(*+, #'(*
$
G%&*6&%#'*4#(*E,-#5'**
%#"*I%#1*-%&*@#A3%&3%#('=/"%
$G
%.%+,0schnell eine
?
3
&
-
@"%5%*+/'#(#/"B
%+,0E?&*,11%*M*
2A/8 -%'*6"/(%"'
$J
$H*
@+/'#(#/"I*$/"*-%&*F%8(5&
,5E2%"/44%"*J5&-%*B
(a)
-,'
-,'*<,8#454
<,8#454
4%"*#"*-%&*S/475(%&2&,E#>TI*UU*VHHW
,
!
,**@+/'#(#/"*#""%&3,1.*
(b)
Abbildung 4.13: Fehlermetrik für das Hierarchical Image
Caching.
H,((3#,'*<#'A3%&
M/&1%'5"2*N012/&#(34%"*#"*-%&*O/475(%&2&,D#:P;*@@*QJJR
<,((3#,'*9#'L3%&
OP
KL
Abbildung 4.13(a) zeigt die Berechnung der Error()-Funktion. Die Textur wurde von der
Position v0 aus gerendert und wird jetzt von v1 aus betrachtet. Der Betrachter sieht in Richtung
des Punktes a innerhalb der Bounding-Box des Knotens. Dieser Punkt a wird jedoch auf den
AlgoCG 09
67
Kapitel 4. Replacement
Punkt ã der Textur abgebildet. Durch entsteht ein Winkel θ um den der Punkt verschoben
wird. Je weiter der Punkt verschoben wird, desto stärker ist der Bildfehler. Die Funktion
Error(v, v0 ) = max θ(a, v, ã)
a
beschreibt nun den maximalen Winkel, den θ nach Betrachtung aller Punkte innerhalb der
Bounding-Box annehmen kann. Um die Berechnung zu Beschleunigen, wird die Funktion
nur für die 8 Eckpunkte berechnet und es wird dann das Maximum dieser 8 Werte betrachtet.
Die Abschätzung der Gültigkeit der Textur erfolgt nun unter der Annahme, dass die Geschwindigkeit und Beschleunigung des Betrachters bekannt sind. Außerdem lässt sich feststellen, dass der Betrachter in kurzen Zeiträumen dann nur kleine Entfernungen zurücklegt. Es
wird nun eine sogenannte Sicherheitszone um eine Position herum definiert, in der der Fehler
kleiner als ε ist. Solange sich der Betrachter innerhalb dieser Sicherheitszone aufhält, ist die
Textur gültig. Die Zone ist definiert als
Saf etyZone(v0 ) ⊆ {v|Error(v, v0 ) ≤ ε}
Je kleiner man nun ε wählt, desto kleinere, abweichende Winkel sind zulässig. Dadurch
ist die Textur näher an der gerenderten Architektur. Zusammen mit der aktuellen Geschwindigkeit und der Beschleunigung der Beobachters und den Maximalwerten für beide Größen
kann man nun die Gültigkeit der Textur daran ausrechnen, wie lange sich der Beobachter in
der Sicherheitszone aufhält. Abbildung 4.13(b) zeigt eine solche Sicherheitszone.
In der Graphik bezeichnet wie zuvor v0 den Standpunkt, von dem aus die Textur berechnet
wurde. Der Punkt a ist ein Punkt aus der Bounding-Box und ã ist die Projektion auf die Textur.
Der Abstand zwischen v0 und a wird mit h bezeichnet. Alle Standpunkte v, von denen der
maximale Winkel ε gilt, liegen auf zwei Kreisen mit Radius
||a − ã||
2 · sin ε
Dabei bezeichnet ||a − ã|| den Abstand zwischen den Punkten a und ã. Man erhält mit
dieser Strecke aus dem Sinussatz den Zusammenhang 2r = ||a−ã||
und damit den Radius der
sin ε
grauen Kreise.
Der weiße Kreis mit Radius d beschreibt nun die Sicherheitszone innerhalb der die Textur
gültig ist. Der Radius d der Sicherheitszone wird über die Strecke d + r berechnet, von der
dann r abgezogen wird. Man erhält damit für d:
√
d = h2 + r2 + 2hr sin ε − r
r=
Der Wert für d wird nun für alle 8 Ecken der Bounding-Box berechnet und für a in die
Gleichungen eingesetzt. Für einen inneren Knoten wird die Sicherheitszone für die BoundingBox des Knoten berechnet und dann gegen die Bounding-Boxen der Kinder geschnitten.
• [TODO:Wie kommt die Formel für d zustande?]
4.2.6 Artefakte
Es kann passieren, dass der Hintergrund durchscheint.
AlgoCG 09
68
HEINZ NIXDORF INSTITUT
Paralleles Rendering als Sortierproblem
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
Paralleles Rendering
Renderingprozess besteht aus zwei
Hauptschritten
9 :%/4%(&#%(&,"';/&4,(#/"
5 Paralleles Rendering
9 <,'(%&5"2
Das Rendering besteht aus zwei Hauptschritten: :%/4%(&#%(&,"';/&4,(#/"*=>!?>
der Geometrietransformation und der Rasterung.
Diese
Schritte
zeigt
Abbildung
5.1.
Dabei
ist die Reihenfolge der Polygone bei der
Sequentielle Berechnung
HEINZ NIXDORF INSTITUT
ls Sortierproblem
!"#$%&'#()(*+,-%&./&"
Berechnung beliebig, da das
Ergebnis von der konkreten Reihenfolge unabhängig ist.
012/&#(34%"*5"-*6/471%8#()(
9 <%#3%";/12%*-%&*+/1@2/"%*#'(*;A&*-#%*
B%&%C3"5"2*.%1#%.#2
ht aus zwei
9 D&2%."#'*$/"*-%&*<%#3%";/12%*5",.3)"2#2
D&2%."#' $/" -%& <%#3%";/12% 5",.3)"2#2
/"
g
/"%*#'(*;A&*-#%*
:%/4%(&#%(&,"';/&4,(#/"*=>!?>
<,'(%&5"2
(a)
(b)
HEINZ NIXDORF INSTITUT
Paralleles Rendering als Sortierproblem
!"#$%&'#()(*+,-%&./&"
Abbildung
5.1:
Die
Hauptschritte
des
Rendering.
G
E,((3#,'*F#'C3%&012/&#(34%"*5"-*6/471%8#()(
Paralleles Rendering
H/&1%'5"2*I012/&#(34%"*#"*-%&*J/475(%&2&,;#KLM*NN*?OOP
%";/12%
%";/12%*5",.3)"2#2
5",.3)"2#2
"*-%&*J/475(%&2&,;#KLM*NN*?OOP
Dies
erlaubt
es, die wir
Geometrietransformation
und die Rasterung parallel mit mehreren GeoWas
verstehen
unter parallelen Rendering?
metrieeinheiten bzw. mehreren Rasterungseinheiten auszuführen wie in Abbildung 5.2 darge9 :%/4%(&#%(&,"';/&4,(#/"*<#&-*7,&,11%1*,5'2%;=3&(*
:%/4%(&#%(&,"';/&4,(#/"
<#&- 7,&,11%1
stellt. Dies
nennt man paralleles Rendering.
Da ,5'2%;=3&(
die Reihenfolge, in der die Dreiecke verarbei>4%3&%&%*:%/4%(&#%%#"3%#(%"?
tet werden, in beiden Schritten unabhängig von der Reihenfolge ist und keine Abhängigkei9 @,'(%&5"2*<#&-*7,&,11%1*,5'2%;=3&(*
ten zwischen
den einzelnen
Berechnungen bestehen, ist das ohne Probleme möglich. Unter<,'(%&5"2
>4%3&%&%*@,'(%&5"2'%#"3%#(%"?
schiedliche Z-Werte werden über den Z-Buffer Algorithmus aufgelöst, der auch die unabhängige Verarbeitung der Dreiecke unterstützt.
E,((3#,'*F#'C3%&
G
E/&1%'5"2*F012/&#(34%"*#"*-%&*G/475(%&2&,;#HIJ*KK*LMMN
A,((3#,'*B#'C3%&
Abbildung 5.2: Parallelisierte Rendering Architektur.
69
D
Kapitel 5. Paralleles Rendering
Im Folgenden sollen verschiedene Möglichkeiten vorgestellt werden, diese parallele Berechnung zu organisieren.
5.1 Paralelles Rendering als Sortierproblem
Jeder Prozessor erhält einen Teil der Geometrie und einen Teil der zu rendernden Pixel. Dabei
gibt es folgende Annahmen:
• Vor der Berechnung eines Bildes sind die Objekte beliebig über alle Prozessoren verteilt
gespeichert
• Die Objekte sind ohne Redundanz gespeichert, d.h. jedes Objekt ist auf genau einem
Prozessor.
• Die Objekte sind beliebig im 3D Raum platziert und erscheinen standpunktabhängig an
beliebigen Stellen des Bildschirms.
• Falls die Objekte abstrakt beschrieben sind, müssen sie noch in Dreiecke zerlegt werden
(tesselieren).
Initial muss eine solche Verteilung von Objekten auf Prozessoren jedoch erst einmal berechnet werden. Dabei soll ein Load Balancing zwischen den einzelnen Prozessoren stattfinden, um die Effizienz zu erhöhen. Da Geometrietransformation und Rasterung unabhängig
von einander arbeiten, kann eine Sortierung, d.h. Verteilung oder Zuordnung der Objekte an
die Stelle des Bildschirm, an der sie dargestellt werden, zu drei Zeiten geschehen:
• Sort-First, d.h. vor der Geometrietransformation.
• Sort-Middle, d.h. zwischen Geometrietransformation und Rasterung
• Sort-Last, d.h. nach der Rasterung
5.1.1 Sort-First
Vor der Bildberechnung sind die Objekte beliebig auf Prozessoren verteilt. Sie werden vor der
Geometrietransformation auf die Prozessoren verteilt (sortiert). Damit werden die Objekte im
3D Objektraum verteilt. Dazu wird der Bildschirm in disjunkte Bereiche, „Kacheln“ genannt,
unterteilt. Dabei sind verschiedene Aufteilung möglich, wie in Abbildung 5.3 dargestellt.
Jeder Prozessor ist zuständig für eine Kachel und führt sowohl die Geometrietransformation als auch die Rasterung für diese Kachel durch. Die Objekte werden über das Netzwerk
zu den Prozessoren geschickt. Jeder Prozessor erzeugt dann ein Teilbild für die Kachel für
die er zuständig ist. Für die Darstellung des Bildes im dritten und letzten Schritt müssen die
so entstandenen Einzelbilder dann wieder zusammengefügt werden. Es existieren Hard- und
Softwarelösungen für dieses Problem, das in Abbildung 5.4 dargestellt ist. Bei einer Softwarelösung müssen die Einzelbilder über das Netzwerk an einen Prozessor dargestellt werden,
der das Gesamtbild zusammenstellt.
AlgoCG 09
70
Kapitel 5. Paralleles Rendering
,<3'%"7,&,11%1%*6,<3%1"
Paralleles Rendering als Sortierproblem
Sort-First
@.%1#%.#2%J*6,<3%1"*4K21#<3
HEINZ NIXDORF INSTITUT
P3
P1
Schritt 3: Darstellung des Bildes
P4
9 :5',44%"'%(;5"2*-%&*%#";%1"%"*
2
<%#1.#1-%&*"%.%"%#","-%&
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
P4
P1
P2
P1
P2
P2
P3
P3
9 -,=>&*2#.(*%'*?,&-@,&%A 5"-*
L,((3#,'*M#'<3%&
P/&1%'5"2*Q012/&#(34%"*#"*-%&*R/475(%&2&,:#>SF*EE*TUUV
Sort-First Ansatz.
B/=(@,&%1C'5"2%" Abbildung 5.3: Aufteilung in Kacheln beim P4
9 22='D*4>''%"*-#%*<%#1.#1-%&*E*6,F3%1"*
>.%&*-,'*G%(;@%&H*;5*%#"%4*
+&/;%''/&J*-%&*-,'*I%',4(.#1-*
I
-,&'(%11(J*2%'F3#FH(*@%&-%"*
KB/=(@,&%1C'5"2L
P1
P3
P1
P4
NO
P2
P2
P3
P4
Q/&1%'5"2*R012/&#(34%"*#"*-%&*S/475(%&2&,=#HTJ*BB*UVVW
M,((3#,'*N#'F3%&
OP
Abbildung 5.4: Berechnung und Zusammensetzung der Einzelbilder beim Sort-First Ansatz.
Der Sort-First Ansatz hat jedoch einige Probleme, die in Abbildung 5.5 dargestellt sind.
Die Zuteilung der Polygone auf die Geometrieprozessoren sollte gleichmäßig erfolgen, sonst
laufen einige Prozessoren leer. Dies ist wie in Abbildung 5.5 (a) dargestellt aber je nach Szene
nicht einfach zu erreichen.
Ein größeres Problem sind Polygone, die in mehrere Bildbereiche fallen und somit von
mehreren Prozessoren bearbeitet werden müssen, wie in Abbildung 5.5 (b) dargestellt.
Das dritte Problem besteht darin, dass auch bei einer gleichmäßigen Verteilung von Objekten auf die einzelnen Prozessoren die Last unterschiedlich verteilt sein kann. Dies liegt daran,
dass der Aufwand für Geometrietransformation und Rasterung nicht gleich ist, aber auf dem
gleichen Prozessor ausgeführt wird. Die Last für die Rasterung ist abhängig von der Größe
des Polygons und in Abbildung 5.5 (c) ist die Last somit ungleich verteilt.
5.1.2 Sort-Middle
Vor der Berechnung sind die Polygone wieder beliebig verteilt. Vor Beginn der Geometrietransformation kann zur Lastverteilung eine erste Umverteilung stattfinden. Danach wird die
Geometrietransformation durchgeführt. Nach der Geometrietransformation werden die in den
2D-Bildraum projizierten Polygone wie beim Sort-First auf verschiedene Kacheln aufgeteilt.
Abbildung 5.6 zeigt ein Beispiel. Wie zuvor berechnet nun jeder Prozessor seine Kachel und
AlgoCG 09
71
P1
P2
. #( (
(%#15"2 -%&*+/1;2/"%*,5<*-#%*
-%& +/1;2/"% ,5< -#%$%&,&.%#(%(
%/4%(&#%7&/>%''/&%"*'/11(%*21%#?34)@#2*
9 -#%*D,'( $/"*=%/4%(&#%(&,"'</&4,(#/"*5"-*
&(%#1(
'%#"A*'/"'(*1,5<%"*%#"#2%*HEINZ NIXDORF INSTITUT P3
rproblem
P4
E,'(%&5"2*F,""*5"21%#?3*$%&(%#1(
2
2
'%#"A*-,*
A
!"#$%&'#()(*+,-%&./&"
/>%''/&%" 1%%&
/>%''/&%"*1%%&
012/&#(34%"*5"-*6/471%8#()(
.%#-%'*-%&'%1.%*+&/>%''/&*.%,&.%#(%(
1;2/"%A*-#%*#"*4%3&%&%*B#1-&,54.%&%#?3%*
1%"A*C%&-%"*$/"*4%3&%&%" +&/>%''/&%"*
6/445"#F,(#/"'GH$%&3%,-*2%&#"2A*-,*"5&*
&,&.%#(%(
. #( (
P1
P1
P2
P2
2%/4%(&#'?3%*+&#4#(#$%*$%&'?3#?F(*C%&-%"*
%#?34)@#2*
%*D,'(
$/"*=%/4%(&#%(&,"'</&4,(#/"*5"-*
IF1%#"%*J>%"%"K
*
,'(%&5"2*F,""*5"21%#?3*$%&(%#1(
2
2
'%#"A*-,*
A
P3
P3
P4
P4
=&/@%*J>%"%"W
#-%'*-%&'%1.%*+&/>%''/&*.%,&.%#(%(
P1
P2
Kapitel 5.P3Paralleles Rendering
P4
P1
P2
P3
P4
HEINZ NIXDORF INSTITUT
54.%&%#?3%*
Paralleles Rendering
P/&1%'5"2*Q012/&#(34%"*#"*-%&*R/475(%&2&,<#FSA*JJ*TUUV
!"#$%&'#()(*+,-%&./&"
(a) als Sortierproblem
(b)
(c) L,((3#,'*M#'?3%&
012/&#(34%"*5"-*6/471%8#()(
Sort-Middle
/>%''/&%"*
5"#F,(#/"'GH$%&3%,-*2%&#"2A*-,*"5&*
P1
P2
P1
P2
Abbildung
5.5: Probleme bei der Anwendung
von Sort-First.
Schritt 2: Verteilung - „Sort“
(&#'?3%*+&#4#(#$%*$%&'?3#?F(*C%&-%"*
P1
4,(#/"*5"-*
*J>%"%"K 9 :%&(%#15"2*;</&(#%&5"2=*%&>/12(*
2;
2=
2
P2
( '%#"A*-,*
A
P3
P4
P3
P4
",?3
-%&*@%/4%(&#%(&,"'>/&4,(#/"*$/&
anschließend
wird
das
Gesamtbild
aus
den
einzelnen
Kacheln
zusammengesetzt. Diese Art
J>%"%"W
P3
.%#(%(
-%&*A,'(%&5"2
der Sortierung erlaubt die Verwendung unterschiedlicher Geometrie- und RasterungsprozesNO
L,((3#,'*M#'?3%&P4
P/&1%'5"2*Q012/&#(34%"*#"*-%&*R/475(%&2&,<#FSA*JJ*TUUV
9 $%&(%#1(*B%&-%"*-#%*#"*-%"*CDEF#1-&,54*
$%&(%#1(
B%&-%"
-#% #" -%" CDEF#1-&,54
soren
(Spezialhardware!)
-,*"5&*
%&-%"*
SA*JJ*TUUV
7&/G#H#%&(%"*+/1I2/"%
P1
P2
P1
P4
Wie werden 2D-Polgone verteilt?
P3
P2
P4
P1
9 '/*B#%*.%#*</&(EJ#&'(K*L6,?3%15"2M
9 '(,((*-%&*NDEO.G%P(%*B%&-%"*G%-/?3*
L,((3#,'*M#'?3%&
CDE7&/G#H#%&(%*+/1I2/"%*Q.%&*-,'*
R%(HB%&P*2%'?3#?P(*5"-*#"*6,?3%1"*
2
$%&(%#1(
P2
P3
P3
P4
NO
P1
P3
P1
P4
P2
P2
P3
P4
:/&1%'5"2*U012/&#(34%"*#"*-%&*V/475(%&2&,>#PWX*<<*CYYZ
S,((3#,'*J#'?3%&
CT
Abbildung 5.6: Aufteilung der projizierten 2D-Polygone auf Kacheln.
Die Last der Geometrietransformation kann durch gleichmäßige, nicht unbedingt kachelbezogene Aufteilung der Geometrie auf die einzelnen Prozessoren gut balanciert werden. Für
die Rasterung entstehen jedoch die gleichen Balancierungsprobleme wie beim Sort-First. Ein
weiteres Problem ist, dass die Graphikhardware das Lesen der Daten zwischen Geometrietransformation und Rasterung erlauben muss, was nicht immer möglich ist. Abbildung 5.7
zeigt ein Beispiel für die Balancierungsprobleme bei Sort-Middle.
5.1.3 Sort-Last
Wie zuvor sind vor der Bildberechnung die Objekte beliebig über die Prozessoren verteilt. Vor
der Geometrietransformation kann nun eine Umverteilung der Objekte durchgeführt werden,
um die Last besser zu verteilen. Dann berechnet jeder Prozessor für die ihm übergebenen
Objekte die Geometrietransformation und die Rasterung. Dabei entstehen bei p Prozessoren p
einzelne Bilder, die im Gegensatz zu Sort-First keine Kacheln des Gesamtbildes sind, sondern
AlgoCG 09
72
NO
P3
Probleme von Sort
Sort-Middle
Middle
HEINZ NIXDORF INSTITUT
9 E,&-D,&%*45''*:%'%"*-%&*F,(%"*
ortierproblem
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
CD#'>3%"*;%/4%(&#%(&,"'</&4,(#/"*5"-*
G,'(%&5"2 %&1,5.%"
G,'(%&5"2*%&1,5.%"
;%/4%(&#%(&,"'</&4,(#/"*21%#>34)?#2
9 -,3%&*#4*+HIH15'(%&IJK'(%4*4#(*3%5(#2%&*
$%&(%#1(*!*25(%*@,1,">#%&5"2
J(,"-,&-2&,<#=3,&-D,&%*'>3D#%&#2
4,(#/"
4,(#/"*=,""*
=,""
%&(%#15"2*-%&*
9 .%#*-%&*G,'(%&5"2*-#%'%1.%"*
'/&%"*25(*
P1
@,1,">#%&5"2'7&/.1%4%
P2
P4
D#% .%# J/&(IN#&'(
D#%*.%#*J/&(
N#&'(*
Kapitel 5. Paralleles Rendering
-,",>3*A%&(%#15"2*-%&*7&/L#C#%&(%"*
+/1K2/"%*#4*MFI@#1-&,54*
P3
P2
P3
P4
HEINZ NIXDORF INSTITUT
Paralleles Rendering als Sortierproblem
Sort-Last
P1
!"#$%&'#()(*+,-%&./&"
O,((3#,'*N#'>3%&
012/&#(34%"*5"-*6/471%8#()(
A/&1%'5"2*Q012/&#(34%"*#"*-%&*H/475(%&2&,<#=RS*JJ*MTTU
(a)
(b)
MP
F,(%"*
Schritt 1: Rendering
P1
/&4,(#/"*5"-*
Abbildung 5.7: Vorteil und Problem bei der Anwendung
von Sort-Middle.
9 :%/4%(&#%(&,"';/&4,(#/"*5"<,'(%&5"2*%&;/12%"*,5;*-%4'%1.%"*
-,",>3*A%&(%#15"2*-%&*7&/L#C#%&(%"*
4*4#(*3%5(#2%&* +&/=%''/&
+/1K2/"%*#4*MFI@#1-&,54*
3D#%&#2
"*
P2
P3
der Auflösung des Bildschirms entsprechen. Abbildung 5.8 zeigt die Aufteilung der Objekte
P4
9 =54*>?%@A%*-%&*B,'($%&(%#15"2*
=54
-%&in
B,'($%&(%#15"2
und
das>?%@A%
Rendern
der Bildschirmauflösung.
AC""%"*-#%*D.E%A(%*$/&3%&*22;'F*5"(%&*
P1
P2
-%"*+&/=%''/&%"*54$%&(%#1(*?%&-%"
P3
P1
P2
P4
P3
P1
K/&1%'5"2*L012/&#(34%"*#"*-%&*M/475(%&2&,;#ANO*PP*IQQR
P4
MP
O,((3#,'*N#'>3%&
75(%&2&,<#=RS*JJ*MTTU
P2
P4
P3
G,((3#,'*H#'@3%&
IJ
Abbildung 5.8: Berechnung der Einzelbilder bei Sort-Last.
Das Gesamtbild wird dann als Summe der Einzelbilder berechnet, wie in Abbildung 5.9
dargestellt. Die Verteilung (Sortierung) erfolgt damit erst nach der Rasterung. Er werden die
Pixelfragmente im 2D-Bildraum verteilt. Für die Zusammensetzung der Pixelfragmente zu
einem Gesamtbild müssen die Tiefenwerte bekannt sein, da sich Teile der gerenderten Polygone überlappen können. Man kann zwei Arten der Speicherung der einzelnen Pixelfragmente
unterscheiden. Diese sind:
• SL-sparse:
Jeder Prozessor speichert nur die tatsächlich gerasterten Pixel (in Abbildung 5.9 oben).
• SL-full:
Jeder Prozessor speichert immer die vollständige Bildschirmauflösung (in Abbildung
5.9 unten).
AlgoCG 09
73
9 SL-sparse:* ;#&*'7%#<3%&"*"5&*-#%*(,(')<31#<3*2%&,'(%&(%"*+#8%1
9 SL-full:*
SL full:
;#& '7%#<3%&" #44%& -#% $/11'()"-#2% =#1-'<3#&4,5>1?'5"2
;#&*'7%#<3%&"*#44%&*-#%*$/11'()"-#2%*=#1-'<3#&4,5>1?'5"2
Kapitel 5. Paralleles Rendering
=
P1
+
P2
+
P3
+
P4
=
P1
+
P2
+
P3
+
P4
D/&1%'5"2*E012/&#(34%"*#"*-%&*F/475(%&2&,>#GHI*JJ*BKKC
@,((3#,'*A#'<3%&
BC
Abbildung 5.9: Zusammensetzung der Einzelbilder zu einem Gesamtbild bei Sort-Last.
5.2 Hybrides Sort-First / Sort-Last Rendering
Es wird ein PC-Cluster betrachtet, in dem jeder Knoten aus einem PC besteht, der eine handelsübliche Grafikkarte verwendet. Die PCs sind durch ein Netzwerk verbunden und haben
keine hardwarebeschleunigte Zusammenführung von Bildern.
Sort-Middle ist durch den Bedarf an Spezialhardware nicht umsetzbar, da Standardgrafikkarten keinen direkten Zugriff auf das Ergebnis der Geometrietransformation erlauben. SortFirst erzeugt nur einen geringen Kommunikationsoverhead, benötigt aber eine zusätzliche
Transformation der Grafik-Primitive für die Verteilung. Da sich überlappende Kacheln (oder
auch Buckets genannt) zu einem redundanten Rendering führen, skaliert Sort-First schlecht,
da mit zunehmender Anzahl von Prozessoren die Anzahl der Überlappungen steigt. Sort-Last
skaliert dagegen gut, da sich die einzelnen Buckets nicht überlappen. Dafür müssen zusätzlich
zu den Farbwerten auch Tiefenwerte verschickt werden, was hohe Kommunikationskosten erzeugt.
Das hybride Sort-First/Sort-Last versucht nun, die Vorteile von Sort-First und Sort-Last zu
kombinieren. Der Partitionsalgorithmus ist sichtpunktabhängig und partitioniert dynamisch
zur Laufzeit. Dabei wird der 2D-Bildraum in Buckets partitioniert und der 3D-Objektraum
bestehend aus Polygonen in Gruppen. Die Partitionierung wird durchgeführt, um die Last
der Prozessoren zu balancieren und um die Kommunikationskosten für das Verschicken von
überlappenden Buckets zu minimieren.
5.2.1 Grundidee der Partitionierung
Die 3D-Polygone werden in Gruppen partitioniert. Die 2D-Boundingboxen der Gruppen bilden dann die Buckets. Typischerweise überlappen sich die Buckets. Das Ziel ist nun, die
Gruppen so zu wählen, dass die sich überlappenden Bereiche möglichst klein sind wie in Abbildung 5.10 dargestellt. Die Größe der überlappenden Bereiche ist entscheidend für die Höhe
der Kommunikationskosten.
Die Partitionierung wird zur Laufzeit durchgeführt, um je nach Blickwinkel die überlappenden Bereiche möglichst klein halten zu können.
AlgoCG 09
74
es Sort-First /Sort-Last Rendering
egende Idee Partitionierungs-Algorithmus
HEINZ NIXDORF INSTITUT
Kapitel 5. Paralleles Rendering
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
9#%11/'%*0"/&-"5"2
77#%&%*;<=+/1>2/"%*#"*?&577%"
*@<=A/5"-#"2./8%"*-%&*?&577%"*#4*A#1-&,54*
-%"
-%"*%#"*A5BC%(
%#" A5BC%(
*A5BC%('*D.%&1,77%"*'#B3
31%*-#%*?&577%"*'/F*-,''*-#%*'#B3*D.%&1,77%"-%"*
77
F
77
&%#B3%*-%&*A5BC%('*4G21#B3'(*C1%#" '#"-
H.%&1,775"2'.%&%#B3
I%*-%&*D.%&1,77%"-%"*A%&%#B3%*#'(*%"('B3%#-%"-*
KG3%*-%&*6/445"#C,(#/"'C/'(%"
&)541#B3%*?&577#%&5"2
O/&1%'5"2*P012/&#(34%"*#"*-%&*Q/475(%&2&,J#CRF*SS*@TTN
L,((3#,'*M#'B3%&
;N
Abbildung 5.10: Idee der Partitionierung beim Hybrid-Sort
5.2.2 Ablauf des Rendering
Der Algorithmus arbeitet in drei Phasen, die alle von entsprechenden PCs bearbeitet werden.
Das Gesamtsystem ist damit quasi eine 3-Phasen Pipeline, wie in Abbildung 5.11 dargestellt.
Die Phasen sind im einzelnen:
• Phase 1: Partitionierung
Die Partitionierung wird von einem Client-PC durchgeführt. Dieser teilt die 3DPolygone in N disjunkte Gruppen auf und weist jede Gruppe einem der N Server zu.
Dazu werden zunächst die Überlappungen der Buckets berechnet. Dann werden die Pixel in disjunkte Überlappungsbereiche aus überlappenden und nicht überlappenden Teilen Buckets partitioniert. Diese Überlappungen werden ebenfalls auf die Server verteilt.
• Phase 2: Rendering
Das Rendering wird parallel auf den N Servern ausgeführt. Dabei rendert jeder Server A die im zugewiesene Gruppe in den lokalen Framebuffer. Dann weden die Farbund Tiefenwerte aller Pixel, die in sich überlappenden Bereichen der Buckets liegen,
zurückgelesen. Die überlappenden Bereiche werden dann an die zuständigen Server B
geschickt.
Danach werden die Überlappungsbereiche gerendert. Dabei wird von allen Servern A
ein Teil des Überlappungsbereichs empfangen und die einzelnen Teile werden dann zu
einem Gesamtbild für den Überlappungsbereich zusammengesetzt. Dazu werden die
Farb- und Tiefenwerte aus dem lokalen Frame-Buffer verwendet. Nach dem Rendering
werden die Pixel aller Überlappungsbereiche zurückgelesen und zusammen mit den Pixeln der sich nicht überlappenden Teile der Buckets an den Display-PC geschickt.
AlgoCG 09
75
rt-First /Sort-Last Rendering
setzung
HEINZ NIXDORF INSTITUT
Kapitel 5. Paralleles Rendering
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
(*#"*-%&*;#1-'<3#&4,5:1='5"2*>%-%'*
*2%",5*%#"4,1
7:,"2*$/"*A#%:%"B%&(%"*"/(B%"-#2
D5*-#%*E,<3(%#1%*$/"*F/&(GH,'(G
Abbildung 5.11: Ablauf des Rendering beim Hybrid-Sort
• Phase 3: Bildzusammensetzung
Die Bildzusammensetzung wird von einem Display-PC ausgeführt. Dieser empfängt
die Teilbilder der Überlappungsbereiche und der sich nicht überlappenden Teile der
KL
C/&1%'5"2*M012/&#(34%"*#"*-%&*N/475(%&2&,:#?OP*FF*QRRS
Buckets und setzt alle Teile zu einemI,((3#,'*J#'<3%&
Bild zusammen. Der
Tiefentest ist hier nicht
mehr notwendig, da er bereits bei der Berechnung des Überlappungsbereichs ausgeführt
wurde. Im Vergleich zu normalen Sort-Last Algorithmus wird jedes Pixel nur genau
einmal empfangen, was die Kommunikationskosten senkt.
5.2.3 Partitionierungs-Algorithmus
Die beiden Ziele der Partitionierung sind:
1. Rendering-Last balancieren durch Umverteilung der Objekte in Gruppen
2. Kommunikationsoverhead minimieren indem durch Umverteilung die Überlappungsbereiche klein gehalten werden.
Die Berechnung muss schnell erfolgen, damit der Client nicht zum Bottleneck wird. Dazu
wird eine rekursive, binäre Aufteilung der Gruppen mit zwei aufeinander zulaufenden SweepLines vorgenommen. Abbildung 5.12 zeigt ein Beispiel für die Aufteilung mit Sweep-Lines.
Die linke (rote) Sweep-Line läuft immer nach rechts, die rechte (blaue) Sweep-Line läuft
nach links. Sobald ein Objekt vollständig von einer Sweep-Line überlaufen wurde, wird es
zur Gruppe hinzugefügt. Jeweils zu der Gruppe, die zur Sweep-Line gehört. Die Sweep-Lines
laufen nur so lange, bis alle Objekte verteilt wurden.
Wenn alle Objekte zugeordnet wurden und die Sweep-Lines aneinander vorbei gelaufen
sind, wie in Abbildung 5.12 (d) dargestellt, entstehen Überlappungsbereiche der Buckets.
AlgoCG 09
76
9 -#%*&%@3(%*;<%%7=>#"%*1)5?(*#44%&*",@3*1#":'
-#% &%@3(% ;<%%7 >#"% 1)5?( #44%& ",@3 1#":'
Kapitel 5. Paralleles Rendering
HEINZ NIXDORF INSTITUT
t /Sort-Last9 Rendering
'/.,1- %#" A.B%:( $/11'()"-#2 $/"!"#$%&'#()(*+,-%&./&"
'/.,1-*%#"*A.B%:(*$/11'()"-#2*$/"*-%&*;<%%7=
-%& ;<%%7=
thmus
012/&#(34%"*5"-*6/471%8#()(
>#"%*C.%&1,5?%"*<5&-%D*:/44(*%'*E5&*F&577%
lgorithmus
9 A.B%:(%D*-#%*$/"*-%&*1#":%"*G&%@3(%"H*;<%%7=
>#"%*C.%&1,5?%"*<5&-%"D*:/44%"*E5&*1#":%"*
G
G&%@3(%"H*F&577%
H
77
7=>#"%*1)5?(*#44%&*",@3*&%@3('
%7
%7=>#"%*1)5?(*#44%&*",@3*1#":'
>#"% 1)5?( #44%& ",@3 1#":'
9 -#%*;<%%7=>#"%'*1,5?%"*'/*1,"2%D*.#'*,11%*
2
HEINZ NIXDORF INSTITUT
A.B%:(%*$%&(%#1(*<5&-%"
/Sort-Last
Rendering
Hybrides
Sort-First /Sort-Last Rendering
!"#$%&'#()(*+,-%&./&"
%:(
%:(*$/11'()"-#2*$/"*-%&*;<%%7=
$/11'()"-#2 $/" -%& ;<%%7=
hmus
Partitionierungs-Algorithmus
*<5&-%D*:/44(*%'*E5&*F&577%
HEINZ NIXDORF INSTITUT
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
(a)
(b)
012/&#(34%"*5"-*6/471%8#()(
I,((3#,'*J#'@3%&
M/&1%'5"2*N012/&#(34%"*#"*-%&*O/475(%&2&,?#:PD*;;*QRRL
KL
Partitionierungs-Algorithmus
gorithmus
"*-%&*1#":%"*G&%@3(%"H*;<%%7=
*<5&-%"D*:/44%"*E5&*1#":%"*
7>#"%*1)5?(*#44%&*",@3*&%@3('
7%
9 :;
-#% <=%%7
-#%*<=%%7@>#"%'*1,5?%"*'/*1,"2%A*.#'*,11%*
>#"%' 1,5?%" '/ 1,"2% .#' ,11%
7
7=>#"%*1)5?(*#44%&*",@3*1#":'
>#"% 1)5?(9 #44%&
",@3 1#":'
B.C%D(%*$%&(%#1(*=5&-%"
'*1,5?%"*'/*1,"2%D*.#'*,11%*
2
*<5&-%" 9 =%""*,11%*B.C%D(%*E52%/&-"%(*=5&-%"*5"-*-#%*
(*$/11'()"-#2*$/"*-%&*;<%%7=
( $/11'()"-#2 $/" -%& ;<%%7=
(c)
(d)
<=%%7@>#"%'*,"%#","-%&*$/&.%#*2%1,5?%"*'#"-A*
<5&-%D*:/44(*%'*E5&*F&577%
KL
I,((3#,'*J#'@3%&
2/&#(34%"*#"*-%&*O/475(%&2&,?#:PD*;;*QRRL
-,""*%"('(%3%"*-#%*F.%&1,775"2'.%&%#G3%*-%&*
H5GD%('
Abbildung 5.12: Partitionierung der Szene mit Sweep-Lines.
*-%&*1#":%"*G&%@3(%"H*;<%%7=
<5&-%"D*:/44%"*E5&*1#":%"*
Die rekursive Aufteilung wird vorgenommen, in dem ein Bucket jeweils senkrecht zur läng%
sten Achse in zwei Gruppen aufgeteilt wird. Die Aufteilung wird beendet, nachdem bis zu N
gleichmäßige Gruppen entstanden sind. Dabei sollte jede Gruppe die gleiche Rendering-Last
*1,5?%"*'/*1,"2%D*.#'*,11%*
2 erzeugen.
<5&-%"
5.2.4 Abschätzung des Kommunikations-Overhead
KL
I,((3#,'*J#'G3%&
#(34%"*#"*-%&*O/475(%&2&,?#:PD*;;*QLLR
M/&1%'5"2*N012/&#(34%"*#"*-%&*O/475(%&2&,?#DPA*<<*QRRS
I,((3#,'*J#'@3%&
KL
Ein Teil des Kommunikations-Overhead entsteht durch das Verschicken der überlappenden
Bereiche der Buckets. Eine exakte Berechnung ist schwierig, da die Breite der Überlappung
schwer abzuschätzen ist. Sie hängt ab vom Aufbau der Szene und vom jeweiligen Sichtpunkt.
Für die Berechnung werden deshalb die folgenden, vereinfachenden Annahmen gemacht:
• Alle Objekte sind gleich verteilt
• Alle Objekte sind im Bildraum (nach der Transformation) als Quadrate gleicher Größe
mit Kantenlänge B abgebildet.
• Der Bildraum besteht aus P Pixeln
• Es gibt N Server
• Jeder Server bekommt ein Bucket mit
P
N
Pixeln und Kantenlänge
√
√P .
N
Ein solches quadratisches Bucket zeigt Abbildung 5.13. Der rote Bereich S ist der Überlappungsbereich, an dem sich die gerenderten Pixel überlappen. Der Bereich ist ein „Streifen“ der Breite B2 , der außen um das Bucket herumliegt. Die Breite kommt zustande, da ein
AlgoCG 09
77
Kapitel 5. Paralleles Rendering
HEINZ NIXDORF INSTITUT
Sort-Last Rendering
ad
!"#$%&'#()(*+,-%&./&"
Objekt, das weiter außen liegt, sonst zuvor
von einer anderen Sweep-Line in einen anderen
012/&#(34%"*5"-*6/471%8#()(
Bucket sortiert worden wäre.
%*=S) -%&*;5<>%('*
'#<3*-#%*2%&%"-%&(%"*
# 3 -#
- (
"*;5<>%(
?
C.D%>(
B/2
B
%#"*E?(&%#F%"G*-%&*
'*;5<>%(
;5<>%(
"',5F:,"-*2#1(K
B
Abbildung 5.13: Illustration der Berechnung der Kommunikations-Overhead
<3#<>(*-%"*;%&%#<3*?*
Jeder Prozessor schickt nur diesen Bereich S zu anderen Prozessoren oder erhält einen
%''/&%"*
solchen Bereich. Die Größe von S setzt sich zusammen aus:
-%&'%1.%"*M&NO%*$/"*
• den vier Ecken, jeweils mit Größe B2 · B2
• den vier Rechtecken entlang der Seiten, jeweils mit Größe
B
2
·
√
√P
N
Die Gesamtgröße von S ergibt sich damit als:
√
B √P
·
+4
2
N
√
P
2B √N
+ B2
P,((3#,'*J#'<3%&
T (n) = 4 ·
4%"*#"*-%&*T/475(%&2&,F#>U@*??*IVVW
=
·
B
2
·
B
2
QQ
Diese Anzahl von Pixeln muss jeder Server in jedem Frame an andere Server verschicken.
AlgoCG 09
78
6 Level of Detail
In einer Szene sind nicht immer alle Objekte mit gleich hohem Detaillierungsgrad erkennbar.
Trotzdem müssen alle Objekte gezeichnet werden, wodurch Rechenzeit verschwendet wird.
Der Ansatz des Level of Detail besteht darin, ein weniger komplexes Modell zu erstellen und
zu rendern, dass (fast) genauso gut aussieht wie das ursprüngliche Modell.
Werden alle Objekte mit hoher Komplexität gerendert erhält man eine hohe Qualität der Bilder, aber eine geringe Framerate. Ab einer bestimmten Anzahl von Objekten ist keine akzeptable Realzeit-Navigation mit mehr als 20 fps mehr möglich. Bei niedriger Komplexität für
alle Objekte erhält man eine niedrige Qualität, aber dafür eine hohe Framerate. Im klassischen
Level of Detail versucht man eine individuelle Steuerung zwischen Komplexität und Performance zu erreichen. Die hohe Komplexität wird nur dort verwendet, wo es optisch wichtig ist.
Die niedrige Komplexität dort, wo es nicht wichtig ist. Typischerweise nutzt man 3 bis 5 Modelle in unterschiedlichen Komplexitätsstufen für ein Objekt, die im Preprocessing berechnet
werden. Die Auswahl erfolgt während des Walkthrough in Abhängigkeit von der Entfernung
des Objektes. Je weiter das Objekt entfernt ist, desto geringer die Komplexität des LOD. Die
Motivation dafür ist, dass mit zunehmender Entfernung Fehler schlechter sichtbar sind und
somit eine geringere Komplexität ausreichend ist. Abbildung 6.1 zeigt ein Beispiel für dieses
Prinzip.
Entfernungsabhängigkeit der
Fehlersichtbarkeit
Verschiedene LOD Modelle
für das Objekt
Abbildung 6.1: LOD-Modelle für verschiedene Entfernungen.
Für
jedes
Objekt
O
werden
im
Preprocessing
LODs
LOD(O1 ), LOD(O2 ), LOD(O3 ), . . . , LOD(Ol ) berechnet und es werden Abstände
79
Kapitel 6. Level of Detail
d(O1 ), d(O2 ), d(O3 ), . . . , d(Ol ) definert. Falls dann zur Laufzeit ein Objekt O mit Abstand d
zum Betrachter gerendert werden soll, wobei d(Oi ) ≤ d < d(Oi+1 ) gilt, dann wird das Objekt
mit d(Oi ) gerendert. Falls d < d(O1 ) ist, dann wird die höchste Auflösung verwendet.
6.1 Arten des Level of Detail
Es gibt verschiedene Arten, das Level of Detail auszuführen, die im Folgenden vorgestellt
werden sollen.
6.1.1 Discrete Level of Detail
Das Objekt wird in Abhängigkeit von der Entfernung durch unterschiedliche LODs dargestellt. Dies hat den Nachteil, dass Sprungeffekte (Popping-Artefakte) entstehen, wenn ein
LOD getauscht wird. Das Objekt verändert so plötzlich sein Aussehen.
6.1.2 Continuous Level of Detail
Bei dieser Variante wird im Preprocessing ein kontinuierliches Spektrum von LODs kodiert.
Dabei werden mehrere unterschiedliche LODs (Auflösungen) in einer einzigen Darstellung
kodiert. Zur Laufzeit wird das gewünschte LOD daraus berechnet. Je höher die Auflösung
(Granularität), desto feiner sind die Übergänge zwischen den Modellen.
6.1.3 View-Dependent Level Of Detail
Für sehr große und lange Objekte, wie z.B. einen Zug oder ein Oberflächennetz, sind einzelne
Teile des Objektes unterschiedlich weit entfernt. Die Idee des sichtpunktabhängigen LOD besteht darin, dass man mehrere LODs für ein einziges Objekt gleichzeitig benutzt. Es sollen
nahe Teile des Objektes in höherer Auflösung dargestellt werden, als weiter entfernte Teile
des Objektes. Damit erhält man ein sichtpunktabhängiges LOD, bei dem man für ein einzelnes Objekt kontrollieren kann, an welcher Stelle wie viele Polygone zur Darstellung benutzt
werden sollen.
6.2 LOD - Hierarchie
LODs können z.B. in der von Clark vorgeschlagenen LOD-Hierarchie organisiert werden. Die
LOD Hierarchie ist ein hierarchischer, azyklischer Baum. Dieser enthält als Wurzel ein LOD
der ganzen Szene. Tiefere Ebenen enthalten verfeinerte LODs von einzelnen Objekten, wie in
Abbildung 6.2 für die Smiley Figur dargestellt. Jeder Knoten enthält verfeinerte Teilobjekte
der Elternknoten (LODs) und Transformationen, die das Objekt an die Objekte an die richtige
Position der Szene verschieben.
Die Hierarchie wird so verwendet, dass im Baum bis zur gewünschten Detailtiefe abgestiegen wird, die der gewünschten Genauigkeit entspricht. Alle Knoten der gewünschten Tiefe
AlgoCG 09
80
3%,-
1%2'
,&4'
HEINZ NIXDORF INSTITUT
I J5&K%1*%"(3)1(*%#"*9:;*-%&*2,"K%"*
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()( fine
LK%"%
coarse
In den Knoten
I $%&M%#"%&(%*Q%#1/.P%?(%*-%&*N1(%&"?"/(%"*
R9:;O'S
refined
l
level
l2
I Q&,"'M/&4,(#/"%"
3%,-
1%2'
R$%&'=3#%.%"*-%&*:.P%?(%*,"*-#%*&#=3(#2%*
Level of Detail
'?511
4/5(3 1%M(
+/'#(#/" #" -%& LK%"%S
+/'#(#/"*#"*-%&*LK%"%S
!"#$%&'()(*+&'
fine
*-%&*2,"K%"*
"*$%&M%#"%&(%*
.P%?(%"
-%&*N1(%&"?"/(%"*
l
level
l3
4/5(36. 1%M(
Kapitel
Level of&#23(
Detail
%G%'
1%2
%2
1%2
2
'4#1%G
level 1
r Baum
'?511
l
level
l3
I (#%M%&%*N.%"%"*%"(3,1(%"*$%&M%#"%&(%*
F3/1%*'=%"%
9:;O'*$/"*%#"K%1"%"*:.P%?(%"
s?
??*@ABCDE
@ABCDE
refined
l
level
l2
Hierarchischer azyklischer Baum
1%2
%2
%G%'
,&4'
HEINZ NIXDORF INSTITUT
&#23(
1%2
2
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
(a)
9/:5*;<""(%*-#%*=#%&,&>3#%*"/>3*$%&?%"-%(*?%&-%"@
V/&1%'5"2*W012/&#(34%"*#"*-%&*>/475(%&2&,M#?XY*LL*Z[[B
(b)
T,((3#,'*U#'=3%&
AD
View-Frustum-Culling
Abbildung 6.2: LOD Hierarchie nach Clark.
A :5*B%-%4*6"/(%"*#'(*'%#"%*C/5"-#"2./8 2%'7%#>3%&(
gehörenA zur
sogenannten
Die/.
Knoten
der Front werden
gerendert,
Knoten oberhalb
7&DE%
7&DE%*.%#*B%-%4*6"/(%"F*/.*-#%*C/5"-#"2./8
.%# B%-%4Front.
6"/(%"
-#% C/5"-#"2./8
'#>3(.,&
'#>3(.,&*#'(
#'(
und unterhalb der Front werden nicht gerendert. Dabei wird ein sichtpunktabhängiges LOD
A E,11'*-#%*C/5"-#"2./8 "#>3(*'#>3(.,&*#'(F*&%"-%&%*#3&%"*G"3,1(*"#>3(*
unterstützt, da einzelnen Teile des Modells aus einer tieferen Ebene genommen werden kön5"-*.&%>3%*-#%*H&,$%&'#%&5"2*,"*-%4*6"/(%"*,.
nen, wie der Rest des Objektes. In dem Ausschnitt in Abbildung 6.3 wird z.B. ein gröberes
(%*,"*-#%*&#=3(#2%*
LOD für die Arme und ein feineres LOD für den Rest des Objektes verwendet.
-#%'%&*6"/(%"*#'(*5"'#>3(.,&
?3/1%*'>%"%
-%&*>/475(%&2&,M#?XY*LL*Z[[B
coarse
level 1
T,((3#,'*U#'=3%&
'4#1%I
refined
level 2
3%,';511
fine
level 3
1%2'
4/5(3 11%E(
E(
1%2
%I%'
AD
-#%'%&*H%#1*?#&-*2%&%"-%&(
,&4'
&#23(
1%2
6/7EV*W%$%1*X
0&4%V*W%$%1*S
N/&1%'5"2*O012/&#(34%"*#"*-%&*P/475(%&2&,E#;QF*RR*STTU
LM
J,((3#,'*K#'>3%&
Abbildung 6.3: Verwendung der Hierarchie für sichtpunktabhängiges LOD und ViewFrustum-Culling.
Die Hierarchie kann außerdem zum View-Frustum-Culling verwendet werden, wenn zu jedem Knoten seine Boundingbox gespeichert wird. Für einen Knoten wird dann zunächst geprüft, ob die Boundingbox sichtbar ist. Falls nicht, wird der Inhalt des Knotens nicht gerendert und die Traversierung an dem Knoten abgebrochen. Abbildung 6.3 zeigt auch dies, da
die Beine des Smileys nicht sichtbar sind.
6.3 Automatische Frameratenregulierung
Das Ziel des Algorithmus ist es, eine konstante Framerate zu erzielen. Dabei sind als Eingabe
mehrere Objekte O, sowie mehrere LODs L für jedes Objekt gegeben. Zusätzlich wird davon
AlgoCG 09
81
Kapitel 6. Level of Detail
ausgegangen, dass eine bestimmte Menge x von Dreiecken in Echtzeit (d.h. mit mind. 20 fps)
dargestellt werden kann. Der Algorithmus muss nun vor dem Rendern für jedes Objekt eine
bestimmte Auflösung wählen, um die Framerate konstant zu halten. Dazu definieren wir:
• den Nutzen Benef it(O, L) und
• die Kosten Cost(O, L) eines Objektes für jedes seiner LODs.
Der Nutzen wird als Produkt von der Größe und der Wichtigkeit des Objektes, sowie der
Bewegungsgeschwindigkeit, dem Focus (Mittelpunkt des Bildschirms oder nicht) und der Hysterese (wann wurde das LOD zuletzt gewechselt) berechnet.
Für die Abschätzung der Kosten wird angenommen, dass die Rendering Pipeline das Bottleneck ist. Die Kosten der Pipeline bestehen zum einen aus den Kosten der Geometrietransformation (Polygone + Punkte) und zum anderen aus der Rasterung. Der Bottleneck ist entweder die Transformation oder die Rasterung, weshalb das Maximum der Kosten dieser beiden
Schritte betrachtet wird. Die Koeffizienten werden empirisch für alle LODs bestimmt.
Für eine Menge S von Objekten im View-Frustum soll nun der Benefit maximiert werden
unter der Bedingung, dass die Kosten die Ziel-Framerate nicht übersteigen. Dies ist jedoch
ein Rucksackproblem und damit leider NP-vollständig. Man verwendet deshalb einen GreedyAnsatz, der jeweils das LOD mit dem besten Nutzen/Leistungsverhältnis auswählt.
6.4 Vereinfachung von Polygonmodellen
Für ein gegebenes 3D-Modell bestehend aus n Dreiecken sollen dem Original möglichst ähnlich sehende 3D-Modelle berechnet werden, die n0 << n Polygone besitzen. Sie sollen ein
ähnliches Polygonnetz bei gleichem Aussehen besitzen. Für die Verringerung der Polygonzahl bei gleichem Aussehen und die Messung der Qualität gibt es vier Ansätze, die im Folgenden vorgestellt werden sollen. Die meisten Methoden sind eine Mischung dieser vier Grundansätze.
6.4.1 Decimation
Bei diesem Ansatz werden sukzessive Punkte aus dem Modell entfernt und nach jedem entfernten Punkt doch entstandene Loch neu trianguliert. Das Verfahren terminiert, wenn der gewünschte Reduktionsgrad oder eine bestimmte Anzahl an Dreiecken erreicht wurde. Abbildung 6.4 zeigt ein Beispiel. Die roten Punkte wurden nicht ausgewählt und die grünen Punkte
werden im nächsten Schritt entfernt. Wie in der Abbildung dargestellt, ist es möglich, mehrere
Punkte in einem Schritt zu entfernen.
Bei der Auswahl der Punkte sorgt ein Fehlermaß dafür, das gelöschte Punkte nur zu kleinen
Fehlern führen. Eine Variante ist das erhalten einer lokale Topologie, z.B. für einen Käse mit
Löchern werden keine Punkte entfernt, die ein Verschwinden von Löchern verursachen.
AlgoCG 09
82
; ?&@"< +5":(%*=%&-%"*#4*")>3'(%"*A>3&#((*%"(B%&"(
; #"*%#"%4*A>3&#((*:C""%"*%#"*/-%&*4%3&%&%*+5":(%*,5'2%=)31(*=%&-%"
#" %#"%4 A>3&#(( :C""%" %#" /-%& 4%3&%&% +5":(% ,5'2%=)31( =%&-%"
Kapitel 6. Level of Detail
/&#2#",1*4/-%1
# # 1
- 1
B# - #
B#&'(*-%>#4,(#/"
#
O
'%>/"-*-%>#4,(#/"
-- #
#
G
(3#&-*-%>#4,(#/"
3# - - #
#
F
D,((3#,'*E#'>3%&
H/&1%'5"2*I012/&#(34%"*#"*-%&*J/475(%&2&,B#:KL*AA*GMMN
FG
HEINZ NIXDORF INSTITUT
Abbildung
6.4: Arbeitsweise des Decimation Algorithmus.
Vereinfachung
von Polygonmodellen
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
!"#$%&'(
6.4.2 Sampling
Beispiel
Bei diesem Ansatz werden zufällig neue Punkte auf die Oberfläche des Objektes verteilt. An9 :/(; werden
/&#2#",1alle
/&#2#",1*+5"<(%
+5"<(%
schließend
originalen Punkte entfernt und die neuen Punkte zu einer Oberfläche
trianguliert.
Anzahl der neuen Punkte bestimmt die Komplexität des neuen Polygonmo9 =&>";Die
"%5%*+5"<(%
dells. Abbildung 6.5 illustriert dieses Verfahren, wobei die originalen Punkte rot und die neuen
Punkte grün sind.
"%5%*+5"<(%*,5?*-#%*
@.%&?1)A3%*'%(B%"
/&#2#",1 4/-%1
/&#2#",1*4/-%1
/&#2#",1%*+5"<(%*%"(?%&"%"*
2
"%5%*+5"<(%*(&#,"251#%&%"
',471%- 4/-%1
',471%-*4/-%1
&%(&#,"251,(%- 4/-%1
&%(&#,"251,(%-*4/-%1
Abbildung 6.5: Arbeitsweise des Sampling Algorithmus.
G/&1%'5"2*H012/&#(34%"*#"*-%&*I/475(%&2&,?#<JK*LL*MNNO
EF
C,((3#,'*D#'A3%&
Für die Verteilung der neuen Punkte gibt es zwei Strategien. Sie können entweder direkt auf
die Oberfläche der Dreiecke oder auf die gedachte Oberfläche des Objektes gesetzt werden.
Der Vorteil dieses Verfahrens ist die gezielte Steuerbarkeit, an welchen Stellen des Modell
eine hohe Komplexität entstehen soll. Ein Problem ist jedoch, dass, wie in Abbildung 6.6
dargestellt, scharfe Kanten schnell verloren gehen können.
AlgoCG 09
83
9 '<3,&?%*6,"(%"*@A""%"*'<3"%11*$%&1/&%"*2%3%"
Kapitel 6. Level of Detail
Abbildung 6.6: Verlust von scharfen Kanten bei der Anwendung des Sampling
Algorithmus.DE
B,((3#,'*C#'<3%&
F/&1%'5"2*G012/&#(34%"*#"*-%&*H/475(%&2&,?#@I>*==*JKKL
HEINZ NIXDORF INSTITUT
Vereinfachung von Polygonmodellen
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
!"#$"%&'"#()*(
6.4.3
Vertex Merging
Bei diesem
Verfahren werden benachbarte Punkte verschmolzen, so dass der neue Punkt in der
Beispiel
Nähe der alten Punkte liegt. Dabei zu einer Linie kollabierende Dreiecke werden entfernt. Die
9 :/(; +5"<(%*.1%#.%"*5".%&=3&(
+5"<(% .1%#.%" 5".%&=3&(
neue Fläche kommt damit mit weniger Dreiecken aus. Diese beiden Schritte werden solange
9 >&=";
+5"<(%*?%&-%"*$%&'@34/1A%"
wiederholt,
bis die
gewünschte Reduktion erreicht wurde. Abbildung 6.7 zeigt ein Beispiel, in
dem die9 unberührten
Punkte
rot, die verschmolzenen
Punkte grün und der neue verschmolzene
B1,5; -%&*"%5%*$%&'@34/1A%"%*+5"<(
-%& "%5%
$%&'@34/1A%"%
+5"<(
Punkt blau dargestellt sind.
-#%'% C&%#%@<%
-#%'%*C&%#%@<%*
3,.%*#3&%*D/&4*
$%&)"-%&(
4%&2%-*$%&(#@%'
"%?*$%&(%8
Abbildung 6.7: Arbeitsweise des Vertex Merging Algorithmus.
H/&1%'5"2*I012/&#(34%"*#"*-%&*J/475(%&2&,K#<LM*NN*OPPG
E,((3#,'*D#'@3%&
FG
Mit diesem Verfahren ist die gezielte Reduktion an bestimmten Stellen des Netzes möglich.
6.4.4 Adaptive Subdivision
Bei diesem Verfahren wird ein grobes Modell des Originalmodells berechnet, das sogenannte
Basisnetz. Anschließend wird ein Fehlermaß definiert, dass den Abstand zum Ausgangsmodell misst. Dann werden sukzessive neue Knoten eingefügt, um das Basisnetzt zu verfeinern
und den Fehler zu reduzieren. Neue Punkte werden dort eingefügt, wo der Fehler stark verkleinert werden kann. Abbildung 6.8 illustriert diese schrittweise Verfeinerung.
Das Verfahren arbeitet damit „umgekehrt“ zum Decimation Verfahren. Der Vorteil ist, dass
Fehler durch das Einfügen von Punkten leichter zu justieren sind als durch das Wegnehmen
von Punkten. Der Nachteil besteht darin, dass das Basisnetz mit einem anderen Verfahren
erzeugt werden muss.
AlgoCG 09
84
9 :#&*;<2%"*-/&(*"%5%*+5"=(%*%#">*?/*?#&*-%"*@%31%&*A54*B&#2#",14/-%11*'(,&=*
$%&%#";,C3%"*=D""%"
Kapitel 6. Level of Detail
E,'#'"%(A*4#(*,"-%&%4*
F%&;,3&%"*%&A%52(
/&#2#",1*4/-%1
GH*0"")3%&5"2
*.,'%*4/-%1
IH*0"")3%&5"2
*;#&'(*'5.-#$#'#/"
*'%C/"-*'5.-#$#'#/"
Abbildung 6.8: Arbeitsweise des Adaptive Subdivision Algorithmus.
J,((3#,'*@#'C3%&
F/&1%'5"2*L012/&#(34%"*#"*-%&*M/475(%&2&,;#=N>*OO*IPPQ
KI
6.5 Schrittweise Verfeinerung mit Progressive Meshes
Progressive Polygonnetze sind grobe und feine Modellierungen eines Polygonmodells in einem Modell. Dies erlaubt den Wechsel zwischen groben und feinen Darstellungen und somit
einen feinstufigen Wechsel zwischen verschiedenen Auflösungen in Echtzeit. Dazu wird eine
Folge von Dreiecken
M̂ = M n , M n−1 , M n−2 , M n−3 , . . . , M 3 , M 2 , M 1 , M 0
erzeugt, wobei M̂ das originale Polygonnetz ist und M 0 die gröbste Stufe (ggfs. nur ein
HEINZ NIXDORFzu
INSTITUT
Dreieck).
Dabei ist esPolygonnetze
möglich, M j aus M j+1 durch eine lokale Veränderung
erzeugen.
Progressive
!"#$%&'#()(*+,-%&./&"
!"#$%&'()#)
012/&#(34%"*5"-*6/471%8#()(
6.5.1 Vergröberung
Operation: Edge Collapse #*(+,-
./0-&/0/v’s1
Die Vergröberung
wird%#"%
durch
die;-Funktion
Edge Collapse ecol(vs , vt , vs0 ) durchgeführt. Dazu
9 :#&*:)31%"*%#"%*6,"(%*;:#& :)31%"
6,"(%
-&<
./0wird eine Kante
(vs , vt ) gewählt und die beiden Endpunkte der Kante werden
zu einem neuen
9 :#&*=,''%"*-#%*.%#-%"*6"/(%"*-%&*6,"(%*>5*%#"%4*"%5%"*6"/(%"*-2
.
Dieser Vorgang ist in Abbildung 6.9 dargestellt.
Knoten vs0 zusammengefasst.
>5',44%"
#*(+,-./0-&/0/v’s1
-&
-$
-+
-+
-2.
-$
-.
Abbildung 6.9: Arbeitsweise des Edge Collapse Algorithmus bei Verwendung von Progressive Meshes.
BC
?,((3#,'*@#'A3%&
Das resultierende Netz besitzt nun einen Knoten und zwei Dreiecke
weniger. Der
neue
0
Punkt vs muss jedoch zusätzlich gespeichert werden. Für die Platzierung des neuen Knotens
gibt es verschiedene Strategien, die in Abbildung 6.10 zusammengefasst sind.
D/&1%'5"2*E012/&#(34%"*#"*-%&*F/475(%&2&,=#GHI*JJ*KLLC
AlgoCG 09
85
Kapitel 6. Level of Detail
/&#2#",1%'*
< - 11
</-%11
-%&*"%5%*+5"=(%*
,5>*-%&*
>3?7/(3%(#'@3%"*
A.%&>1)@3%
-%&*"%5%*+5"=(*
4#((%"*,5>*-%&*
#((
>%"(>%&"(%"*6,"(%
-%&*"%5%*+5"=(*
,5>*%#"%4*-%&*
> #
B@=75"=(%
Abbildung 6.10: Positionierung des neuen Punktes bei Ausführung von Edge Collapse.
DE
<,((3#,'*C#'@3%&
F/&1%'5"2*G012/&#(34%"*#"*-%&*H/475(%&2&,>#=IJ*KK*LMMN
Bei der Positionierung des neuen Punktes auf der hypothetischen Oberfläche tendiert das
Netz zur Originalgröße. Die resultierende Form ist jedoch oft nicht bekannt. Bei der Positionierung auf der Mitte der entfernten Kante tendiert das Netz hingegen dazu, kleiner zu werden. Die Positionierung auf einem der Eckpunkte ist die einfachste Möglichkeit, da hier keine
Berechnungen angestellt werden müssen.
Durch eine Folge von Edge Collapse Anwendungen erhält man nun eine Folge von Netzen,
die alle aus dem originalen Netz entstehen. Somit kann man zur Laufzeit das Polygonnetz
vergröbern.
6.5.2 Verfeinerung
Progressive Polygonnetze
HEINZ NIXDORF INSTITUT
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
!"#$%&'()#)
Da das Netz nicht nur vergröbert werden soll, sondern bei Bedarf auf wieder verfeinert werden
*+",-*+./*,./*
muss, wird dieOperation:
FunktionVertex
zum Split
Vergröbern
umgekehrt.
Man erhält so die Funktion Vertex Split
$./.v’s /v’t0
0
0
:#&
:)31%"
%#"%"
+5";(
die die
Vergröberung
wieder rückgängig macht. Dazu wird ein Punkt vs
vt ),
vspl(vs , vl , vr , v9 s ,:#&*:)31%"*%#"%"*+5";(*
in
wieder in eine Gerade
(vs0 , vt0 ) aufgeteilt, wie
9 5"-*(%#1%"*#3"*,5<*#"*-#%*6,"(%**1
+./*1
&. Abbildung 6.11 dargestellt.
*+",-*+./*,./*$./.v’s /v’t0
*,
*+
*$
*1&
*,
*$
*1+
Abbildung 6.11: Arbeitsweise des Vertex Split Algorithmus bei Verwendung von Progressive
Meshes.
A/&1%'5"2*B012/&#(34%"*#"*-%&*C/475(%&2&,<#;DE*FF*GHHI
=,((3#,'*>#'?3%&
@@
Das resultierende Netz besitzt damit einen Knoten und zwei Dreiecke mehr. Dazu müssen
die neu entstandenen Knoten vs0 und vt0 gespeichert werden.
Man erhält nun den reversiblen Prozess durch eine Folge von Vertex Split Operationen und
eine Folge von verfeinerten Netzen bis hin zum Original Polygonnetz.
AlgoCG 09
86
Kapitel 6. Level of Detail
Über die Verwendung von Edge Collapse und Vertex Split kann nun beliebig zur Laufzeit
zwischen verschiedenen Detailgraden gewechselt werden.
6.5.3 Messung der Qualität
Mit der Qualitätsmessung sollen Kanten identifiziert werden, die sich besonders gut eignen,
um sie zu entfernen. Dabei sollen mehrere Eigenschaften des Modells möglichst erhalten
bleiben:
• Geometrie, d.h. Ecken, Kanten, Rundungen
• Skalare, d.h. Farben
• Diskontinuitäten, d.h. Normalen, Materialien
Dazu wird eine Energiefunktion definiert, die diese Eigenschaften quantitativ ausdrückt.
Diese Energiefunktion ist definiert als:
E(M ) = Egeo (M ) + Escalar (M ) + Edisc (M )
Dabei ist
• Egeo (M ) ein Maß für die geometrische Abweichung des reduzierten Netzes vom Original
• Escalar (M ) ein Maß für die Genauigkeit von skalaren Werten
• Edisc (M ) ein Maß für die Abweichungen von diskontinuierlichen Werten
Alle Funktionen sind Heuristiken und können keine Garantie für eine genaue bzw. qualitativ hohe Wiedergabe geben. Es sind andere Bewertungsfunktionen oder Definitionen der
einzelnen Terme möglich.
6.5.4 Verfeinerungsalgorithmus
Der Algorithmus nutzt eine PriorityQueue, in der alle Edge-Collapse Operationen
ecol(vs , vt , vs0 ) gespeichert sind. Der Schlüssel ist die Veränderung der Energiefunktion ∆E,
die die Anwendung der Operation ecol(vs , vt , vs0 ) nach sich ziehen würde. Dabei wird eine
kleine Änderung bevorzugt. Das Verfahren fasst Algorithmus 19 zusammen.
Die Berechnung des PM-Modells wird im Preprocessing durchgeführt. Zur Laufzeit wird
dann mit der PM-Repräsentation eine Verfeinerung oder Vergröberung der aktuellen Auflösung vorgenommen.
AlgoCG 09
87
Kapitel
LevelINSTITUT
of Detail
HEINZ6.
NIXDORF
Progressive Polygonnetze
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
!"#$"%&"'
Algorithmus 19 Erzeuge Progressive Mesh
Level of
Detail
1: Continuous
function E RZEUGE
PM(originalesNetz
M)
0
2: 9 -#%*6/471%8#()(*%#"%'*:%(;%'*1)''(*'#<3*?.%1#%.#2
Initialisiere
Priority-Queue
mit
allen
Operationen
s , vt , vs )
-#% 6/471%8#()( %#"%' :%(;%' 1)''( '#<3
.%1#%.#2=ecol(v
*>%#"*&%2%1"
>%#" &%2%1"
3:
repeat
9
-#%*@1%#"'(%*A#"3%#(*#'(*B*6"/(%"*-%'*+/1C2/""%(;%'*
4:
wende oberstes Element der Queue ecol(vs , vt , vs0 ) an
5:
aktualisiere Schlüssel der Elemente in der Nachbarschaft der eliminierten Kante
(vs , vt )
6:
until gewünschte Auflösung erreicht oder Queue leer
7: end function
()
*+,-)
*+,-.
*+,-/0.
*+,-"0.
(/
()
2
("1(
(/
Abbildung 6.12: Anwendung der Progressive Meshes für kontinuierliches LOD.
FG
D,((3#,'*E#'<3%&
HEINZ NIXDORF INSTITUT
H/&1%'5"2*I012/&#(34%"*#"*-%&*J/475(%&2&,>#@KL*MM*NOOP
6.5.5
Progressive Polygonnetze
Anwendungen
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
!"#$"%&"'
Eine Anwendung für Progressive Meshes ist das kontinuierliche Level of Detail, da sich die
Komplexität +&/2&%''#$%*9&,"'4#''#/"
des Netzes „beliebig“ fein regeln lässt. Die kleinste Einheit ist 1 Knoten des Polygonnetzes. Man
Auflösungen um< %#"*+/1=2/""%(>*?#&-*'5:>%''#$%*;.%&*%#"%"*6,",1*;.%&(&,2%"
# kann
+ 1 somit fast
# - stufenlos
:
# zwischen
;.
# den
6 verschiedenen
1 ;.
schalten, wie in Abbildung 6.12 angedeutet.
< ?)3&%"-*-%&*@.%&(&,25"2*?#&-*-,'*A/-%11*.%&%#('*-,&2%'(%11(
Eine zweite Anwendung ist eine progressive Übertragung (progressive Transmission). Da< -#%*B,&'(%115"2'D5,1#()(*$%&C%#"%&(*'#E3*?)3&%"-*-%&*@.%&(&,25"2
-# Bzunächst
( 11 in einer
1#()(groben
C # Auflösung
( # 3 )3 übertragen
- - @. und
( anschließend werden
bei wird das Modell
die Verfeinerungen übertragen. Damit kann das Modell schon während der Übertragung dargestellt werden.
Die?#%
Darstellungsqualität
F3"1#E3
F3"1#E3*?#%*7&/2&%''#$%*G7%2
7&/2&%''#$% G7%2 verfeinert sich dann im Laufe der Übertragung, ähnlich wie dies auch bei progressive jpeg durchgeführt wird. Das Verfahren illustriert Abbildung
6.13
H%#(
()
-#%'%&*9%#1*#'(*
.%#4*
I47C)"2%&
I47C)"2%&*
,"2%:/44%"
*+,-)
*+,-.
*+,-/0.
*+,-"0.
()
M/&1%'5"2*N012/&#(34%"*#"*-%&*O/475(%&2&,C#:PQ*RR*STTU
(/
1
(
A,((3#,'*J#'E3%&
KL
Abbildung 6.13: Anwendung der Progressive Meshes für progressive Übertragung.
AlgoCG 09
88
7 Aspect Graph und Viewpoint Space
Partition
Die Viewpoint Space Partition und der dafür erzeugte Aspect Graph dienen zur Bilderkennung. Die Idee ist es, alle möglichen Ansichten eines Objektes zu speichern und das gerade
aufgenommene Bild mit diesen Ansichten zu vergleichen. Alle Ansichten, die die gleiche
Bild-Topologie darstellen, werden zu Klassen, den sogenannten Aspekten zusammengefasst.
Die Grundlage für diese Betrachtungen sind Polyeder, die aus Polygonen zusammengesetzt
sind. Dabei gehört jede Kante zu genau zwei Polygonen. Man kann zwischen konvexen und
nicht konvexen Polyedern unterscheiden. In einem konvexen Polyeder verläuft eine gerade
Verbindungslinie von zwei beliebigen Punkten immer innerhalb des Polyeders.
Eine Ansicht ist nun eine 2-dimensionale Projektion der Ecken und Kanten des Polyeders.
Dabei werden Kreuzungen von Linien zu Punkten, zusammentreffenden Linien zu Punkten
und Linien zwischen den Punkten zu Kanten.
7.1 Viewpoint Space Partition
Die Menge aller möglichen Bildpunkte wird in Regionen unterteilt. Innerhalb einer Region
bleibt das Erscheinungsbild gleich, d.h. es gibt nur Änderungen „topologischer Art“. Dabei
ist nur eine Änderung der Struktur von Ecken und Kanten wichtig, nicht aber die Länge der
Kanten.
Die Regionen mit gleichem Erscheinungsbild haben Grenzen an denen sich das Erscheinungsbild ändert. Diese Änderungen werden Ereignisse genannt. Bei konvexen Polyedern
tritt ein Ereignis nur dann auf, wenn sich ein Polygon vom Betrachter wegdreht. Solange man
immer nur die gleichen Flächen, Kanten und Punkte eines Polyeders sieht, ändert sich die Region nicht. Sobald eine neue Fläche sichtbar wird, geschieht ein Ereignis. Abbildung 7.1 zeigt
ein Tetraeder als Beispiel für einen solchen konvexen Polyeder. Der Tetraeder besteht aus 4
Polygonen A, B, C und D.
Für diesen Tetraeder gibt es verschiedene Ansichten, von denen aus unterschiedliche Kombinationen der Seitenflächen sichtbar sind, dies sind die Regionen für den Tetraeder. Die verschiedenen Regionen zeigt Abbildung 7.2. Man nennt diese Aufteilung auch die Viewpoint
Space Partition.
Die VSP wird über eine orthographische Projektion dargestellt. Dies ist eine Parallelprojektion, bei der alle Projektionslinien senkrecht zur Projektionsebene verlaufen. Zur Bestimmung des Blickpunktes reicht damit ein Richtungsvektor aus. Alle möglichen Blickpunkte
lassen sich als Kugeloberfläche einer Einheitskugel im 3-dimensionalen Raum beschreiben.
Abbildung 7.3 zeigt die zwei Parameter, über die der Blickpunkt charakterisiert wird.
89
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
Kapitel 7. Aspect Graph und Viewpoint Space Partition
VSP)
-#%*<#%=7/#"(
>7,?%*
*%&2%.%"*-#%*<#%=7/#"(
>7,?%*
*-,'*(/7/1/2#'?3%*
/2#'?3%*
A%-%&'*21%#?3
#?3
/1A%-%&'*-,&C
Abbildung 7.1: Tetraeder.
,&C
!"#$%&#'()*+,&#-!*+#%"#.+/0&%1&/,%22#/34%&/4#5%/$6#7&83""4#"-2#$%&#9%*+4/%*+4!21#:!6#";<#)77%=$!21#>#
Abbildung 7.2: Viewpoint
0&%14#&%2&#2&1-4%?&#"#!2$#@3,%4%?&#!#A34-4%32
. Space Partition für den Tetraeder.
#
FF
D,((3#,'*E#'?3%&
B
5(%&2&,I#JKL*>>*MNNO
D
FF
D,((3#,'*E#'?3%&
"
'
D
!
:C6C6D;
0
#
Abbildung 7.3: Die Blickpunkte !""#$%&'()*+)
liegen auf der Oberfläche der Einheitskugel.
,-.)/&'01)2!3"4)5&6)%-.)7#'8-#190&(-$):-#(1))
-#'-);#<81.#<81&'():&=)>.9?.&'()%-9)@AA.%#'51-'9B91-=9)2C3B3:4+#
#
E%&# F3@3=31%&# $&,# G%=$&,# 8-22# ,%*+# "%4# $&/# H2$&/!21# ?32# 9%*+4@!284&2# I2$&/2<# E%&,&# H2$&/!21&2#
2&224#"-2#7.-#('#99-<#J%2#7.-#('#9#8-22#2%*+4#2!/#7&%"#)!K4-!*+&2#3$&/#L&/,*+5%2$&2#?32#A&1%32&2#
AlgoCG 09
90
%"#G%=$#-!K4/&4&26#,32$&/2#-!*+#7&%#&%2&/#H2$&/!21#$&/#)20-+=#$&/#M-24&2#%2#&%2&/#A&1%32<#)77%=$!21#
N#0&%14#&%2#,3=*+&,#J/&%12%,<#E%&#9%*+4@!284&6#%2#$&2&2#J/&%12%,,&#-!K4/&4&26#=%&1&2#-!K#$&2#O/&20&2#
$&/#A&1%32&2#$&,#9%*+4@!284/-!",6#%2#$&2&2#$%&#P&=4#$-,,&=7&#43@3=31%,*+&#)!,,&+&2#+-46#$<#+<#$%&#
94/!84!/#$&/#Q%2%&2#!2$#%+/&/#9*+2%44@!284&2#%"#G%=$#1=&%*+#,%2$<
Kapitel 7. Aspect Graph und Viewpoint Space Partition
Der Winkel θ beschreibt die Drehung bezüglich des Basis Vektors (0, 0, 1). Diese Drehung
kann positiv oder negativ sein. Der Winkel ϕ beschreibt die Drehung nach oben oder unten.
Damit lässt sich jeder Punkt der Oberfläche referenzieren. Für den Tetraeder gibt es für jede
Teilmenge seiner vier Seiten, d.h. für jedes Element der VSP eine geschlossene Region auf
der Kugeloberfläche.
7.2 Aspect Graph
Der Aspect Graph ist eine vereinfachte Darstellung der VSP. Für jede Region gibt es einen
Knoten. Eine Kante existiert zwischen zwei Knoten, falls die Regionen benachbart sind. Einen
Aspect Graphen für die VSP aus Abbildung 7.2 ist in Abbildung 7.4 dargestellt.
$#
!#
!$#
!
!"#
!$
!"
!$"
$
#
"#
"
$"
$"#
Abbildung 7.4: Aspect Graph zu einer VSP.
!""#$%&'()*+)!,-./0)123-4)562).#'.')7.023.%.2+)
Für die Abschätzung der Größe des Aspect Graph ist zunächst die Beobachtung wichtig,
dass
Oberfläche
derkonvexe
Einheitskugel
von jeder Polygonfläche in zwei Hälften geteilt wird.
3.2die
Aspekt
Graph für
Polyeder
% Grenze dieser zwei Hälften sind alle Blickpunkte, von denen die Blickrichtung parallel
Die
zur&'%()*+*,%-./)0*1%2*3(*'%'43%()*%56'7*8*'%961:*(*3%;*03.<=0*0>%#)*+*%?)'+<=3@'54'A%7*3*)'B.<=0%(.+%
Oberfläche läuft. Man erhält die Blickrichtungen, indem man die Kugel mit der Ebene
936;1*,C%(*''%()*%D63(*3+*)0*%76'%*)'*,%56'7*8*'%961:*(*3%)+0%),,*3%7611+0@'()A%+)<=0;.3C%(>=>%*)'*%
schneidet,
die durch oder parallel zum Polygon verläuft und durch den Ursprung geht. Diesen
E1@<=*%7*3(*<50%5*)'*%.'(*3*%E1@<=*>%#)*%*)'F)A*%G*)+*C%(.++%()*%E1@<=*%4'+)<=0;.3%2*3(*'%5.''C%)+0%
;*)%*)'*3%#3*=4'A%2*A%76,%$*03.<=0*3%H482#98'03$.)://$&,#8'I>%&,%56'7*8*'%E.11%5J''*'%F2*)%-'60*'%
Schnitt
nennt man auch den Great Circle.
(*+% !+/*50% K3./=+% ')<=0% ()*+*1;*% -1.++*% 76'% !'+)<=0*'% 3*/3@+*'0)*3*'>% G*''% ()*+*1;*% -1.++*% 76'%
Durch den Schnitt aller Great Circles von allen Polygonen erhält man die Partition der
!'+)<=0*'%.4+%F2*)%L)<=0/4'50*'%+)<=0;.3%)+0C%+6%)+0%+)*%.4+%.11*'%L)<=0/4'50*'C%()*%.4B%(*,%5M3F*+0*'%
Kugeloberfläche
in verschiedene Regionen. Die einzelnen Regionen werden durch Kreisab9B.(%F2)+<=*'%()*+*'%L)<=0/4'50*'%1)*A*'C%+)<=0;.3>%
?)'*% E1@<=*%
*)'*+%Dabei
56'7*8*'%
961:*(*3+%
)+0% % .4+%
N*(*3%durch
L)<=03)<=04'A%
+)<=0;.3C%
.4B% ()*%
D63(*3+*)0*%
schnitte
begrenzt.
wird
jeder Great
Circle
den Schnitt
mit()*%
einem
weiteren
Great
()*+*3% E1@<=*% F*)A0>% G*''% d% *)'*% L)<=03)<=04'A% 4'(% n% *)'*% O63,.1*% F4% ()*+*3% E1@<=*% +)'(C% (.''% )+0%
Circle
in genau zwei Kreisabschnitte geteilt. Für n Polygonflächen erhält man n Great Circles
(.+%(*3%E.11C%2*''%n Pd Q%R%)+0>%#)*%K3*'F*%F2)+<=*'%(*'%+)<=0;.3*'%S*A)6'*'C%)'%2*1<=*'%()*%E1@<=*%
von
denen
jeder
die
anderen
Great
Circles
n Kreisabschnitte
wird.
Man
erhält
+)<=0;.3% 4'(%
)'% durch
2*1<=*'%
+)*%
4'+)<=0;.3%
)+0C% )+0%
(43<=%in
(*')
;2.#,% Td :% n PdU% Rzerteilt
V% (*B)')*30>%
#.+%
)+0% (*3%
2
L<=')00/4'50%(*3%-4A*1%,)0%*)'*3%?;*'*C%()*%(43<=%(*'%W3+/34'A%A*=0%4'(%630=6A6'.1%F4%'%)+0>%
also O(n ) viele Kreisabschnitte. Da jeder Kreisabschnitt an genau zwei Regionen grenzt,
?)'%56'7*8*%961:*(*3%,)0%'%E1@<=*'%=.0%(.''%'%-3*)+*>%#)*%0*)1*'%(*'%L)<=03.4,%)'%*)'*%W'0*30*)14'AC%
gibt
es auch O(n2 ) Regionen und damit einen Aspect Graph der Größe O(n2 ). Diese Größen)'%(*3%()*+*1;*%X*'A*%76'%E1@<=*'%.4+%.11*'%L)<=0/4'50*'%(*3%S*A)6'%+)<=0;.3%)+0>%#)*+*%W'0*30*)14'A%
schranke
ist eng. Ein Beispiel für einen solchen Polyeder ist das in Abbildung 7.5 dargestellte
)+0%.1+6%()*%DL9>%Y2*)%-3*)+*%5J''*'%/..32*)+*%M;*3*)'+0),,*'%6(*3%+)<=%)'%F2*)%94'50*'%+<='*)(*'>%
^
I%
G*3(*'%M;*3*)'+0),,*'(*%-3*)+*%.4Z*3%.<=0%A*1.++*'C%+6%=.;*'%'%-3*)+*%=J<=+0*'+%'H'[\I%U%]H'
Objekt.
L<=')00/4'50*>%!1+6C%)+0%()*%K3JZ*%(*3%DL9%]H'_I>%#*3%!+/*50%K3./=%)+0%(4.1%F43%DL9%4'(%5.''%.4+%
DerDL9%
Polyeder
besteht
aus )'(*,%
zwei Bändern,
die jeweils
aus,.<=0C%
Quadraten
bestehen.()*%S*A)6'*'%
Die Quadrate
(*3%
56'+034)*30%
2*3(*'C%
,.'% S*A)6'*'%
F4% -'60*'%
4'(% ()*%-.'0*'C%
03*''*'C%
(*'%
-.'0*'C% ()*%
;*'.<=;.30*%dass
-'60*'%
#.+% 5.''%
(*3% jewerden
soF4%
mit
Dreiecken
verbunden,
der7*3;)'(*'C%
Polyeder@'(*30>%
geschlossen
ist.)'% 1)'*.3*%
Wählt Y*)0%
man)'%aus
K3JZ*%(*3%DL9%56'+034)*30%2*3(*'>%#.,)0%%5.''%(*3%!+/*50%K3./=%)'%]H'_I%56'+034)*30%2*3(*'>
%
dem Band ein Quadrat aus, erhält man für diesen Körper bei jedem Great Circle zwei Schnitt-
AlgoCG 09
91
HEINZ NIXDORF INSTITUT
Graph und Viewpoint Space Partition
!"#$%&'#()(*+,-%&./&"
012/&#(34%"*5"-*6/471%8#()(
Kapitel 7. Aspect Graph und Viewpoint Space Partition
der VSP (untere Schranke)?
:;3&,"<%*=>"?@*-%'*A:+*%"2B
2%"*-,'*,"*G/12%"-%4*+/1H%-%&
'(%3(*,5'*FJ%#*K)"-%&"
%'*K,"-*,5'*%#"F%1"%"*<1%#"%"*M5,-&,(%"
Abbildung 7.5: Polyedermodell zur Illustration der Größenschranke.
.#"-%*-#%*M5,-&,(%*'/*5"(%&%#","-%&N*-,'*-%&*+/1H%-%&*
';31/''%"*J#&-
punkte auf der Einheitskugeloberfläche. Diese bilden die Punkte des VSP, wobei alle Paare
von Quadraten unterschiedliche Schnittpunkte liefern. Man erhält so eine Größe von Ω(n2 )
für den Aspect Graph.
Betrachtet man nun an Stelle der orthographischen Projektion eine perspektivische ProjekQR
O,((3#,'*P#';3%&
tion, so ist ein Blickpunkt kein Punkt der Kugeloberfläche
mehr,
sondern ein beliebiger Punkt
3
im R . Das Polygon ist von allen Punkte aus sichtbar, die vor dem Polygon im Raum liegen.
Damit wird der R3 also durch die Ebene, die durch das Polygon verläuft, in zwei Halbräume
geteilt. Der Schnitt aller Ebenen ergibt dann die VSP.
In jeder Ebene entstehen Schnittgeraden durch den Schnitt mit den übrigen Ebenen. Durch
die Schnittgeraden entstehen wiederum Schnittpunkte in der Ebene und Geradenabschnitte
zwischen den Schnittpunkten. Jeder Geradenabschnitt begrenzt jeweils zwei Flächenstücke
der VSP. Durch den Schnitt mit O(n) Ebenen entstehen O(n) Geraden in der Ebene. Durch
die Schnitte der Geraden untereinander erhält man O(n2 ) Geradenabschnitte in jeder Ebene.
Da die Geradenstücke die Flächenstücke der VSP begrenzen, erhält man somit O(n2 ) Flächenstücke pro Ebene. Insgesamt erhält man damit für alle n Ebenen O(n3 ) Flächenstücke,
die die VSP begrenzen. Da auf jeder Seite des Flächenstücks genau eine Zelle der VSP ist, erhält man O(n3 ) Regionen und somit einen Aspect Graph der Größe O(n3 ). Über den Polyeder
in Abbildung 7.5 kann man wieder zeigen, dass diese Schranke eng ist.
A/&1%'5"2*S012/&#(34%"*#"*-%&*T/475(%&2&,G#<UN*::*VWWX
AlgoCG 09
92
Abbildungsverzeichnis
1.1
1.2
Rendering Pipeline. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Entlastung der Rendering Pipeline. . . . . . . . . . . . . . . . . . . . . . . .
1
3
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9
2.10
2.11
2.12
2.13
2.14
2.15
2.16
Orthogonale Bereichsanfrage: Punkte bestimmen, die im Rechteck liegen. . .
Beispiel für einen kd-Baum. . . . . . . . . . . . . . . . . . . . . . . . . . .
Zweites Beispiel für einen kd-Baum. . . . . . . . . . . . . . . . . . . . . . .
Regionen in einem kd-Baum. . . . . . . . . . . . . . . . . . . . . . . . . . .
Auswertung von Regionen in einem kd-Baum. . . . . . . . . . . . . . . . . .
Geschnittene Regionen bei vertikaler Gerade und vertikaler Splittinggerade. .
Geschnittene Regionen im kd-Baum. . . . . . . . . . . . . . . . . . . . . . .
Aufteilung einer Gruppierung von Dreiecken durch eine Splittinggerade. . . .
Autopartition einer Menge von Geraden im 2D. . . . . . . . . . . . . . . . .
Benennung der Elemente des BSP für den Painter’s Algorithmus. . . . . . . .
Aufbau eines 2D BSP-Baums. . . . . . . . . . . . . . . . . . . . . . . . . .
Anzahl zerteilter Segmente bei Wahl von si . . . . . . . . . . . . . . . . . . .
Ein Splittingsegment schützt ein anderes Segment. . . . . . . . . . . . . . .
Polygone als Splittingebenen im 3D. . . . . . . . . . . . . . . . . . . . . . .
Beispiele für Free-Splits. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Unterschiede in der Arbeitsweise zwischen rekursivem und iterativem Algorithmus. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Nachweis einer unteren Schranke für die Anzahl von Fragmenten. . . . . . .
Aufbau eines Quadtrees. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Aufbau eines Octrees. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Speicherung von Dreiecken in einem Quadtree. . . . . . . . . . . . . . . . .
Größe von Qudraten in Ebene i in einem Quadtree. . . . . . . . . . . . . . .
Nordnachbar eines Knotens v. . . . . . . . . . . . . . . . . . . . . . . . . .
Suche des Nordnachbarn zu einem Knoten v. . . . . . . . . . . . . . . . . .
Unbalancierter Quadtree. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Balancierter Quadtree. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Unbalancierte Quadtree Situationen. In (a) ist die Ausgangssituation unbalanciert, in (b) entsteht die unbalancierte Situation durch Aufteilung von σ(v). .
Balancierung eines Quadtree. . . . . . . . . . . . . . . . . . . . . . . . . . .
Auswirkung der Balancierung eines SE-Quadrats. . . . . . . . . . . . . . . .
Auswirkung der Balancierung eines Quadrats auf benachbarte Knoten. . . . .
Objekte, die Splittinggeraden schneiden, liegen in großer Bounding-Box. . .
Größe der Bounding-Box und Abstand der Mittelpunkte. . . . . . . . . . . .
4
5
5
7
8
9
9
10
11
11
13
14
15
16
17
2.17
2.18
2.19
2.20
2.21
2.22
2.23
2.24
2.25
2.26
2.27
2.28
2.29
2.30
2.31
93
18
19
19
20
20
22
23
24
25
25
26
27
28
28
30
31
Abbildungsverzeichnis
2.32 Vergrößerte Bounding-Boxen im Loose Octree . . . . . . . . . . . . . . . .
2.33 Überlappungsbereiche in Abhängigkeit des Parameters k. . . . . . . . . . . .
2.34 Kinder decken den Raum der Eltern nicht mehr vollständig ab. . . . . . . . .
31
32
32
3.1
3.2
3.3
Übersicht über verschiedene Culling Techniken. . . . . . . . . . . . . . . . .
Abhängigkeit der Tiefenkomplexität vom Standpunkt. . . . . . . . . . . . . .
(a) zeigt einen exact visibility Test, (b) einen conservative Test und (c) einen
approximative Test. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Wände (schwarz) und Portale (rot gestrichelt), die verschiedene Zellen definieren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Sichtbarkeit verschiedener Räume mit einem gegebenen Adjazenzgraphen. .
Für einen Grundriss zeigt (a) eine spanning face und (b) die Zellen mit dem
Adjazenzgraphen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Stabtree zu einer Menge von Zellen. . . . . . . . . . . . . . . . . . . . . . .
Für den Grundriss in (a) zeigt (b) eine existierende lineare Trennung und (c)
eine zweite. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Vier Methoden für die Berechnung der Eye-to-cell visibility. . . . . . . . . .
Dynamische Berechnung der PVS. . . . . . . . . . . . . . . . . . . . . . . .
Vollständige Verdeckung von Objekten durch ein größeres Objekt. . . . . . .
Prüfe für eine achsenparallele Boundingbox ob Teile von ihr unsichtbar sind.
Aufbau der Z-Pyramide. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Propagierung der Z-Werte in der Pyramide. . . . . . . . . . . . . . . . . . .
Prüfung der Sichtbarkeit von Dreiecken auf dem gröbsten möglichen Level. .
Abstieg in der Z-Pyramide zur Auflösung kleiner Elemente, die große Boxen
schneiden. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Verdeckungspotential verschieden großer Occluder. . . . . . . . . . . . . . .
Verdeckungspotential eines aggregierten Occluders. . . . . . . . . . . . . . .
Ablauf des Rendering unter Verwendung von HOM Culling. . . . . . . . . .
Occlusion-Map Hierarchie. . . . . . . . . . . . . . . . . . . . . . . . . . . .
Tiefentest der überlappenden Occludees, (a) zeigt die Variante mit einer zEbene, (b) zeigt die Variante mit mehreren z-Partitionen. . . . . . . . . . . .
Ausführung des Tiefentests, (a) zeigt die 2D Projektion von Occluder und
Occludee, (b) zeigt eine 3D Übersicht mit eingezeichneten z-Ebenen. . . . .
35
36
Generelle Idee der Color-Cubes. . . . . . . . . . . . . . . . . . . . . . . . .
Ein Color-Cube mit unterschiedlichen Seitenfarben, die die unterschiedlichen
orthogonalen Aufsichten approximieren . . . . . . . . . . . . . . . . . . . .
Rendering mit Color-Cubes. Für die grünen Zellen wird die Geometrie gerendert, für die blauen der Color-Cube gezeichnet und die roten liegen außerhalb
des Frustums. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Berechnung des initialen Farbwerts eines Color-Cubes. . . . . . . . . . . . .
Berechnung des Farbwerts eines Color-Cubes für einen inneren Knoten. . . .
Aufteilung in Nah- und Weitbereich für das Rendern der Szene. . . . . . . .
56
3.4
3.5
3.6
3.7
3.8
3.9
3.10
3.11
3.12
3.13
3.14
3.15
3.16
3.17
3.18
3.19
3.20
3.21
3.22
4.1
4.2
4.3
4.4
4.5
4.6
AlgoCG 09
37
38
39
40
41
41
43
44
45
46
47
47
48
48
50
50
51
52
54
54
57
57
58
59
60
94
Abbildungsverzeichnis
4.7
4.13
Artefaktbildung bei langen, gekrümmten Oberflächen, in der Aufsicht ((a))
sind die Color-Cubes undurchsichtig, von der Seite ((b)) erscheinen sie teilweise transparent. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Schräge Aufsicht auf gekrümmte Oberfläche aus Color-Cubes kann zu Löchern führen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Artefaktbildung durch benachbarte Zeichnung von Color-Cube und Geometrie.
Objekte werden in eine Textur gerendert und erst bei großer Kameraverschiebung neu gerendert. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Wahl der Splittingebenen. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Berechnung der Splittingebenen. (a) zeigt die Ausgangssituation, (b) die beiden Listeneinträge und (c) den Korridor mit den wenigsten geschnittenen Objekten. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Fehlermetrik für das Hierarchical Image Caching. . . . . . . . . . . . . . . .
5.1
5.2
5.3
5.4
5.5
5.6
5.7
5.8
5.9
5.10
5.11
5.12
5.13
Die Hauptschritte des Rendering. . . . . . . . . . . . . . . . . . . . . . . .
Parallelisierte Rendering Architektur. . . . . . . . . . . . . . . . . . . . .
Aufteilung in Kacheln beim Sort-First Ansatz. . . . . . . . . . . . . . . . .
Berechnung und Zusammensetzung der Einzelbilder beim Sort-First Ansatz.
Probleme bei der Anwendung von Sort-First. . . . . . . . . . . . . . . . .
Aufteilung der projizierten 2D-Polygone auf Kacheln. . . . . . . . . . . . .
Vorteil und Problem bei der Anwendung von Sort-Middle. . . . . . . . . .
Berechnung der Einzelbilder bei Sort-Last. . . . . . . . . . . . . . . . . . .
Zusammensetzung der Einzelbilder zu einem Gesamtbild bei Sort-Last. . .
Idee der Partitionierung beim Hybrid-Sort . . . . . . . . . . . . . . . . . .
Ablauf des Rendering beim Hybrid-Sort . . . . . . . . . . . . . . . . . . .
Partitionierung der Szene mit Sweep-Lines. . . . . . . . . . . . . . . . . .
Illustration der Berechnung der Kommunikations-Overhead . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
69
69
71
71
72
72
73
73
74
75
76
77
78
6.1
6.2
6.3
LOD-Modelle für verschiedene Entfernungen. . . . . . . . . . . . . . . . . .
LOD Hierarchie nach Clark. . . . . . . . . . . . . . . . . . . . . . . . . . .
Verwendung der Hierarchie für sichtpunktabhängiges LOD und ViewFrustum-Culling. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Arbeitsweise des Decimation Algorithmus. . . . . . . . . . . . . . . . . . .
Arbeitsweise des Sampling Algorithmus. . . . . . . . . . . . . . . . . . . . .
Verlust von scharfen Kanten bei der Anwendung des Sampling Algorithmus. .
Arbeitsweise des Vertex Merging Algorithmus. . . . . . . . . . . . . . . . .
Arbeitsweise des Adaptive Subdivision Algorithmus. . . . . . . . . . . . . .
Arbeitsweise des Edge Collapse Algorithmus bei Verwendung von Progressive Meshes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Positionierung des neuen Punktes bei Ausführung von Edge Collapse. . . . .
Arbeitsweise des Vertex Split Algorithmus bei Verwendung von Progressive
Meshes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Anwendung der Progressive Meshes für kontinuierliches LOD. . . . . . . . .
Anwendung der Progressive Meshes für progressive Übertragung. . . . . . .
79
81
4.8
4.9
4.10
4.11
4.12
6.4
6.5
6.6
6.7
6.8
6.9
6.10
6.11
6.12
6.13
AlgoCG 09
61
61
62
63
65
66
67
81
83
83
84
84
85
85
86
86
88
88
95
Abbildungsverzeichnis
7.1
7.2
7.3
7.4
7.5
Tetraeder. . . . . . . . . . . . . . . . . . . . . . . . . . . .
Viewpoint Space Partition für den Tetraeder. . . . . . . . . .
Die Blickpunkte liegen auf der Oberfläche der Einheitskugel.
Aspect Graph zu einer VSP. . . . . . . . . . . . . . . . . . .
Polyedermodell zur Illustration der Größenschranke. . . . .
AlgoCG 09
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
90
90
90
91
92
96
Herunterladen