Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤...

122
Aufgaben und L ¨ osungen c Michael Bender, Manfred Brill Oktober 2005

Transcript of Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤...

Page 1: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

Aufgaben und Losungenc©Michael Bender, Manfred Brill

Oktober 2005

Page 2: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

Sie finden in diesem Dokument alle Aufgaben und die zugehorigen Losungen aus

Michael Bender, Manfred Brill: Computergrafik

2. Auflage, Hanser Verlag, Munchen, 2006

http://www.vislab.de/cgbuch

Diese Unterlagen wurden mit LATEX erstellt.

Page 3: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

Inhaltsverzeichnis

2 Grundlegende Verfahren und Techniken 1

2.1 Transformationen und Koordinatensysteme . . . . . . . . . . . . . . . . . . . . . . . 1

2.2 Projektionen und Kameramodelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

2.3 Clipping und Rasterung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

2.4 Sichtbarkeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

2.6 Fallstudien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

2.6.1 Transformationen und Hierarchien in OpenGL . . . . . . . . . . . . . . . . . 7

2.6.2 Hierarchien in VRML und Alias MAYA . . . . . . . . . . . . . . . . . . . . . 16

2.6.3 Die virtuelle Kamera in OpenGL . . . . . . . . . . . . . . . . . . . . . . . . . 19

2.6.4 Clipping in OpenGL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

3 Geometrisches Modellieren mit Kurven und Flachen 25

3.2 Parameterkurven . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

3.3 Polynomiale Kurven . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

3.4 Bezier-Kurven und -Kurvensegmente . . . . . . . . . . . . . . . . . . . . . . . . . . 30

3.5 Interpolation und Splines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

3.6 B-Spline-Kurven . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

3.7 Parametrische Flachendarstellungen . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

3.10 Fallstudien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

3.10.1 Freiformgeometrie in OpenGL . . . . . . . . . . . . . . . . . . . . . . . . . . 45

4 Polygonale Netze 47

4.1 Polygone und Polyeder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

4.2 Datenstrukturen fur polygonale Netze . . . . . . . . . . . . . . . . . . . . . . . . . . 50

4.3 Dreiecksnetze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

Page 4: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

Inhaltsverzeichnis iii

4.4 Modellieren mit Netzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

4.5 Level-of-Detail und Vereinfachen von Netzen . . . . . . . . . . . . . . . . . . . . . . 63

4.7 Fallstudien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

4.7.1 Polygonale Netze in OpenGL . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

4.7.2 Fallstudie Platonische und archimedische Korper . . . . . . . . . . . . . . . 71

4.7.3 Fallstudie Polygonale Netze in Alias MAYA . . . . . . . . . . . . . . . . . . 78

5 Bildsynthese 80

5.7 (Anti-)Aliasing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

5.9 Fallstudien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81

5.9.1 Beleuchtung, Materialien und Schattierungen in OpenGL . . . . . . . . . . 81

5.9.2 Cg Vertex-Shader in OpenGL . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

5.9.3 GLSL Vertex- und Fragment-Shader . . . . . . . . . . . . . . . . . . . . . . . 83

5.9.4 Mapping in OpenGL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

6 Visualisierung 85

6.2 Datenstrukturen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85

6.3 Algorithmen fur skalare Attribute . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86

6.4 Direkte Volumen-Visualisierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88

6.5 Visualisierung von Vektorfeldern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89

6.7 Fallstudien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92

6.7.1 Die Visualisierungs-Pipeline in VTK . . . . . . . . . . . . . . . . . . . . . . . 92

6.7.2 Volumen-Visualisierung mit VTK . . . . . . . . . . . . . . . . . . . . . . . . 94

6.7.3 Visualisierung von Vektorfeldern mit VTK . . . . . . . . . . . . . . . . . . . 97

7 Computer-Animation 106

7.2 Basistechnologien und Interpolation . . . . . . . . . . . . . . . . . . . . . . . . . . . 106

7.3 Animation hierarchischer Objekte . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111

7.4 Prozedurale Animationstechniken . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

7.6 Fallstudien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

7.6.1 Key-Framing und Pfad-Animation in Alias MAYA . . . . . . . . . . . . . . . 115

7.6.2 Expressions in Alias MAYA . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

7.6.3 Partikelsysteme in Alias MAYA . . . . . . . . . . . . . . . . . . . . . . . . . . 116

Page 5: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

Inhaltsverzeichnis iv

Literaturverzeichnis 117

Page 6: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

Kapitel 2

Grundlegende Verfahren undTechniken

2.1 Transformationen und Koordinatensysteme

1. Gegeben ist eine beliebige Kombination von Punkten in einem affinen Raum: P = ∑ni=1 λiXi.

Weisen Sie nach, dass P ein Punkt ist im Fall ∑ λi = 1 und ein Vektor im Fall ∑ λi = 0! Hat dieKombination einen Sinn fur andere Werte der Summe ∑ λi?

Losung:Es gilt

n

∑i=1

λiXi =

(∑n

i=1 xi∑n

i=1 λi

).

falls die Punkte durch Xi = (xi , 1)T gegeben sind. Fur ∑ λi = 1 erhalt man einen Punkt furdie affine Kombination. Ist die Summe ∑ λi = 0, dann ist das Ergebnis ein Vektor. Hat dieSumme einen Wert ∑ λi 6= 0, dann kann durch diesen Wert dividiert werden; das Ergebnis istein Punkt.

2. Die Polygonzuge A und B sind gegeben durch die Ecken

A = {(1, 1), (−1, 1), (−1,−1), (1,−1)}, B = {(5,−2), (4, 3), (4, 0), (3,−2)}.

Skizzieren Sie die Polygonzuge tA + (1 − t)B fur t = −1,−0.5, 0.5, 1.5.

Losung:Die Polygonzuge A und B und die gesuchten Losungen finden Sie in Abbildung 2.1 auf Seite2.

3. Eine Reflexion an der x-Achse ist gegeben durch die 4 × 4-Matrix

Re fx =

1 0 0 00 −1 0 00 0 1 00 0 0 1

.

Stellen Sie die Matrix-Darstellung der Reflexion an einer beliebigen im Raum liegenden Linie,die durch den Ursprung geht, auf!

Page 7: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

2 Grundlegende Verfahren und Techniken 2

-

6

A

B

-

6 t = −1

t = −0, 5

t = 0, 5

t = 1, 5

Abbildung 2.1: Die Polygonzuge A, B und tA + (1 − t)B fur Aufgabe 2

Losung:Durch eine Koordinatentransformation wird die Gerade durch den Ursprung auf die x-Achseabgebildet; dann die Reflexion durchgefuhrt und anschließend wieder die Koordinatentrans-formation ruckgangig gemacht.

Die Koordinatentransformation beschreiben wir durch die beiden Winkel ϕ und θ. ϕ be-schreibt den Winkel zwischen der x-Achse und der Achse in der xy-Ebene, θ den Winkelzwischen x-Achse und der Achse in der xz-Ebene. Dann ist die allgemeine Reflexion an einerAchse gegeben durch Ry(−θ)Rz(ϕ)Re fxRz(−ϕ)Ry(−θ):

Re f =

cosθ2 cos 2ϕ − sinθ2 cosθ sin 2ϕ − sin 2θ sinϕ2

cosθ sin 2ϕ − cos 2ϕ sinθ sin 2ϕ− sin 2θ sinϕ2 sinθ sin 2ϕ cosθ2 + sinθ2 cos 2ϕ

Setzen Sie θ = ϕ = 0, dann erhalten Sie Re fx zuruck. Interessant ist der Fall θ = 0, einerReflexion an einer Achse in der xz-Ebene:

Re fθ=0 =

cos 2ϕ sin 2ϕ 0sin 2ϕ − cos 2ϕ 0

0 0 1

4. Leiten Sie die Matrix-Darstellung der Rotation um eine beliebige Achse im Raum mit Hilfevon Kugelkoordinaten und Matrix-Algebra her!

Losung:Analog zu Aufgabe 3 wird wieder die Drehachse durch die beiden Winkel ϕ,θ beschrieben.Dann ist die allgemeine Rotation mit Winkel β gegeben durch

Ry(−θ)Rz(ϕ)Rx(β)Rz(−ϕ)Ry(−θ).

Im Buch auf Seite 19 unten mussen Sie noch die Koordinaten der Drehachsen durch den Vek-tor (cosθ cosϕ, sinϕ, cosϕ sinθ)T ersetzen. Haben Sie sich dazu entschieden, die Drehachseauf die y oder z-Achse zu drehen, ergibt sich ein anderen Ausdruck, aber das gleiche Ender-gebnis.

5. Erstellen Sie einen Baum und einen gerichteten azyklischen Graphen fur ein einfaches Modellder Hierarchie eines Autos und eines Propellerflugzeugs!

Losung:Das Auto unterscheidet sich vom Fahrrad auf Seite 24 im Buch vor allem durch die Anzahl

Page 8: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

2 Grundlegende Verfahren und Techniken 3

Rahmen

Vorderrad links Vorderrad rechts Hinterrad links Hinterrad rechts

Rahmen

Rad

Rahmen

Vorderrad links Vorderrad rechts Hinterrad Propeller

Rahmen

Rad Propeller

Abbildung 2.2: Ein Auto (links) und ein Propellerflugzeug (rechts) als Baum und als gerichteter azyklischerGraph

der Rader. Beim Propellerflugzeug kommen zu den beiden Vorderradern ein Hinterrad undder Propeller hinzu.

Die Szenengraphen finden Sie in Abbildung 2.2 auf Seite 3.

2.2 Projektionen und Kameramodelle

1. Skizzieren Sie das Ergebnis der Parallelprojektion des Wurfels mit linker unterer Ecke im Ur-sprung und Seitenlange 1 fur n = 1

3

√3 (1, 1, 1)T , vup=(0, 1, 0)T .

Losung:Es ist

n =13

√3

111

,

u =12

√2

101

,

v =16

√6

−12−1

.

Wendet man die daraus entstehende Projektionsmatrix

KT =

u1 u2 u3v1 v2 v3n1 n2 n3

auf die acht Ecken des Wurfels an, erhalt man das Ergebnis wie in Abbildung 2.3 auf Seite 4.Es sollte Sie nicht uberraschen, dass das visuelle Ergebnis das gleiche wie in Abbildung 2.24auf Seite 29 im Buch ist.

2. Skizzieren Sie das Ergebnis einer Kavalier- und einer Kabinettprojektion mit α = 60◦ fureinen Wurfel!

Losung:Die Kavaliers- und Kabinettprojektion mit α = 60◦ finden Sie in Abbildung 2.4 auf Seite 4.

Page 9: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

2 Grundlegende Verfahren und Techniken 4

Abbildung 2.3: Die Losung fur Aufgabe 1

Abbildung 2.4: Die Kabinett- (links) und Kavalierprojektion mit α = 60◦

.

3. Berechnen Sie die Projektionsmatrix fur die Parallel- und Zentralprojektion fur Z = (3, 3, 3), H =

(0, 1, 0), vup = (0, 1, 0)T! Skizzieren Sie das Bild des Einheitswurfels durch diese Projektio-nen!

Losung:Das grafische Ergebnis sehen sie in Abbildung 2.5. Die Matrizen sind

Pparallel =

−0, 7071 0 0, 7071 0−0, 3015 0, 9045 −0, 3015 0

0 0 0 00 0 0 1

und

Ppersp =

3, 3166 0 −3, 3166 0−1, 4142 4, 2426 −1, 4142 −4, 2426

0 0 0 0−0, 6396 −0, 4264 −0, 6396 5, 11682

Abbildung 2.5: Die Parallel- (links) und Zentralprojektion fur Aufgabe 3

.

4. Die Linie L soll im Kamera-Koordinatensystem durch den Punkt A = (au, av, an) und denRichtungsvektor c gegeben sein als A + λc. Berechnen Sie das Ergebnis einer Zentralprojekti-

Page 10: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

2 Grundlegende Verfahren und Techniken 5

on dieser Linie! Betrachten Sie den Fall cn = 0, dass die Linie also parallel zur Projektionsebe-ne verlauft, und interpretieren Sie Ihr Ergebnis! Berechnen Sie den Fluchtpunkt der Geradenfur den Fall cn 6= 0!

Losung:Die Projektion der Geraden ist gegeben durch

X∗u(λ) = d

Au + λcu

−An − λcn, X∗

v (λ) = dAv + λcv

−An − λcn.

Fur den Fall cn = 0 ergibt dies die parametrische Form einer Geraden in der Bildebene mitSteigung cv

cu:

d−An

(Au + λcu, Av + λcv).

Dieses Bild ist unabhangig von der Position der Geraden, es kommt immer die gleiche Stei-gung heraus.

Fur den Fall cn 6= 0 mussen wir den Grenzwert λ → ∞ betrachten. Es ist

limλ→∞

= d(− cu

cn,− cv

cu).

Der Fluchtpunkt hangt nur vom Richtungsvektor ab! Also haben parallele Geraden alle dengleichen Fluchtpunkt.

2.3 Clipping und Rasterung

1. Drucken Sie die auf Seite 42 erlauterte Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche) Geratekoordinaten umwandelt,als eine homogene 3 × 3-Matrix aus!

Losung:Um die gesuchte 3 × 3 Matrix zu erhalten werden nacheinander die folgenden Transforma-tionen ausgefuhrt:

Translation des Fensters in den Koordinatenursprung des Bild-Koordinatensystems durchT(−umin,−vmin);

Skalierung der Fensters auf die Große des Viewports mit S( xmax−xminumax−umin

, ymax−yminvmax−vmin

);

Skalierung der zweiten Koordinate mit S(1,−1);

Translation des Viewports an die Position im Gerate-Koordinatensystem durch T(xmin, ymax).

Die Hintereinanderausfuhrung der Transformationen ergibt

T(xmin, ymax)S(1,−1)S(xmax − xminumax − umin

,ymax − yminvmax − vmin

)T(−umin,−vmin) =

xmax−xminumax−umin

0 − umin(xmax−xmin)umax−umin

+ xmin

0 − ymax−yminvmax−vmin

vmin(ymax−ymin)vmax−vmin

+ ymax

0 0 1

2. Leiten Sie die Projektionsmatrix M auf Seite 54 her, die den normalisierten Pyramidenstumpfder Zentralprojektion in den normalisierten Quader der Parallelprojektion transformiert!

Page 11: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

2 Grundlegende Verfahren und Techniken 6

Losung:Wir mussen einen Pyramidenstumpf auf einen Quader abbilden. Diese Abbildung wird durchdie Projektionsmatrix der Zentralprojektion geliefert. Linien parallel zur Projektionsrichtung,hier die negative n-Achse, werden auf Linien abgebildet, die sich im Zentralpunkt, hier demUrsprung, schneiden. Analog werden Linien, die sich im Zentralpunkt schneiden durch diegleiche Projektionsmatrix auf Linien abgebildet, die parallel zur Projektionsrichtung liegen.Und Linien, die orthogonal auf der Projektionsrichtung stehen bleiben orthogonal. Also ge-nau das, was wir suchen.

Wir setzen die Projektionsmatrix an als

P =

1 0 0 00 1 0 00 0 a b0 0 −1 0

.

Dies entspricht einer Zentralprojektion mit Zentralpunkt im Ursprung und Projektionsrich-tung −n. Die Zahlen a und b bestimmen wir jetzt so, dass Punkte in der Ebene n = −1 indieser Ebene bleiben. Und die Punkte in der Ebene

n = nmin

sollen auf n = 1 abgebildet werden. Wendet man die Matrix P auf einen Punkt in homogenenKoordinaten an, dann gilt

P

uvn1

=

1 0 0 00 1 0 00 0 a b0 0 −1 0

uvn1

=

uv

a · n + b−n

=

− un

− vn

− a·n+bn

1

.

Die beiden Bedingungen an die Ebenen n = −1 und n = mmin ergeben ein lineares 2 × 2-Gleichungssystem fur a und b:

a(−1) + b = −1,a · nmin + b = −nmin.

Daraus ergibt sich fur nmin 6= −1 die Losung

a =1 − nmin1 + nmin

,

b = − 2nmin1 + nmin

.

3. Fuhren Sie nach den angegebenen Regeln eine vollstandige Rasterung des in Abbildung 2.61gezeichneten Polygons durch!

Losung:Die Losung finden Sie in Abbildung 2.6 auf Seite 7.

2.4 Sichtbarkeit

1. Losen Sie fur eine Szene mit nur einem, als konvexem Polyeder beschriebenem Objekt dasSichtbarkeitsproblem moglichst einfach!

Page 12: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

2 Grundlegende Verfahren und Techniken 7

y

x

A

B

C

D

E F

G

H

I

J

K

L

M

NOP

1

2

4

3

5

6

7

8

9

10

11

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

Abbildung 2.6: Die Losung zu Aufgabe 3

Losung:Besteht die Szene aus einem einzigen konvexen Polyeder konnen bei beliebiger Sicht (Aug-punkt außerhalb des Polyeders) in Sichtrichtung weder Fremdverdeckungen noch Eigenver-deckungen entstehen. Deshalb ist das Sichtbarkeitsproblem bereits durch die Anwendungdes Backface-Cullings vollstandig gelost. Es wird hierbei vorausgesetzt, dass der Polyedervollstandig opak ist.

2. Untersuchen Sie beim z-Buffer-Verfahren die Abhangigkeit der Qualitat der Bilddarstellungvon der z-Auflosung. Definieren Sie dazu in OpenGL eine einfache Szene und experimentie-ren Sie mit den Einstellungen der Front- und Back-Clipping-Plane!

Losung:Ein Programm zum Experimentieren finden Sie als Quellcode unter ZBuffer zu diesem Ka-pitel.

Die Genauigkeit des z-Buffers hangt stark vom Verhaltnis der Abstande von Near- und Far-Clipping-Plane ab. Je großer

r =zFar

zNearwird, desto mehr Genauigkeit geht verloren.

Probieren Sie ein winziges zNear zusammen mit einem großen zFar aus, und Sie werdenbemerken, dass der z-Buffer selbst bei der gegebenen einfachen Szene die Tiefen der Primitiveaus numerischen Grunden nicht mehr unterscheiden kann.

Die dabei auftretenden Streifenmuster sind die typischen Anzeichen fur fehlende Tiefenge-nauigkeit!

2.6 Fallstudien

2.6.1 Transformationen und Hierarchien in OpenGL

1. Schreiben Sie ein Programm in C++, das mit Hilfe der Funktionen glTranslatef und glRotatef

eine Rotationsmatrix um eine beliebige Rotationsachse im Raum bildet. Fragen Sie diese Ma-trix mit glGetFloatv ab und geben Sie sie auf der Konsole aus! Berechnen Sie zur Kontrollemit Hilfe der Matrix auf Seite 19 die Werte und vergleichen Sie diese mit den ausgegebenen!

Page 13: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

2 Grundlegende Verfahren und Techniken 8

Losung:Der folgende Quelltext lost die Aufgabe:

GLfloat c[16];

glMatrixMode(GL_MODELVIEW);// Zuerst die Rotation mit Hilfe von glRotatefglLoadIdentity();

glTranslatef(3.0, 5.0, 7.0);glRotatef(45.0, 1.0, 1.0, 2.0);glTranslatef(-3.0, -5.0, -7.0);

// Die CTM kann abgefragt werden:glGetFloatv(GL_MODELVIEW_MATRIX, c);

// Ausgeben dieser Matrixcout << "Die Rotationsmatrix" << endl;cout << c[0] << "," << c[4] << "," << c[8] << "," << c[12] << endl;cout << c[1] << "," << c[5] << "," << c[9] << "," << c[13] << endl;cout << c[2] << "," << c[6] << "," << c[10] << "," << c[14] << endl;cout << c[3] << "," << c[7] << "," << c[11] << "," << c[15] << endl

Bei den Downloads zu diesem Kapitel finden Sie den kompletten Quellcode!

2. Schreiben Sie ein C++-Programm, das das beschriebene Sonnensystem mit OpenGL realisiert.Fugen Sie dem Planeten im Sonnensystem einen Mond und weitere Planeten und Monde hin-zu. Implementieren Sie in GLUT eine Interaktion, die es Ihnen erlaubt, die einzelnen Trans-formationen anzusteuern. GLUT bietet eine Idle-Funktion, die aufgerufen wird, wenn keineBenutzer-Interaktionen stattfinden. Implementieren Sie eine Autorun-Funktion, die in diesemFall aufgerufen wird und die das Sonnensystem als Ganzes animiert.

Losung:Hier ein Auszug aus dem Quelltext der Losung. Bei den Downloads zu diesem Kapitel findenSie die komplette Losung!

void drawSun(void){

glColor3fv(sunColor);glutWireSphere(sunRadius, 20, 16);

}

void drawEarth(void){

glColor3fv(earthColor);glutWireSphere(earthRadius, 10, 8);

}

void drawMoon(void){

glColor3fv(moonColor);glutWireSphere(moonRadius, 10, 8);

}

void drawMars(void){

glColor3fv(marsColor);glutWireSphere(marsRadius, 10, 8);

Page 14: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

2 Grundlegende Verfahren und Techniken 9

}

// Die Funktion fur glutIdleFuncvoid autorun(void){

/* Animation abspielen im Fall von autoplay = true */if (autoplay) {

day = (day + incDay) % 360;year = (year + incYear) %360;month = (month + incMonth) % 360;marsYear = (marsYear + incMarsYear) % 360;marsDay = (marsDay + incMarsDay) % 360;Mmonth1 = (Mmonth1 + incMonth) % 360;Mmonth2 = (Mmonth2 + incMonth) % 360;

}glutPostRedisplay();

}

void display(void){

glClear(GL_COLOR_BUFFER_BIT);

glMatrixMode(GL_MODELVIEW);

drawStars();

drawSun();/* Erde und Mond */glPushMatrix();

glRotatef((GLfloat) year, 0.0, 1.0, 0.0);glTranslatef(orbit, 0.0, 0.0);glPushMatrix();

glRotatef((GLfloat) day, 0.0, 1.0, 0.0);drawEarth();

glPopMatrix();glPushMatrix();

glRotatef(-(GLfloat) month, 0.0, 1.0, 0.0);glTranslatef(moonOrbit, 0.0, 0.0);drawMoon();

glPopMatrix();glPopMatrix();/* Erde und Mond */

/* Mars */glPushMatrix();

glRotatef((GLfloat) marsYear, 0.0, 1.0, 0.0);glTranslatef(marsOrbit, 0.0, 0.0);glPushMatrix();

glRotatef((GLfloat) marsDay, 0.0, 1.0, 0.0);drawMars();

glPopMatrix();glPushMatrix();

glRotatef(-(GLfloat) Mmonth1, 0.0, 1.0, 0.0);glTranslatef(moonOrbit, 0.0, 0.0);drawMoon();

glPopMatrix();glPushMatrix();

glRotatef(45.0, 0.0, 0.0, 1.0);

Page 15: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

2 Grundlegende Verfahren und Techniken 10

glRotatef((GLfloat) Mmonth2, 0.0, 1.0, 0.0);glTranslatef(moonOrbit*2.0, 0.0, 0.0);drawMoon();

glPopMatrix();glPopMatrix();

glutSwapBuffers();}

3. Implementieren Sie wie im Text beschrieben eine Datenstruktur fur einen Knoten eines Sze-nengraphen und ein Pre-Order Traversal fur OpenGL. Besetzen Sie entsprechende Knoten furden im Text dargestellten Roboter aus und rufen das Traversal in der display Funktion vonGLUT auf. Bauen Sie entsprechende Callbacks ein, um den Roboter interaktiv zu verandern!

Losung:Hier ein Auszug aus dem Quelltext der Losung. Bei den Downloads zu diesem Kapitel findenSie die komplette Losung!

void robby(void){

torso.draw = drawTorso;torso.sibling = 0; torso.child = &bein;moveTorso(Wx, Wy, Wz, Tx, Ty, Tz);

bein.draw = drawBein;bein.sibling = &kopf; bein.child = &fuss;moveBein(0.0);

fuss.draw = drawFuss;fuss.sibling = 0; fuss.child = 0;moveFuss(0.0);

kopf.draw = drawKopf;kopf.sibling = &lArm; kopf.child = 0;moveKopf(kopfWinkel);

lArm.draw = drawArm;lArm.sibling = &rArm; lArm.child = &lDaumen;moveLArm(lArmWinkel);

lDaumen.draw = drawDaumen;lDaumen.sibling = 0; lDaumen.child = 0;moveLDaumen(0.0);

rArm.draw = drawArm;rArm.sibling = 0; rArm.child = &rDaumen;moveRArm(rArmWinkel);

rDaumen.draw = drawDaumen;rDaumen.sibling = 0; rDaumen.child = 0;moveRDaumen(0.0);

}

void drawTorso(){

glMatrixMode(GL_MODELVIEW);glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, plasticAmbientColor);

Page 16: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

2 Grundlegende Verfahren und Techniken 11

glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, plasticColor);glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, plasticHighlight);glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, plasticExponent);

glPushMatrix();glScalef(torsoWidth, torsoHeight, torsoWidth);glutSolidCube(1.0);

glPopMatrix();}

void moveTorso(float Wx, float Wy, float Wz, float Tx, float Ty, float Tz){

glMatrixMode(GL_MODELVIEW);glPushMatrix();

glLoadIdentity();glRotatef(Wx, 1.0, 0.0, 0.0);glRotatef(Wy, 0.0, 1.0, 0.0);glRotatef(Wz, 0.0, 0.0, 1.0);glTranslatef(Tx, torsoHeight+Ty, Tz);glGetFloatv(GL_MODELVIEW_MATRIX, torso.m);

glPopMatrix();}

void drawBein(){

float beinHeight = 0.6, beinRadius = 0.2;glMatrixMode(GL_MODELVIEW);glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, plasticAmbientColor);glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, plasticColor);glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, plasticHighlight);glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, plasticExponent);

glPushMatrix();glScalef(beinWidth, beinHeight, beinWidth);glutSolidCube(1.0);

glPopMatrix();}

void moveBein(float trans){

glMatrixMode(GL_MODELVIEW);glPushMatrix();

glLoadIdentity();glTranslatef(0.0, -beinHeight + trans, 0.0);glGetFloatv(GL_MODELVIEW_MATRIX, bein.m);

glPopMatrix();}

void drawFuss(){

glMatrixMode(GL_MODELVIEW);glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, plasticAmbientColor);glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, plasticColor);glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, plasticHighlight);glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, plasticExponent);

glPushMatrix();

Page 17: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

2 Grundlegende Verfahren und Techniken 12

glScalef(fussWidth, fussHeight, fussWidth);glutSolidCube(1.0);

glPopMatrix();}

void moveFuss(float trans){

glMatrixMode(GL_MODELVIEW);glPushMatrix();

glLoadIdentity();glTranslatef(0, -fussHeight/2.0-beinHeight/2.0+trans, 0);glGetFloatv(GL_MODELVIEW_MATRIX, fuss.m);

glPopMatrix();}

void drawKopf(){

glMatrixMode(GL_MODELVIEW);glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, chromeAmbientColor);glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, chromeColor);glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, chromeHighlight);glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, chromeExponent);

glPushMatrix();glScalef(kopfWidth, kopfWidth, kopfWidth);glColor3f(0.4, 0.0, 0.0);glutSolidCube(1.0);

glPopMatrix();}

void moveKopf(float rot){

glMatrixMode(GL_MODELVIEW);glPushMatrix();

glLoadIdentity();glTranslatef(0, (torsoHeight+kopfWidth)/2.0, 0);glRotatef(rot, 0.0, 1.0, 0.0);glGetFloatv(GL_MODELVIEW_MATRIX, kopf.m);

glPopMatrix();}

void drawArm(){

glMatrixMode(GL_MODELVIEW);glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, chromeAmbientColor);glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, chromeColor);glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, chromeHighlight);glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, chromeExponent);glPushMatrix();

glScalef(armWidth, armLength, armWidth);glColor3f(0.4, 0.0, 0.0);glutSolidCube(1.0);

glPopMatrix();}

void moveLArm(float rot){

glMatrixMode(GL_MODELVIEW);

Page 18: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

2 Grundlegende Verfahren und Techniken 13

glPushMatrix();glLoadIdentity();// Zuerst den Schwerpunkt des Arms an die Schulter, dann// drehen und dann Arm richtig positionieren!glTranslatef(-(torsoWidth+armWidth)/2.0,torsoHeight/2.0,0.0);glRotatef(-rot, 1.0, 0.0, 0.0);glTranslatef(0.0, -armLength/2.0, 0.0);glGetFloatv(GL_MODELVIEW_MATRIX, lArm.m);

glPopMatrix();}

void moveRArm(float rot){

glMatrixMode(GL_MODELVIEW);glPushMatrix();

glLoadIdentity();// Zuerst den Schwerpunkt des Arms an die Schulter, dann// drehen und dann Arm richtig positionieren!glTranslatef((torsoWidth+armWidth)/2.0, torsoHeight/2.0,0.0);glRotatef(rot, 1.0, 0.0, 0.0);glTranslatef(0.0, -armLength/2.0, 0.0);glGetFloatv(GL_MODELVIEW_MATRIX, rArm.m);

glPopMatrix();}

void drawDaumen(){

glMatrixMode(GL_MODELVIEW);glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, plasticAmbientColor);glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, plasticColor);glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, plasticHighlight);glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, plasticExponent);

glPushMatrix();glScalef(daumenWidth, daumenLength, daumenWidth);glColor3f(0.0, 0.8, 0.0);

glutSolidCube(1.0);glPopMatrix();

}

void moveLDaumen(float trans){

glMatrixMode(GL_MODELVIEW);glPushMatrix();

glLoadIdentity();glTranslatef(-(armWidth-daumenWidth)/2.0,

-(armLength+daumenLength)/2.0, 0.0);glGetFloatv(GL_MODELVIEW_MATRIX, lDaumen.m);

glPopMatrix();}

void moveRDaumen(float trans){

glMatrixMode(GL_MODELVIEW);glPushMatrix();

glLoadIdentity();glTranslatef((armWidth-daumenWidth)/2.0,

-(armLength+daumenLength)/2.0, 0.0);

Page 19: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

2 Grundlegende Verfahren und Techniken 14

glGetFloatv(GL_MODELVIEW_MATRIX, rDaumen.m);glPopMatrix();

}

4. Verandern Sie Ihren Code fur das Sonnensystem so, dass Sie einen Szenengraphen und Pre-Order Traversal verwenden, um die Hierarchie zu implementieren!

Losung:Hier ein Auszug aus dem Quelltext der Losung. Bei den Downloads zu diesem Kapitel findenSie die komplette Losung!

// Den Szenengraphen anlegenvoid solarsystem(void){

sun.draw = drawSun;sun.sibling = 0; sun.child = &earth;moveSun();

earth.draw = drawEarth;earth.sibling = 0; earth.child = &moon;moveEarth();

moon.draw = drawMoon;moon.sibling = 0; moon.child = 0;moveMoon();

}

void drawSun(){

glMatrixMode(GL_MODELVIEW);glColor3fv(sunColor);glPushMatrix();

glutWireSphere(sunRadius, 20, 16);glPopMatrix();

}

void moveSun(){

glMatrixMode(GL_MODELVIEW);glPushMatrix();

glLoadIdentity();glGetFloatv(GL_MODELVIEW_MATRIX, sun.m);

glPopMatrix();}

void drawEarth(){

glColor3fv(earthColor);glMatrixMode(GL_MODELVIEW);glPushMatrix();

glutWireSphere(earthRadius, 20, 16);glPopMatrix();

}

void moveEarth(void){

glMatrixMode(GL_MODELVIEW);

Page 20: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

2 Grundlegende Verfahren und Techniken 15

glColor3fv(earthColor);glPushMatrix();

glLoadIdentity();glRotatef( (GLfloat) year, 0.0, 1.0, 0.0);glTranslatef( orbit, 0.0, 0.0);glRotatef( (GLfloat) day, 0.0, 1.0, 0.0);glGetFloatv(GL_MODELVIEW_MATRIX, earth.m);

glPopMatrix();}

void drawMoon(){

glMatrixMode(GL_MODELVIEW);glColor3fv(moonColor);glPushMatrix();

glutWireSphere(moonRadius, 20, 16);glPopMatrix();

}

void moveMoon(void){

glMatrixMode(GL_MODELVIEW);glPushMatrix();

glLoadIdentity();// Die Transformation fur die Tagesdrehung der Erde// aus der Transformationsmatrix fur den Mond wieder herausnehmen!glRotatef(-(GLfloat) day, 0.0, 1.0, 0.0);// Jetzt die Transformationen fur den MondglRotatef(-(GLfloat) month, 0.0, 1.0, 0.0);glTranslatef(moonOrbit, 0.0, 0.0);glGetFloatv(GL_MODELVIEW_MATRIX, moon.m);

glPopMatrix();}

void init(void){

/* Hintergrundfarb-Anteile in RGBA,Default ist weisser Hintergrund */

glClearColor(0.0, 0.0, 0.0, 1.0);// OpenGL initialisieren: z-Buffer;glEnable(GL_DEPTH_TEST);glCullFace(GL_BACK);glEnable(GL_CULL_FACE);

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

about();

// Den Graphen aufbauensolarsystem();

}

/* display-Callback fur GLUT */void display(void){

glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);

Page 21: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

2 Grundlegende Verfahren und Techniken 16

glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(0.0, 10.0, 15.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

sceneGraphTraversal(&sun);

glutSwapBuffers();}

2.6.2 Hierarchien in VRML und Alias MAYA

1. Vervollstandigen Sie den VRML97-Quelltext fur das Robotermodell und testen Sie die Datei.Verandern Sie dabei insbesondere manuell die Winkel des Schultergelenks, und uberprufenSie die Korrektheit der Hierarchie!

Losung:Die WRL-Datei zum Ansehen finden Sie bei den Downloads zu diesem Kapitel.

#VRML V2.0 utf8WorldInfo {

title "Ein Roboter in VRML97"info ["Copyright (c) 2005 Manfred Brill",

"Visualisierungslabor der FH Kaiserslautern","Computergrafik - Ein anwendungsorientiertes Lehrbuch, 2. Auflage","Published by Hanser""All rights reserved" ]

}

# ExamineNavigationInfo { type "EXAMINE" }

DEF Kamera1 Viewpoint {fieldOfView 0.4position 0 5 7orientation 1 0 0 -0.5

}

DEF Kamera2 Viewpoint {fieldOfView 0.4position 0 5 7orientation 1 0 0 -0.5

}

# BodenDEF Boden Transform {

translation 0 -0.1 0children Shape {

geometry Box { size 10 0.1 10 }appearance Appearance {material Material {diffuseColor 0 0.8 0}}

}}

# Der RoboterDEF Roboter Transform {

# Die globalen Positionsparameter des Roboterstranslation 0 0 0

Page 22: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

2 Grundlegende Verfahren und Techniken 17

rotation 0 1 0 0children [

# TorsoDEF Torso Transform {

translation 0 1 0children Shape {

geometry Box { size 0.6 1.0 0.3 }appearance Appearance { material Material

{diffuseColor 0.5 0.5 0.5 }}}

}# BeinDEF Bein Transform {

translation 0 0.3 0 # Freiheitsgrad Translation in y-Richtung;# Ruhestellung y=0.3

children [# Der SchenkelDEF Schenkel Transform {

children Shape { geometry Cylinder{ height 0.6 radius 0.1}appearance Appearance{ material Material

{diffuseColor 0.5 0.5 0.5 }}}

}# FussDEF Fuss Transform {

translation 0 -0.3 0 # Kein Freiheitsgrad,# Modellierparameter

children Shape {geometry Box {size 0.6 0.05 0.6}appearance Appearance{ material Material{diffuseColor 0.5 0.5 0.5 }}

}}

]}

# KopfDEF Kopf Transform {

translation 0 1.6 0rotation 0 1 0 0 # Freiheitsgrad der Rotations des Kopfes

# um die y-Achsechildren Shape {geometry Box { size 0.2 0.2 0.2 }

appearance Appearance{ material Material

{diffuseColor 0.3 0.3 0.3 }}}

}# Linker ArmDEF ArmLinks Transform {

center 0 0.3 0translation 0.35 1.2 0rotation 1 0 0 -0.785 # Freiheitsgrad: Rotation um die x-Achse.children [

# Der ArmDEF UnterArmLinks Transform {

children Shape {geometry Box

Page 23: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

2 Grundlegende Verfahren und Techniken 18

{size 0.1 0.6 0.1}appearance Appearance

{material Material{diffuseColor 0.4 0.4 0.4 }}

}}

# Der DaumenDEF DaumenLinks Transform {

translation 0.02 -0.35 0children Shape { geometry Box

{size 0.03 0.1 0.03 }appearance Appearance{material Material{diffuseColor 0.7 0.4 0.4 }}

}}# Der linke bewegliche FingerDEF FingerLinks Transform {

translation -0.03 -0.35 0 # Freiheitsgrad:# Verschiebung in x

children Shape { geometry Box{size 0.03 0.1 0.03 }

appearance Appearance{material Material {diffuseColor 0.7 0.4 0.4 }}

}}

]}

# Rechter ArmDEF ArmRechts Transform {

center 0 0.3 0translation -0.35 1.2 0rotation 1 0 0 -0.785 # Freiheitsgrad:

# Rotation um die x-Achse.children [

# Der ArmDEF UnterArmRechts Transform {

children Shape {geometry Box{size 0.1 0.6 0.1 }

appearance Appearance{material Material

{diffuseColor 0.4 0.4 0.4 }}}

}# Der rechte bewegliche FingerDEF FingerRechts Transform {

translation 0.04 -0.35 0 # Freiheitsgrad:# Verschiebung in x

children Shape { geometry Box{size 0.03 0.1 0.03 }

appearance Appearance{material Material

{diffuseColor 0.7 0.4 0.4 }}}

}# Der rechte Daumen

Page 24: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

2 Grundlegende Verfahren und Techniken 19

DEF DaumenRechts Transform {translation -0.03 -0.35 0 #children Shape { geometry Box

{size 0.03 0.1 0.03 }appearance Appearance

{material Material{diffuseColor 0.7 0.4 0.4 }}

}}

]}

]}

2. Erstellen Sie ein Modell des Roboters in der Alias MAYA PLE! Testen Sie insbesondere dieKorrektheit der Hierarchie, indem Sie verschiedene Korperteile auswahlen und transformie-ren!

Losung:Die PLE-Datei finden Sie bei den Downloads zu diesem Kapitel!

2.6.3 Die virtuelle Kamera in OpenGL

1. Erstellen Sie ein Programm, das mit der Funktion glutWireCube einen Wurfel ausgibt. Stel-len Sie die Kamera so ein, dass die Abbildungen mit Orthogonal- und Zentralprojektionenaus Abschnitt 2.2 reproduziert werden!

Losung:Die Orthogonalprojektionen erhalt man durch glOrtho und einer entsprechenden Positio-nierung des Objekts, entweder durch glTranslatef, glRotatef oder durch gluLookAt. DieAbbildung 2.23 wird reproduziert durch

void view(void){

// KameratransformationglMatrixMode(GL_MODELVIEW);

glLoadIdentity();gluLookAt(4.0, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

}

und

glMatrixMode(GL_PROJECTION);glOrtho(-2.0, 2.0, -2.0, 2.0, 0.5, 20.0);

In Abbildung 2.7 sehen Sie eine entsprechende Ausgabe, die den Abbildungen 2.23 und 2.24im Buch entsprechen.

Auch die Bilder zur Zentralperspektive konnen analog mit gluPerspective und entspre-chenden Drehungen (fur Zwei- und Dreipunktperspektive) erzeugt werden. In Abbildung2.8 sehen Sie die Ein- und die Zweipunktperspektive aus dem Buch.

Bei den Downloads zu diesem Kapitel finden Sie alle Quelltexte.

2. Erstellen Sie ein Programm, das mit der Funktion glutWireCube einen Wurfel ausgibt. StellenSie die Kamera so ein, dass die schiefwinkligen Projektionen aus Abschnitt 2.2 reproduziertwerden!

Page 25: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

2 Grundlegende Verfahren und Techniken 20

Abbildung 2.7: OpenGL-Ausgabe analog zu den Abbildungen 2.23 und 2.24

Abbildung 2.8: OpenGL-Ausgabe analog zu den Abbildungen 2.31 und 2.33

Losung:Schiefwinklige Projektionen konnen in OpenGL nicht direkt erzeugt werden. Der Scherungs-anteil in der dritten Spalte

1 0 − cos(α)tan(β)

0

0 1 − sin(α)tan(β)

00 0 − 1

sin(β)0

0 0 0 1

muss manuell in die PROJECTION-Matrix geladen werden. Das kann man mit dem folgendenQuelltext durchfuhren:

int i;float m[16];

glMatrixMode(GL_PROJECTION);glOrtho(-2.0, 2.0, -2.0, 2.0, 0.1, 20.0);// Scherung laden!for (i=0; i<16; i++)

m[i] = (i%5 ==0) ? 1.0 : 0.0; // Einheitsmatrix

// Scherungsanteil manuell setzen

Page 26: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

2 Grundlegende Verfahren und Techniken 21

float alpha = 0.785;//float alpha = 0.5236;m[8] = -0.5 * cos(alpha);m[9] = -0.5 * sin(alpha);

glMultMatrixf(m);

Fur die verschiedenen Winkelwerte fur alpha und beta konnen dann beliebige Kavalier- undKabinettprojektionen reproduziert werden.

In Abbildung 2.9 sehen Sie zwei Kavalier- und Kabinett-Projektionen aus Abbildung 2.26 und2.27 in OpenGL.

Abbildung 2.9: Kavalier- und Kabinettprojektionen in OpenGL

3. Erstellen Sie eine Funktion pilotView in OpenGL, die eine Sicht eines Piloten oder Fahrersin einem Simulator unterstutzen soll. Die Funktion soll folgende Eingaben besitzen: die Po-sition des ”Piloten“ und die drei Winkel Gierungs-, Neigungs- und Rollwinkel. Der Rollwinkelentspricht der Rotation um die z-Achse, falls das Flugzeug wie in Abbildung 2.10 orientiertist; der Neigungswinkel ist die Rotation um die x-Achse. Testen Sie Ihre Funktion, indem Siedie Winkel interaktiv verandern!

Abbildung 2.10: Ein Flugzeugmodell und seine Orientierung

Losung:Die in der Aufgabenstellung beschriebenen Großen mussen im lokalen Koordinatensystemdes Flugzeugs interpretiert werden, das auch in Abbildung 2.10 dargestellt wurde. Die Sicht-richtung des ”Piloten“ ist zu Beginn des Programms identisch mit der Default-Sichtrichtungin OpenGL – wenn die Defaultanordnung des Flugzeugs so ist, dass der Pilot entlang dernegativen z-Achse schaut.

Dadurch ergeben sich die Vorzeichen in den im Quelltext angegebenen Rotationen – das soll-ten Sie sich unbedingt klar machen.

Page 27: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

2 Grundlegende Verfahren und Techniken 22

Die Position des Flugzeugs ist auf den Variablen DRIVE_X, DRIVE_Y und DRIVE_Z abgelegt.

// Es wird davon ausgegangen, dass die Projektionsmatrix (Orthogonal- oder// Zentralprojektion) bereits richtig eingestellt ist!void pilot(void){

glMatrixMode(GL_MODELVIEW);glLoadIdentity();glRotatef(ROLL, 0.0, 0.0, 1.0);glRotatef(GIERUNG, 0.0, 1.0, 0.0);glRotatef(NEIGUNG, 1.0, 0.0, 0.0);glTranslatef(-DRIVE_X, -DRIVE_Y, -DRIVE_Z);

}

So weit, so gut. Diese Losung haben Sie sicher auch im ”red book“ gefunden. Wenn Siejetzt eine Taste mit ”Vorwarts-Fahren“ belegen und entsprechend die z-Koordinate DRIVE_Z

verandern, dann erwarten Sie sicher, dass wir in die Blickrichtung fliegen.

Dies passiert aber, ohne dass wir den Code weiter verandern, nicht. Die z-Koordinate derFlugzeugposition ist zwar richtig - aber Sie bewegen sich in Richtung der Weltkoordinaten-achsen. Die Veranderung der Flugzeugposition verlauft aber entlang der lokalen Koordinatendes Flugzeugs! Die Situation eines aus der z-Achse gedrehten Flugzeugs in der xz-Ebene se-hen Sie in den Abbildungen 2.11 und 2.12.

?z

-x

I 6

Abbildung 2.11: Bewegung entlang derWeltkoordinatenachsen

?z

-x

I 6

Abbildung 2.12: Bewegung entlang der lo-kalen Achsen des Flugzeugs

In Abbildung 2.11 wird das Flugzeug entlang der z-Achse ”nach Vorne“ bewegt. Richtig istdie Bewegung in Abbildung 2.12; die Bewegung muss entlang der lokalen z-Achse des Flug-zeugs erfolgen.

Fragt sich, wie man moglichst schnell bei einer Bewegung nach Vorne diese lokale z-Achseberechnen kann. Ist das Flugzeug zu Beginn so aufgestellt, dass die positive Fahrtrichtung mitder OpenGL-Sichtrichtung entlang der negativen z-Achse ubereinstimmt, dann konnten Siealle Rotationen protokollieren und auf den Vektor (0, 0,−1)T anwenden. Hier kommt wiederdas Konzept der Current Transformation Matrix CTM ins Spiel. Das Bild der z-Achse unter allenRotationen, die durchgefuhrt wurden, steht auf der dritten Spalte der aktuellen CTM. Diesefragen wir ab und verwenden diese, um nach Vorne und Zuruck zu fahren:

void driveForward(void){

GLfloat m[16];glMatrixMode(GL_MODELVIEW);

glPushMatrix();glLoadIdentity(),glRotatef(-ROLL, 0.0, 0.0, 1.0);glRotatef(-GIERUNG, 0.0, 1.0, 0.0);glRotatef(-NEIGUNG, 1.0, 0.0, 0.0);// Die CTM abgefragenglGetFloatv(GL_MODELVIEW_MATRIX, m);

glPopMatrix();

Page 28: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

2 Grundlegende Verfahren und Techniken 23

// Die gesuchte Fahrtrichtung ist die negierte dritte// Spalte der Matrix m.// Faktor MOVE verwenden, um die "Geschwindigkeit" etwas abzubremsen;// dieser kann ebenfalls interaktiv verandert werden, um ein// "Gaspedal" zu realisieren.DRIVE_X -= MOVE*m[8];DRIVE_Y -= MOVE*m[9];DRIVE_Z -= MOVE*m[10];

}

void driveBackward(void){

GLfloat m[16];glMatrixMode(GL_MODELVIEW);

glPushMatrix();glLoadIdentity(),glRotatef(-ROLL, 0.0, 0.0, 1.0);glRotatef(-GIERUNG, 0.0, 1.0, 0.0);glRotatef(-NEIGUNG, 1.0, 0.0, 0.0);// Die CTM abgefragenglGetFloatv(GL_MODELVIEW_MATRIX, m);

glPopMatrix();// Die gesuchte Fahrtrichtung ist die negierte dritte Spalte// der Matrix m.DRIVE_X += MOVE*m[8];DRIVE_Y += MOVE*m[9];DRIVE_Z += MOVE*m[10];

}

Die ”Rechenarbeit“ macht also die Grafik-Pipeline. Ist diese zu langsam, was unwahrschein-lich ist, konnen Sie die Berechnung naturlich auch per Software mit Matrixarithmetik aus-fuhren. Ganz wichtig ist, dass Sie die Berechnung in glPushMatrix() und glPopMatrix()

einklammern – Sie wollen die Bewegung ja nicht wirklich durchfuhren, sondern nur das Be-rechnungsergebnis verwenden.

4. Erstellen Sie eine Funktion examine in OpenGL, die eine Sichtdefinition fur einen Betrachterrealisiert, der sich immer um ein Objekt bewegt. Der Blickpunkt soll dabei immer im Objekt-zentrum liegen und der Augpunkt eine gegebene Distanz von diesem Zentrum haben. TestenSie Ihre Funktion, indem Sie ein Objekt im Ursprung ausgeben und die Winkel und den Ab-stand des Betrachters vom Ursprung interaktiv verandern!

Losung:Die Lage der Kamera fur ein im Ursprung fixiertes Objekt kann durch Kugelkoordinatenbeschrieben werden. Dazu werden die globalen Variablen RADIUS, AZIMUTH und ELEVATION

und entsprechende Inkremente eingefuhrt. Als Default wird die OpenGL-Sicht entlang dernegativen z-Achse aus einer Distanz von 5 Einheiten eingestellt.

examine realisiert alle Transformationen im MODELVIEW-Stack; der PROJECTION-Stackdient ausschließlich zur Einstellung von Parallel- bzw. Zentralprojektion. Denken Sie bei derInterpretation des folgenden Quelltexts an die Reihenfolge der Transformationen!

// Es wird davon ausgegangen, dass die Projektionsmatrix (Orthogonal- oder// Zentralprojektion) bereits richtig eingestellt ist!void examine(void){

glMatrixMode(GL_MODELVIEW);glLoadIdentity();glTranslatef(0.0, 0.0, -RADIUS);

Page 29: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

2 Grundlegende Verfahren und Techniken 24

glRotatef(-ELEVATION, 1.0, 0.0, 0.0);glRotatef(AZIMUTH, 0.0, 1.0, 0.0);

}

2.6.4 Clipping in OpenGL

1. Modifizieren Sie das vorgegebene Programm so, dass es moglich ist, eine Clipping-Ebenenicht nur frei im Raum zu bewegen, sondern auch an allen drei Koordinatenachsen zu dre-hen! Verwenden Sie hierzu Euler-Winkel. Die Verschiebung und Drehung sollen interaktivuber die Tastatur gesteuert werden konnen!

Losung:Ein entsprechendes Beispielprogramm finden Sie in den Quellcodes zu dieser Fallstudie.

Page 30: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

Kapitel 3

Geometrisches Modellieren mitKurven und Flachen

3.2 Parameterkurven

1. Skizzieren Sie den Verlauf der Kurve

K(t) =

(t, 0) 0 ≤ t < 1,

(1, 0) + (t − 1)(− 12 ,

√3

2 ) 1 ≤ t < 2,

( 12 ,

√3

2 ) + (t − 2)(− 12 ,−

√3

2 ) 2 ≤ t < 3

.

Losung:Alle Kurvenstucke sind linear; als Bild ergibt sich Abbildung 3.1.

Abbildung 3.1: Die Losung fur Aufgabe 1

2. Weisen Sie nach, dass die Kurve

x(t) = a1 − t1 + t

, y(t) = 2a√

t1 + t

einen Teil eines Kreises realisiert, falls als Parameterintervall [0, ∞) verwendet wird! Wo liegtder Mittelpunkt dieses Kreises, wie groß ist der Radius?

Losung:Die Punkte (x(t), y(t)) liegen alle auf einem Kreis; denn es ist

x(t)2 + y(t)2 = a2 (1 − t)2

(1 + t)2 + 4a2 t(1 + t)2 =

a2 − 2ta2 + t2a2 + 4a2t(1 + t)2 = a2.

Page 31: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

3 Geometrisches Modellieren mit Kurven und Flachen 26

Dann ist auch klar, dass der Ursprung der Mittelpunkt ist, der Radius ist a.

Fur t = 0 erhalt man den Punkt (a, 0); die Grenzwerte fur t → ∞ sind gegeben als

limt→∞

a1 − t1 + t

= −a, limt→∞

2a√

t1 + t

= 0.

Dann stellt die gegebenen Kurve einen Halbkreis dar, beginnend bei (a, 0); asymptotisch bis(−a, 0); dieser Punkt wird allerdings nie erreicht.

3. Skizzieren Sie den Verlauf der Kurve, die durch r = 1 + cos (t),ϕ = t, t ∈ [0, 2π) gegeben ist!Bestimmen Sie die Bogenlange!

Losung:Die Losung ist die sogenannte Kardioide in Abbildung 3.2. Die Kardioide ist der geometrischeOrt, der von einem Punkt eines Kreises von Radius 2a beschrieben wird, der ohne zu gleitenauf einem anderen Kreis vom Radius 2a rollt. In der Aufgabe war a = 1

2 . Als Bogenlangeergibt das Integral den Wert 8.

-

61

−1

1

Abbildung 3.2: Die Kardioide als Losung von Aufgabe 3

4. Berechnen Sie die Tangenten an eine Ellipse fur t = 0, π4 , π

2 , π . Skizzieren Sie die Ellipse, dieTangenten und die entsprechenden Normalenvektoren!

Losung:Die Tangenten fur eine Ellipse mit den Radien R1, R2 sind gegeben durch

t0 =

(0

R2

), t π

4=

12

√2(−R1R2

), t π

2=

(−R1

0

), tπ =

(0

−R2

).

Die Skizze sehen Sie in Abbildung 3.3.

6�

k

�?

?-

Abbildung 3.3: Die Ellipse, Tangenten und Normalen als Losung von Aufgabe 4

5. Skizzieren Sie den Verlauf der Kurve K(t) = (sin t, sin t cos t), t ∈ [0, 2π ]. Tragen Sie furt = 0, π

2 , π , 3π2 , 2π die Tangenten und Normalen auf! Bestimmen Sie die Krummung κ2 und

die Bogenlange!

Losung:

Page 32: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

3 Geometrisches Modellieren mit Kurven und Flachen 27

Die Losung ist die sogenannte Lemniskate von Gerono; die Skizze sehen Sie in Abbildung 3.4.Die Krummung κ2 ist gegeben durch

κ2(t) =−4 cos2 t sin t + sin t

(cos2 t − sin2 t

)

(cos2 t + (cos2 t − sin2 t)2

) 32

.

Abbildung 3.5 zeigt den Verlauf der Krummung. Die Bogenlange ist durch das Integral gege-ben als 6, 09722.

-

61

−11−1

�I?-I

?-

Abbildung 3.4: Die Lemniskate von Gero-no als Losung der Aufgabe 5 Abbildung 3.5: Die Krummung κ2 der

Lemniskate von Gerono in Aufgabe 5

.

Die Tangenten und Normalen finden Sie in der Abbildung 3.4 und in Tabelle 3.1.

Tabelle 3.1: Die unnormalisierten Tangenten und Normalen an die Lemniskate in Aufgabe 5

Parameterwerte t = 0 t = π2 t = π t = 3π

2 t = 2π

Tangenten(

11

) (0−1

) (−11

) (0−1

) (11

)

Normalen(−11

) (10

) (−1−1

) (10

) (−11

)

Die Ellipse in Abbildung 3.3, der Losung von Aufgabe 4, ist gegeben als der geometrischeOrt der Punkte, fur die die Summe der Abstande zu zwei gegebenen Brennpunkten F1 undF2 konstant ist. Die Lemniskate von Bernoulli ist gegeben als geometrischer Ort aller Punk-te, fur die das Produkt der Abstande zu den Brennpunkten konstant ist. Allgemein ist eineLemniskate von Bernoulli gegeben durch die Parameterdarstellung

Ka(t) =

(a cos t

1 + sin t2 ,a sin t cos t1 + sin t2

).

Dabei liegen die beiden Brennpunkte dann in (±a√

2, 0).

6. Bestimmen Sie das Frenet’sche Bezugssystem fur die logarithmische Spirale

K(t) =

aebt cos taebt sin t

ct

!

Losung:Eine grafische Darstellung der logarithmischen Spirale (aebt cos t, aebt sin t) sehen Sie in Ab-

Page 33: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

3 Geometrisches Modellieren mit Kurven und Flachen 28

Abbildung 3.6: Die logarithmische Spiraleim Parameterintervall [0; 6π ] fur Aufgabe 6

Abbildung 3.7: Die Schraubenliniefur die logarithmische Spirale imParameterintervall [0; 6π ] fur Aufgabe 6

bildung 3.6; die Schraubenlinie daruber ist durch (aebt cos t, aebt sin t, ct) gegeben; ihr Bildfinden Sie in Abbildung 3.7. Fur das Frenet’sche Bezugssystem ergibt sich:

v(t) =1√

c2 + a2(1 + b2)e2bt

aebt(b cos t − sin t)aebt(cos t + b sin t)

c

,

b(t) =1

(1 + b)√

c2 + a2e2bt

−c(2b cos t + (b2 − 1) sin t)c((b2 − 1) cos t − 2b sin t)

a(1 + b2)ebt

,

n(t) = b × v.

3.3 Polynomiale Kurven

1. Welcher Kegelschnitt ist durch die implizite Darstellung x2 + 2xy + y2 + 3x − 6y + 7 = 0gegeben? Skizzieren Sie den Kurvenverlauf!

Losung:Die Kurve ist eine Parabel, denn die Diskriminante ist Null. In Abbildung 3.8 finden Sie eineSkizze.

2. Rechnen Sie nach, dass die rationalen quadratischen Polynome wirklich eine affine Kombina-tion der Kontrollpunkte darstellen!

Losung:Die Formel kann geschrieben werden als ∑3

i=1 λiPi, dabei sind die Koeffizienten gegebendurch

λ1 =(1 − t)2

(1 − t)2 + 2wt(1 − t) + t2 ,

λ2 =2wt(1 − t)

(1 − t)2 + 2wt(1 − t) + t2 ,

λ3 =t2

(1 − t)2 + 2wt(1 − t) + t2 .

Diese addieren sich offensichtlich zu 1 auf.

Page 34: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

3 Geometrisches Modellieren mit Kurven und Flachen 29

Abbildung 3.8: Der Kegelschnitt fur Aufgabe 1

3. Der Kreis kann als rationale Kurve mit den Kontrollpunkten P0, P1 und P2 als Parameterkurvedargestellt werden; dabei ist das Gewicht w = cos 60◦, dem Innenwinkel eines gleichwink-ligen Dreiecks, wie in Abbildung 3.9. Positionieren Sie die Kontrollpunkte wie in Abbildung3.9. Insgesamt erhalten Sie drei Kreissegmente. Skizzieren Sie den Kurvenverlauf fur jeweils5 Punkte pro Segment. Vergleichen Sie diese Darstellung mit der Parameterdarstellung mitHilfe von trigonometrischen Funktionen!

P0

P2

P1

Abbildung 3.9: Gleichwinkliges Dreieck und Inkreis

Losung:Das Gewicht ist fur alle drei Kurvenstucke immer w = cos 60◦ = 0, 5.

Die Segmente ergeben sich durch die folgenden Kontrollpunkte:

P0, D2 und P2, erstreckt sich von P0 bis P2;

P2, D1 und P1, erstreckt sich von P2 bis P1;

P1, D0 und P0, erstreckt sich von P1 bis P0.

Fur das Dreieck ist jedes gleichwinklige Dreieck zu verwenden. Eine mogliche Wahl fur dasDreieck ist D0 = (0, 0), D1 = (1, 0) und D2 = ( 1

2 ,√

32 ). Wenn Sie an den Punkten Pi jeweils die

Tangenten und Krummungen bestimmen, dann erkennen Sie, dass der mit den rationalen Po-lynomen dargestellte Kreis nur C1- bzw. G1-stetig ist. Und er ist nicht nach seiner Bogenlangeparametrisiert!

Eine grafische Darstellung der Kurve mit den Kontrollpunkten finden Sie in Abbildung 3.10auf Seite 30.

4. Wie viele Multiplikationen benotigt die Auswertung eines Polynoms p(x) vom Grad m inMonom-Darstellung, d. h. p(x) = ∑m

i=0 ai · Mi(x), ai ∈ R, t ∈ [a, b]? Wie viele Multiplikatio-nen benotigt man bei Anwendung des Horner-Schemas?

Page 35: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

3 Geometrisches Modellieren mit Kurven und Flachen 30

P0

D0

P2

P1

D1

D2

Abbildung 3.10: Der Kreis als rationale Kurve in Aufgabe 3 mit den Kontrollpunkten

Losung:

Monom-Darstellung: m − 1 Multiplikationen fur die Berechnung der Potenzen und m Mul-tiplikationen fur die Berechnung der Summanden; insgesamt damit 2m − 1 Multiplika-tionen (m > 0).

Horner-Schema: m Multiplikationen.

3.4 Bezier-Kurven und -Kurvensegmente

1. Zeigen Sie, wie die Darstellung eines Bernstein-Polynoms Bmi (t) uber dem Intervall t ∈ [0, 1]

mittels der affinen Parameter-Transformation s = a +(b− a)t in die Darstellung eines Bernstein-Polynoms Bm

i (s) uber dem Intervall s ∈ [a, b] ubergeht!

Losung:Es gilt s = a + (b − a)t, also t = s−a

b−a . Weiterhin ist Bmi (t) = (m

i )ti(1 − t)m−i. Deshalb gilt

Bmi (s) = Bm

i (t)

= Bmi (

s − ab − a

)

=

(mi

)(s − ab − a

)i (1 − s − a

b − a

)m−i

=

(mi

)(s − ab − a

)i ( b − sb − a

)m−i

=

(mi

)(s − a)i

(b − a)i(b − s)m−i

(b − a)m−i

=1

(b − a)m

(mi

)(s − a)i(b − s)m−i ,

was zu zeigen war.

2. Zeigen Sie die Eigenschaften 2 und 6 der Bernstein-Polynome!

Losung:Eigenschaft 2: Die Bernstein-Polynome bilden eine Teilung der Eins, d. h. fur alle t ∈ [a, b]gilt ∑m

i=0 Bmi (t) = 1.

Die binomische Reihe lautet

(a + b)n =n

∑i=0

(ni

)aibn−i .

Page 36: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

3 Geometrisches Modellieren mit Kurven und Flachen 31

Damit gilt

m

∑i=0

Bmi (t) =

m

∑i=0

1(b − a)m

(mi

)(t − a)i(b − t)m−i

=1

(b − a)m

m

∑i=0

(mi

)(t − a)i(b − t)m−i

=1

(b − a)m (b − a)m

= 1.

Eigenschaft 6: Ein Bernstein-Polynom vom Grad m lasst sich als Konvex-Kombination vonBernstein-Polynomen vom Grad m − 1 darstellen. Fur das Intervall [0, 1] ist Bm

i (t) = t ·Bm−1

i−1 (t) + (1 − t) · Bm−1i (t) zu zeigen.

Fur den Binomialkoeffizienten gilt(

n + 1k

)=

(n

k − 1

)+

(nk

)

Damit ist

Bmi (t) =

(mi

)ti(1 − t)m−i

=

{(m − 1

i

)+

(m − 1i − 1

)}ti(1 − t)m−i

=

(m − 1

i

)ti(1 − t)m−i +

(m − 1i − 1

)ti(1 − t)m−i

= (t − 1) ·(

m − 1i

)ti(1 − t)(m−1)−i + t ·

(m − 1i − 1

)ti−1(1 − t)(m−1)−(i−1)

= (t − 1) · Bm−1i (t) + t · Bm−1

i−1 (t).

3. Zeigen Sie die Ableitungsformel (Eigenschaft 7) der Bernstein-Polynome uber dem Intervall[a, b] fur j = 1, 2!

Losung:

Page 37: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

3 Geometrisches Modellieren mit Kurven und Flachen 32

Erste Ableitung, j = 1:Per Hand (Produktregel, Kettenregel) folgt

ddt

Bmi (t) =

ddt

{1

(b − a)m

(mi

)(t − a)i(b − t)m−i

}

=1

(b − a)m

(mi

)ddt

{(t − a)i(b − t)m−i

}

=1

(b − a)mm!

(m − i)!i!{i(t − a)i−1(b − t)m−i

+(t − a)i(m − i)(b − t)m−i−1(−1)}

=1

(b − a)mm(m − 1)!

(m − i)!(i − 1)!(t − a)i−1(b − t)(m−1)−(i−1)

− 1(b − a)m

m(m − 1)!(m − i − 1)!i!

(t − a)i(b − t)m−i−1

=m

(b − a)m { (m − 1)!(m − i)!(i − 1)!

(t − a)i−1(b − t)(m−1)−(i−1)

− (m − 1)!(m − 1 − i)!i!

(t − a)i(b − t)m−i−1}

=m

(b − a){ 1(b − a)m−1

(m − 1i − 1

)(t − a)i−1(b − t)(m−1)−(i−1)

− 1(b − a)m−1

(m − 1

i

)(t − a)i(b − t)m−1−i}

=m

(b − a){Bm−1

i−1 (t)− Bm−1i (t)}.

Fur j = 1 folgt per Formel:

d j

dt j Bmi (t) =

1(b − a) j

m!(m − j)!

j

∑l=0

(−1)l(

jl

)Bm− j

i− j+l(t)

1(b − a)1

m!(m − 1)!

1

∑l=0

(−1)l(

1l

)Bm−1

i−1+l(t)

mb − a

{(−1)0(

10

)Bm−1

i−1+0(t) + (−1)1(

11

)Bm−1

i−1+1(t)}m

b − a{Bm−1

i−1 (t)− Bm−1i (t)}

Zweite Ableitung, j = 2: ddt Bm

i (t) erneut nach t ableiten.

4. Verifizieren Sie die Umschreibung der Darstellung unseres numerischen Beispiels von Mo-nom-Basis in Bernstein-Basis mittels der in Eigenschaft 8 der Bernstein-Polynome erlautertenBasistransformation!

Losung:Wir mussen die Koeffizienten der Monombasis in die Koeffizienten der Bernstein-Basis um-rechnen. Dies rechnen wir fur unser numerisches Beispiel separat fur die x- und die y-Koordi-naten. Dabei gilt (b0, b1, b2, b3) = (a0, a1, a2, a3) · A−1 mit

A−1 =

1 1 1 10 1/3 2/3 10 0 1/3 10 0 0 1

.

Page 38: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

3 Geometrisches Modellieren mit Kurven und Flachen 33

x-Koordinaten:

(b0, b1, b2, b3) = (0, 6, 13.5,−8.5) ·

1 1 1 10 1/3 2/3 10 0 1/3 10 0 0 1

= (0, 2, 8.5, 11)

y-Koordinaten:

(b0, b1, b2, b3) = (0, 13.5,−7.5,−4) ·

1 1 1 10 1/3 2/3 10 0 1/3 10 0 0 1

= (0, 4.5, 6.5, 2)

5. Verifizieren Sie die Formel fur die erste Ableitung eines Bezier-Kurvensegments auf dem In-tervall [0, 1] nach dem Parameter t!

Losung:Zu zeigen ist:

ddt

K(t) = mm−1

∑i=0

(bi+1 − bi) · Bm−1i (t).

Es ist

ddt

K(t) =ddt

{m

∑i=0

bi · Bmi (t)

}

=m

∑i=0

biddt

Bmi (t)

=m

∑i=0

mbi{Bm−1i−1 (t)− Bm−1

i (t)}

= m{−b0Bm−10 (t) + b1Bm−1

0 (t)− b1Bm−11 (t) + b2Bm−1

1 (t)

−b2Bm−12 (t) + . . . + bm−1Bm−1

m−2(t)− bm−1Bm−1m−1(t) + bmBm−1

m−1(t)}= m{(b1 − b0)Bm−1

0 (t) + (b2 − b1)Bm−11 (t) + . . . + (bm − bm−1)Bm−1

m−1(t)}

= mm−1

∑i=0

(bi+1 − bi) · Bm−1i (t).

6. Rechnen Sie die drei Folgerungen aus der Beziehung fur die hoheren Ableitungen eines Bezier-Kurvensegments nach!

Losung:Folgerung 1: Die p-ten Ableitungen in den Endpunkten K(a) bzw. K(b) des Bezier-Segmentshangen nur von den Kontrollpunkten b0, . . . , bp bzw. bm−p, . . . , bm ab.

Wir betrachten exemplarisch den Anfangspunkt K(a). Es gilt ∆0bi := bi. Aus der Formel furdie hoheren Ableitungen ergibt sich fur t = a:

dp

dtp K(a) =m!

(m − p)!· 1(b − a)p ·

m−p

∑i=0

∆pbi · Bm−pi (a)

=m!

(m − p)!· 1(b − a)p · ∆pb0 · Bm−p

0 (a)

Page 39: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

3 Geometrisches Modellieren mit Kurven und Flachen 34

Nun muss man sich die rekursive Definition von ∆pb0 genauer anschauen.Fur p = 0 – die Kurve selbst – ist die Ableitung nur von ∆0b0 = b0 abhangig.Fur p = 1 ist

∆1b0 = ∆0b1 − ∆0b0

= b1 − b0,

die Ableitung ist also von b0, b1 abhangig.Fur p = 2 ist

∆2b0 = ∆1b1 − ∆1b0

= ∆0b2 − ∆0b1 − ∆0b1 + ∆0b0

= ∆0b2 − 2∆0b1 + ∆0b0

= b2 − 2b1 + b0,

die Ableitung ist also von b0, b1, b2 abhangig.Fur p = 3 ist

∆3b0 = ∆2b1 − ∆2b0

= ∆1b2 − ∆1b1 − ∆1b1 + ∆1b0

= ∆0b3 − ∆0b2 − ∆0b2 + ∆0b1

−∆0b2 + ∆0b1 + ∆0b1 − ∆0b0

= b3 − 3b2 + 3b1 − b0,

die Ableitung ist also von b0, b1, b2, b3 abhangig.An dieser Stelle musste man formal naturlich eine vollstandige Induktion durchfuhren, diewir uns hier ersparen wollen. Kommt Ihnen das Bildungsgesetz eigentlich bekannt vor?Folgerung 2: Die erste Ableitung in den Endpunkten K(a) bzw. K(b) des Bezier-Segmentsberechnet sich mittels K′(a) = m

b−a · (b1 − b0) und K′(b) = mb−a · (bm − bm−1).

Dies ist eine direkte Folgerung unserer obigen Betrachtungen fur p = 1. Setzen Sie einfach indie vereinfachten Ableitungsformel ein.Folgerung 3: Die zweite Ableitung in den Endpunkten K(a) bzw. K(b) des Bezier-Segmentsberechnet sich mittels K′′(a) = m(m−1)

(b−a)2 · (b2 − 2b1 + b0) und K′′(b) = m(m−1)(b−a)2 · (bm − 2bm−1 +

bm−2).Auch dies ist eine direkte Folgerung unserer obigen vereinfachten Ableitungsformel fur p =2.Fuhren Sie die Betrachtungen analog fur den Endpunkt t = b durch!

7. Gegeben sind zwei zusammenhangende Bezier-Kurvensegmente K0(t) und K1(t) vom Grad 3uber den lokalen Parameterintervallen [0, 1] und [1, 3], die an ihrer Segmenttrenngrenze t = 1C2-stetig zusammengefugt sind. Wir bilden ein ”neues“ erstes Segment mittels K0(t) = K0(t2)

und betrachten die Gesamtkurve aus K0(t) und K1(t). Wie haben sich die Form und die Ste-tigkeit der Gesamtkurve verandert?

Losung:Da K0(t) mit t ∈ [0, 1] und K1(t) mit t ∈ [1, 3] an ihrer Segmenttrenngrenze t = 1 C2-stetigzusammengefugt sind, gilt:

K0(1) = K1(1),

K′0(1) = K′

1(1) und

K′′0 (1) = K′′

1 (1).

Page 40: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

3 Geometrisches Modellieren mit Kurven und Flachen 35

K0(t) entsteht nun aus Umparametrisierung aus K0(t) mittels K0(t) = K0(t2). Damit istK0(1) = K0(1) = K1(1); die Kurve ist also weiterhin C0-stetig. Bei der Differentiation istallerdings die Kettenregel zu beachten. Es ist d

dt K0(t) = ddt K0(t2) = 2tK′

0(t2). Fur die zweiteAbleitung benotigt man noch die Produktregel. Es ist K′′

0 (t) = 2K′0(t2) + 4t2K′′

0 (t2). Damit istinsgesamt:

K0(1) = K1(1),

K′0(1) = 2K′

1(1) und

K′′0 (1) = 2K′

1(1) + 4K′′1 (1).

Gehen wir von einer nichtverschwindenden Ableitung bei t = 1 aus, ist die Gesamtkurvenicht mehr C1-stetig, aber noch G1-stetig, da sich die Richtung der Tangente bei t = 1 nichtverandert. Die C2-Stetigkeit geht verloren. Und was passiert mit der Form der Kurve? DieForm der Gesamtkurve bleibt erhalten.

3.5 Interpolation und Splines

1. Interpolieren Sie die Punkte (0, 1), (1, 0.5) und (2, 0.2) mittels polynomialer Interpolation.Verwenden Sie einmal aquidistante und einmal chordale Parametrisierung. Wenden Sie nach-einander das Verfahren von Lagrange, das Newton-Schema und die Monom-Darstellung an!

Losung:Interpolation von P0 = (x0, y0) = (0, 1), P1 = (x1, y1) = (1, 0.5), P2 = (x2, y2) = (2, 0.2), miteinem Polynom zweiten Grades, m = 2.

Aquidistante Parametrisierung: Wir wahlen t0 = 0, t1 = 0.5, t2 = 1.

Monom-Ansatz:x-Komponente: fx(t) = ∑2

i=0 axi · ti , i = 0, 1, 2.

1 0 01 0.5 0.251 1 1

·

ax0ax1ax2

=

012

Mit der Inversen

1 0 0−3 4 12 −4 2

ergibt sich ax0 = 0, ax1 = 2, ax3 = 0 und damit fx(t) = 0 + 2t + 0t2 = 2t.

y-Komponente: fy(t) = ∑2i=0 ayi · ti , i = 0, 1, 2.

Mit der rechten Seite (1, 0.5, 0.2)T und der gleichen Inversen ergibt sich ay0 = 1, ay1 =

−1.2, ay3 = 0.4 und damit fy(t) = 1 − 1.2t + 0.4t2.

Die Kurve hat in Parameterdarstellung damit die Gestalt

K(t) = (2t, 1 − 1.2t + 0.4t2) , fur t ∈ [0, 1].

Man uberpruft leicht, dass die Interpolationsbedingungen K(0) = (0, 1), K(0.5) = (1, 0.5)und K(1) = (2, 0.2) gelten.

Page 41: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

3 Geometrisches Modellieren mit Kurven und Flachen 36

Lagrange-Verfahren:

L0(t) =t − t1

t0 − t1· t − t2

t0 − t2=

t − 0.50 − 0.5

· t − 10 − 1

= 2t2 − 3t + 1,

L1(t) =t − t0

t1 − t0· t − t2

t1 − t2=

t − 00.5 − 0

· t − 10.5 − 1

= −4t2 + 4t,

L2(t) =t − t0

t2 − t0· t − t1

t2 − t1=

t − 01 − 0

· t − 0.51 − 0.5

= 2t2 − t.

x-Komponente:

fx(t) =2

∑i=0

xi · Li(t)

= x0L0(t) + x1L1(t) + x2L2(t)= 0L0(t) + 1L1(t) + 2L2(t)

= 0 − 4t2 + 4t + 4t2 − 2t= 2t.

y-Komponente:

fy(t) =2

∑i=0

yi · Li(t)

= y0L0(t) + y1L1(t) + y2L2(t)= 1L0(t) + 0.5L1(t) + 0.2L2(t)

= 0.4t2 − 1.2t + 1.

Newton-Verfahren:x-Komponente:

0 00.5 1 1−0

0.5−0 = 21 2 2−1

1−0.5 = 2 2−21−0 = 0,

fx(t) = 0 + 2(t − 0) + 0(t − 0)(t − 0.5) = 2t.

y-Komponente:0 10.5 0.5 0.5−1

0.5−0 = −11 0.2 0.2−0.5

1−0.5 = −0.6 −0.6+11−0 = 0.4,

fy(t) = 1 − 1(t − 0) + 0.4(t − 0)(t − 0.5) = 0.4t2 − 1.2t + 1.

Chordale Parametrisierung:Wir berechnen zunachst die Abstande der Interpolationspunkte

∆0 = ||P1 − P0|| =√

12 + 0.52 =√

1.25 = 1, 118,

∆1 = ||P2 − P1|| =√

12 + 0.32 =√

1.09 = 1.044

und wahlen anschließend

t0 = 0, t1 = t0 + ∆0 = 1.118, t2 = t1 + ∆1 = 2.162.

Als Parameterintervall der Kurve wahlen wir schließlich [a, b] = [0, 2.162].

Page 42: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

3 Geometrisches Modellieren mit Kurven und Flachen 37

Als Losung ergibt sich

K(t) = (0.863t + 0.029t2 , 1 − 0.53t + 0.074t2) , fur t ∈ [0, 2.162].

Fuhren Sie die verschiedenen Verfahren fur den Fall dieser chordalen Parametrisierung durchund uberprufen Sie dieses Ergebnis!

2. Interpolieren Sie die Punkte (1, 2), (2, 1), (4, 2) und (6, 6) mit einem einzelnen Bezier-Kurven-segment. Verwenden Sie chordale Parametrisierung!

Losung:Fur die chordale Parametrisierung berechnen wir die Punktabstande:

∆0 = ||P1 − P0|| =√

12 + 12 =√

2 = 1.41,

∆1 = ||P2 − P1|| =√

22 + 12 =√

5 = 2.24,

∆2 = ||P3 − P2|| =√

22 + 42 =√

20 = 4.47

und wahlen anschließend

t0 = 0, t1 = t0 + ∆0 = 1.41, t2 = t1 + ∆1 = 3.65, t3 = t2 + ∆2 = 8.12.

Als Parameterintervall der Kurve wahlen wir schließlich [a, b] = [0, 8.12].

Fur die polynomiale Interpolation von vier Punkten benotigen wir den Polynomgrad 3, setzenalso unsere Interpolationsbedingungen mit einem kubischen Bezier-Kurvensegment wie folgtan:

K(ti) =3

∑j=0

b j · B3j (ti)

!= Pi fur i = 0, . . . , 3.

Die Anfangs- und Endpunkt-Eigenschaft eines Bezier-Segments liefert uns direkt den erstenund letzten Kontrollpunkt: b0 = P0 = (1, 2) und b3 = P3 = (6, 6).

Fur die anderen beiden Unbekannten b1 und b2 werten wir obige Bedingung fur i = 1, 2aus und erhalten daraus je zwei Gleichungen fur die x- und fur die y-Komponente. Dazubenotigen wir noch die Werte der kubischen Bernstein-Polynome zu den beiden Zeitwertent1 und t2. Mit

B30(1.41) = 0.56, B3

1(1.41) = 0.36, B32(1.41) = 0.07, B3

3(1.41) = 0.005 und

B30(3.65) = 0.17, B3

1(3.65) = 0.41, B32(3.65) = 0.33, B3

3(3.65) = 0.09

und den Werten fur b0 und b3 ergibt sich fur die x- bzw. y-Komponente:

0.36b1x + 0.07b2x = 1.410.41b1x + 0.33b2x = 3.29

bzw.0.36b1 y + 0.07b2 y = −0.15

0.41b1 y + 0.33b2 y = 1.12.

Mit der Inversen (3.66 −0.78−4.55 4.00

),

die sich fur beide Komponenten verwenden lasst, resultieren die Losungsvektoren b1 = (2.61,−1.42)und b2 = (6.73, 5.16).

3. Leiten Sie die kubischen Hermite-Polynome uber [a, b] her!

Losung:

Page 43: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

3 Geometrisches Modellieren mit Kurven und Flachen 38

Die kubische Hermite-Interpolation soll die Funktionswerte und die Ableitungswerte an denIntervallgrenzen interpolieren. Dazu werden eben diese Werte mittels den Hermite-PolynomenHi(t) als Gewichte zusammen gemischt:

f (t) = x0H30 (t) + m0H3

1 (t) + m1H32 (t) + x1H3

3 (t)

Wir lassen im Folgenden die hochgestellte 3 zur Bezeichnung des Polynomgrads weg. H0(t)ist ein Polynom dritten Grades, das zu Beginn, also bei t = a den Wert ”1annehmen soll. AmEnde, also bei t = b soll es den Wert 0 annehmen. Dies sind zwei Bedingungen. Die AbleitungH′

0(t) soll fur t = a und fur t = b ebenfalls identisch Null sein. H1(t) nimmt fur t = a undt = b den Wert 0 an. H′

1(t) ist ebenso identisch 0 fur t = b, aber fur t = a hat die Ableitungden Wert 1. Sie haben die Konstruktionsidee erkannt? Werden die Hi(t) so bestimmt, nimmtfur t = a nur x0 Einfluss auf f (t) und nur m0 Einfluss auf f ′(t). Genauso nimmt fur t = b nurx1 Einfluss auf f (t) und nur m1 Einfluss auf f ′(t).

Wir schauen uns zuerst die kubischen Hermite-Polynome H3i (t) uber [0, 1] an und wahlen fur

eine Herleitung exemplarisch H1(t) aus:

Es ist H1(t) = a0 + a1t + a2t2 + a3t3 und H′1(t) = a1 + 2a2t + 3a3t2 mit den Bedingungen:

H1(0) = a0 = 0,

H1(1) = a0 + a1 + a2 + a3 = 0,

H′1(0) = a1 = 1,

H′1(1) = a1 + 2a2 + 3a3 = 0.

Das Gleichungssystem ist sehr einfach zu losen. Es ergibt sich a0 = 0, a1 = 1, a2 = −2, a3 = 1.Damit ist H1(t) = t − 2t2 + t3. Genau nach dem gleichen Muster resultieren die anderenHermite-Polynome uber [0, 1] zu H0 = 1 − 3t2 + 2t3, H2 = −t2 + t3 und H3 = 3t2 − 2t3.

Wir mussen jetzt die Konstruktionsidee und unsere bisherigen Ergebnisse nur noch auf dasallgemeine Intervall [a, b] ubertragen. Bei der Interpolation der Werte, also bei H0 und H3,konnen wir ohne Schaden an zurichten einfach mit der affinen Standard-Parametertransforma-tion das Intervall [a, b] auf [0, 1] schrumpfen und die Hermite-Polynome H0 und H3 benutzen.Der Funktionswert bleibt an den betreffenden Stellen 0 bzw. 1. Es gilt also

H0(s) = H0((s − a)/(b − a)) = 1 − 3(

s − ab − a

)2+ 2

(s − ab − a

)3,

H3(s) = H3((s − a)/(b − a)) = 3(

s − ab − a

)2− 2

(s − ab − a

)3

fur s ∈ [a, b]. Wurden wir genau das gleiche beispielsweise fur H1 tun, also H1(s) = H1((s −a)/(b − a)), so wurde beim Differenzieren nach s nach der Kettenregel der Faktor 1/(b − a)den angestrebten Wert 1 fur s = a zu 1/(b − a) werden lassen. Dem steuern wir entgegen,indem wir:

H1(s) = (b − a)H1((s − a)/(b − a)) = (b − a)

{s − ab − a

− 2(

s − ab − a

)2+

(s − ab − a

)3}

,

H2(s) = (b − a)H2((s − a)/(b − a)) = b − a)

{−(

s − ab − a

)2+

(s − ab − a

)3}

wahlen. Damit sind die Hermite-Polynome fur [a, b] vollzahlig. Uberprufen Sie zur Probe dieHermite-Bedingungen in den Endpunkten des Intervalls [a, b] fur diese Polynome!

Page 44: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

3 Geometrisches Modellieren mit Kurven und Flachen 39

4. Interpolieren Sie die Punkte (1, 2), (2, 1), (4, 2) und (6, 6) durch einen chordal parametrisier-ten gewohnlichen kubischen Bezier-Spline mit naturlichen Randbedingungen! Zeichnen Siedie Kurve und die Kontrollstrukturen auf! Verdeutlichen Sie sich an der Zeichnung die Uber-gangsbedingungen in den Segmenttrenngrenzen!

Losung:Zur Durchfuhrung der stuckweise kubischen Interpolation mit C2-Ubergangen in den Seg-menttrenngrenzen benotigen wir zuerst eine Parameterwahl. Wir interpolieren vier Punkte,benotigen damit k + 1 = 3 Segmente und suchen deshalb insgesamt 10 Bezier-Kontrollpunkte.

Fur die chordale Parametrisierung berechnen wir die Punktabstande:

∆0 = ||P1 − P0|| =√

12 + 12 =√

2 = 1.41,

∆1 = ||P2 − P1|| =√

22 + 12 =√

5 = 2.24,

∆2 = ||P3 − P2|| =√

22 + 42 =√

20 = 4.47

und wahlen anschließend

t0 = 0, t1 = t0 + ∆0 = 1.41, t2 = t1 + ∆1 = 3.65, t3 = t2 + ∆2 = 8.12.

Als Parameterintervall der Kurve wahlen wir schließlich [a, b] = [0, 8.12].

Die mittels unseres Gleichungsbundels zu ermittelnden Hilfspunkte dl (l = 0, . . . , 3) reduzie-ren sich bei der Verwendung der naturlichen Randbedingungen auf die Unbekannten d1 undd2. Wir verfahren nach unserem Algorithmus:

(a) Wir setzen b0 = P0 = (1, 2) und b9 = P3 = (6, 6). An den Segmenttrenngrenzen setzenwir b3 = P1 = (2, 1) und b6 = (4, 2).

(b) Wir setzen d0 = b0 = (1, 2) und d3 = b9 = (6, 6).(c) Wir berechnen zuerst Werte der Hilfsgroßen:

∆−1 = ∆0 = 1.41, ∆1 = 2.24, ∆2 = ∆3 = 4.47,

C0 = ∆−1 + ∆0 + ∆1 = 5.06,C1 = ∆0 + ∆1 + ∆2 = 8.12,C2 = ∆1 + ∆2 + ∆3 = 11.18,

A0 = ∆20 · C0 = 10.13,

A1 = ∆21 · C1 = 40.61,

A2 = ∆22 · C2 = 223.61,

B1 = (∆0 + ∆1) · C1 · C0 = 150.16,B2 = (∆1 + ∆2) · C2 · C1 = 609.18,D1 = ∆1(∆−1 + ∆0) · C1 + ∆0(∆1 + ∆2) · C0 = 99.42,D2 = ∆2(∆0 + ∆1) · C2 + ∆1(∆2 + ∆3) · C1 = 344.96.

Wir erhalten das um zwei Gleichungen und zwei Unbekannte reduzierte Gleichungssy-stem fur d1 und d2:

A1d0 + D1d1 + A0d2 = B1b3,A2d1 + D2d2 + A1d3 = B2b6.

99.42d1 + 10.13d2 = (259.70, 68.93),223.61d1 + 344.96d2 = (2193.05, 974.69).

Page 45: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

3 Geometrisches Modellieren mit Kurven und Flachen 40

Die Inverse der Koeffizientenmatrix ist(

0.0108 −0.0003−0.0070 0.0031

)

und es ergeben sich nach separater Betrachtung der x- und y-Komponente die Losungs-vektoren d1 = (2.103, 0.434) und d2 = (4.994, 2.544).

(d) Nun mussen die noch unbekannten Bezier-Kontrollpunkte berechnet werden. Aus demersten Gleichungsbundel ergeben sich fur l = 1, 2, 3 die Werte

b1 = 1/C0((∆0 + ∆1)d0 + ∆−1d1) = (1.31, 1.56),

b4 = 1/C1((∆1 + ∆2)d1 + ∆0d2) = (2.61, 0.80) und

b7 = 1/C2((∆2 + ∆3)d2 + ∆1d3) = (5.20, 3.24)

und aus dem dritten Gleichungsbundel fur l = 0, 1, 2 die Werte

b2 = 1/C0((∆1d0 + (∆−1 + ∆0)d1)) = (1.62, 1.13),

b5 = 1/C1((∆2d1 + (∆0 + ∆1)d2)) = (3.40, 1.38) und

b8 = 1/C2((∆3d2 + (∆1 + ∆2)d3)) = (5.60, 4.62).

Damit sind alle Bezier-Kontrollpunkte berechnet und die drei Bezier-Segmente uber den Kon-trollpolygonen (b0, b1, b2, b3), (b3, b4, b5, b6) und (b6, b7, b8, b9) konnen gezeichnet werden.

In Abbildung 3.11 sehen Sie den gezeichneten Spline mit seinen Kontrollstrukturen. BeachtenSie die grafische Konstruktion der C1- und C2-Bedingungen an den Segmenttrenngrenzen!

b0

d =0

b3

b6

b =9

d3

d1

d2

b1

b2

b5

b7

b8

b4

Abbildung 3.11: Die drei Bezier-Segmente des Bezier-Splines

5. Wahlen Sie die Punkte (0, 0), (1, 1) und (2,−1) als Gewichtspunkte eines frei modellieren-den kubischen Bezier-Splines. Ermitteln Sie alle Bezier-Kontrollpunkte und zeichnen Sie dieKurve!

Losung:Bei einem frei modellierenden Bezier-Spline sind die Hilfspunkte bzw. Gewichtspunkte vor-gegeben, aus denen sich mit Hilfe der drei Bundel von Gleichungen die Bezier-Kontrollpunkteberechnen lassen.

Page 46: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

3 Geometrisches Modellieren mit Kurven und Flachen 41

In diesem Fall ist keine Losung von Gleichungssystemen notwendig. Die Kontrollpunkte wer-den einfach direkt ausgerechnet!

Da die Abstande zwischen den Segmenttrennpunkten nicht bekannt sind, wahlen wir hierimplizit die aquidistante Parametrisierung mit ∆i = 1 fur alle i. Dies vereinfacht die Werteder anderen Hilfsgroßen auf Cl = 3, Al = 3, Bl = 18 und Dl = 12 fur alle l.

Damit vereinfachen sich die drei Gleichungsbundel auf:

(2dl−1 + dl)/3 = b3l−2 fur l = 1, . . . , k + 1,(dl−1 + 4dl + dl+1)/6 = b3l fur l = 1, . . . , k,

(dl + 2dl+1)/3 = b3l+2 fur l = 0, . . . , k,

In unserem Fall haben wir 3 Hilfspunkte d0 = (0, 0), d1 = (1, 1) und d2 = (2,−1), also 2Bezier-Segmente; k hat damit den Wert k = 1.

Damit ist b0 = d0 = (0, 0) und b6 = d2 = (2,−1).

Die restlichen Kontrollpunkte berechnen wir fur l = 1, 2 aus

b1 = (2d0 + d1)/3 = (1/3, 1/3),b4 = (2d1 + d2)/3 = (4/3, 1/3),

und fur l = 1 aus

b3 = (d0 + 4d1 + d2)/6 = (1, 1/2),

und fur l = 0, 1 aus

b2 = (d0 + 2d1)/3 = (2/3, 2/3),b5 = (d1 + 2d2)/3 = (5/3,−1/3).

Damit sind alle Bezier-Kontrollpunkte berechnet und die beiden Bezier-Segmente uber denKontrollpolygonen (b0, b1, b2, b3) und (b3, b4, b5, b6) konnen gezeichnet werden.

In Abbildung 3.12 sehen Sie den gezeichneten Spline mit seinen Kontrollstrukturen. BeachtenSie die grafische Konstruktion der C1- und C2-Bedingungen an den Segmenttrenngrenzen!

3.6 B-Spline-Kurven

1. Rechnen Sie fur den gegebenen Knotenvektor T = (0, 0, 0, 0, 1, 1, 1, 1) nach, dass die B-Spline-Basisfunktionen N4

i (t), (i = 0, . . . , 3) in die Bernstein-Polynome B3i (t) uber dem Intervall [0, 1]

ubergehen!

Losung:Alle B-Spline-Basisfunktionen einer Ordnung o konnen uber die Formel von Cox und de Boorrekursiv aus den Basisfunktionen der Ordnung o − 1 gewonnen werden. Der KnotenvektorT = (ti)i=0,...,n mit n + 1 Knoten sei vorgegeben:

N1j (t) :=

{1 t j ≤ t < t j+1,0 sonst

, j = 0, . . . , n − 1

Noj (t) :=

t − t j

t j+o−1 − t j· No−1

j (t) +t j+o − t

t j+o − t j+1· No−1

j+1 (t) o > 1, j = 0, . . . , n − o.

Ist ein Nenner 0 ist auch die in diesem Summanden beteiligte B-Spline-Basisfunktion 0 – derSummand fallt weg.

Page 47: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

3 Geometrisches Modellieren mit Kurven und Flachen 42

b0d =

0

b3

b6

d1

d =2

b1

b2

b5

b4

Abbildung 3.12: Die beiden Bezier-Segmente des frei modellierenden Bezier-Splines

Wir betrachten den Knotenvektor T = (0, 0, 0, 0, 1, 1, 1, 1) und o = 4. Es gilt also n = 7 undt0 = 0, t1 = 0, t2 = 0, t3 = 0, t4 = 1, t5 = 1, t6 = 1, t7 = 1. Wir berechnen nacheinander dieB-Spline-Basisfunktionen der Ordnungen 1 bis 4:

Ordnung o = 1:

N1j (t) =

{1 t j ≤ t < t j+1,0 sonst

, j = 0, . . . , 6.

Damit istN1

0 = N11 = N1

2 = 0 und N14 = N1

5 = N16 = 0

undN1

3 (t) = 1 fur 0 = t3 ≤ t < t4 = 1.

Ordnung o = 2:

N2j (t) =

t − t j

t j+1 − t j· N1

j (t) +t j+2 − t

t j+2 − t j+1· N1

j+1(t) , j = 0, . . . , 5.

Damit ist

N20 (t) =

t − t0

t1 − t0· N1

0 (t) +t2 − tt2 − t1

· N11 (t) = 0

N21 (t) =

t − t1

t2 − t1· N1

1 (t) +t3 − tt3 − t2

· N12 (t) = 0

N22 (t) =

t − t2

t3 − t2· N1

2 (t) +t4 − tt4 − t3

· N13 (t) = 0 + (1 − t) = 1 − t

N23 (t) =

t − t3

t4 − t3· N1

3 (t) +t5 − tt5 − t4

· N14 (t) = t + 0 = t

N24 (t) =

t − t4

t5 − t4· N1

4 (t) +t6 − tt6 − t5

· N15 (t) = 0

N25 (t) =

t − t5

t6 − t5· N1

5 (t) +t7 − tt7 − t6

· N16 (t) = 0.

Page 48: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

3 Geometrisches Modellieren mit Kurven und Flachen 43

Ordnung o = 3:

N3j (t) =

t − t j

t j+2 − t j· N2

j (t) +t j+3 − t

t j+3 − t j+1· N2

j+1(t) , j = 0, . . . , 4.

Damit ist

N30 (t) =

t − t0

t2 − t0· N2

0 (t) +t3 − tt3 − t1

· N21 (t) = 0

N31 (t) =

t − t1

t3 − t1· N2

1 (t) +t4 − tt4 − t2

· N22 (t) = 0 + (1 − t)2 = (1 − t)2

N32 (t) =

t − t2

t4 − t2· N2

2 (t) +t5 − tt5 − t3

· N23 (t) = t(1 − t) + (1 − t)t = 2t(1 − t)

N33 (t) =

t − t3

t5 − t3· N2

3 (t) +t6 − tt6 − t4

· N24 (t) = t2 + 0 = t2

N34 (t) =

t − t4

t6 − t4· N2

4 (t) +t7 − tt7 − t5

· N25 (t) = 0.

Ordnung o = 4:

N4j (t) =

t − t j

t j+3 − t j· N3

j (t) +t j+4 − t

t j+4 − t j+1· N3

j+1(t) , j = 0, . . . , 3.

Damit ist

N40 (t) =

t − t0

t3 − t0· N3

0 (t) +t4 − tt4 − t1

· N31 (t) = 0 + (1 − t)3 = (1 − t)3

N41 (t) =

t − t1

t4 − t1· N3

1 (t) +t5 − tt5 − t2

· N32 (t) = t(1 − t)2 + 2t(1 − t)2 = 3t(1 − t)2

N42 (t) =

t − t2

t5 − t2· N3

2 (t) +t6 − tt6 − t3

· N33 (t) = 2t2(1 − t) + t2(1 − t) = 3t2(1 − t)

N43 (t) =

t − t3

t6 − t3· N3

3 (t) +t7 − tt7 − t4

· N34 (t) = t3 + 0 = t3.

Damit ist N4i (t) = B3

i (t) = (3i)ti(1 − t)3−i , i = 0, . . . , 3.

2. Implementieren Sie ein Programm zum Zeichnen einer offenen B-Spline-Kurve der Ordnung4. Benutzen Sie die Rekursionsformel nach Cox und de Boor und alternativ den de Boor-Algorithmus! Verwenden Sie nicht die OpenGL-Funktionalitaten fur NURBS!

Losung:Ein entsprechendes Beispielprogramm finden Sie in den Quellcodes zu diesem Kapitel.

Erweitern Sie dieses Programm so, dass es B-Splines beliebiger Ordnung zeichnen kann!

3.7 Parametrische Flachendarstellungen

1. Zeigen Sie die Unabhangigkeit des Tensorprodukt-Ansatzes von der gewahlten Richtung!

Losung:Gegeben ist ein Bezier-Kontrollnetz mit den Punkten bi j, i = 0, . . . , n, j = 0, . . . , m. Wir zei-gen, dass die Idee ein Bezier-Kurvensegment ∑m

j=0 b0 j · Bmj (v) durch den Raum zu bewegen,

indem man seine Kontrollpunkte b0 j auf eigenen Bezier-Kurvensegmenten entlang der Kon-trollpunkte bi j bewegt, auch umgedreht werden kann. Orientieren Sie sich zu besseren Vor-stellung an Abbildung 3.50.

Page 49: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

3 Geometrisches Modellieren mit Kurven und Flachen 44

Wir beginnen also mit einem Bezier-Kurvensegment ∑ni=0 bi0 · Bn

i (u) und ersetzen jeden Kon-trollpunkt bi0 durch ein eigenes Kurvensegment ∑m

j=0 bi j ·Bmj (v). Setzt man die Kontrollpunkt-

Kurvensegment in das erste Segment ein, ergibt sich unmittelbar ∑ni=0 ∑m

j=0 bi j · Bmj (v)Bn

i (u).

2. Die Iso-Parameterlinien eines Tensorprodukt-Flachensegments eines bestimmten Typs sindKurven des gleichen Typs. Wie verhalt es sich mit einer beliebigen Kurve auf dem Flachen-segment?

Losung:Eine beliebige Flachenkurve ist leider i. d. R. keine Kurve des gleichen Typs! Dies macht ins-besondere das Trimmen und das Blenden von Flachen so schwierig.

3. Zeigen Sie die Eckpunkt- und die Randkurven-Eigenschaft eines Bezier-Flachensegments!

Losung:Sei F(u, v) = ∑n

i=0 ∑mj=0 bi j · Bn

i (u)Bmj (v) mit (u, v) ∈ [a, b] × [c, d] gegeben.

Eckpunkt-Eigenschaft:Wir wahlen exemplarisch den Punkt mit dem Parameterwert (0, d) aus. In diesem Fall ist

F(0, d) =n

∑i=0

m

∑j=0

bi j · Bni (0)Bm

j (d)

=m

∑j=0

b0 j · Bn0 (0)Bm

j (d)

= b0m · Bn0 (0)Bm

m(d)

= b0m · 1 = b0m.

Fur die anderen drei Eckpunkte ist der Nachweis analog.

Randkurven-Eigenschaft:Wir wahlen exemplarisch die Randkurve aus, auf der u = a gilt. Dann ist

F(a, v) =n

∑i=0

m

∑j=0

bi j · Bni (a)Bm

j (v)

=m

∑j=0

b0 j · Bn0 (a)Bm

j (v)

=m

∑j=0

b0 j · Bmj (v),

was genau dem Bezier-Kurvensegment der Kontrollpunkte b0 j, j = 1, . . . , m entspricht. Dieanderen drei Randkurven sind analog zu erzeugen.

4. Formulieren Sie die Eigenschaft der ”linearen Prazision“ fur ein Bezier-Flachensegment! Wasbedeutet diese?

Losung:Analog zum Fall eines Bezier-Kurvensegments reproduziert ein Bezier-Flachensegment beiregelmaßiger Verteilung der Kontrollpunkte in einem Rechteck dieses Rechteck ohne Verzer-rungen.

Page 50: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

3 Geometrisches Modellieren mit Kurven und Flachen 45

Sei o. b. d. A. ein Rechteck in der xy-Ebene gegeben durch seine Eckpunkte (xmin, ymin) und(xmax, ymax). Die Kontrollpunkte seien wie folgt gewahlt:

bi j = (xmin + i · xmax − xminn

, ymin + j · ymax − yminm

)

= ((1 − in

) · xmin +in· xmax, (1 − j

m) · ymin +

jm

· ymax),

mit i = 0, . . . , n, j = 0, . . . , m. Dann gilt:

F(u, v) =n

∑i=0

m

∑j=0

bi j · Bni (t)Bm

j (t)

= ((1 − u) · xmin + u · xmax, (1 − v) · ymin + v · ymax)

3.10 Fallstudien

3.10.1 Freiformgeometrie in OpenGL

1. Schreiben Sie ein OpenGL-Programm, das die restlichen Kurven aus Abbildung 3.21 reali-siert! Testen Sie Ihr Programm zusatzlich mit echten Raumkurven!

Losung:Das gegebene Beispielprogramm BezierKurvensegmente zu dieser Fallstudie realisiert dieplanare Kurve aus Teilabbildung b) in Abbildung 3.21. Die Kurven fur die anderen Teilab-bildungen haben ebenfalls den Grad 3. Damit konnen Sie einfach das Beispielprogramm alsVorlage benutzen und die Kontrollpunkte abandern. Wir schlagen folgende Wahl der Kon-trollpunkte vor:

Fur die Kurve aus Teilabbildung a) in Abbildung 3.21

GLfloat ctrlPoints[4][3]= // Array der Kontrollpunkte{{1.73, 1.84}, {2.02, 4.23, 0.00},{5.18, 6.35, 0.00}, {8.39, 6.13, 0.00}};

Fur die Kurve aus Teilabbildung c) in Abbildung 3.21

GLfloat ctrlPoints[4][3]= // Array der Kontrollpunkte{{1.73, 2.00}, {3.24, 6.11, 0.00},{5.82, 2.19, 0.00}, {7.74, 6.12, 0.00}};

Fur die Kurve aus Teilabbildung d) in Abbildung 3.21

GLfloat ctrlPoints[4][3]= // Array der Kontrollpunkte{{1.69, 5.34}, {7.63, 4.07, 0.00},{3.04, 2.01, 0.00}, {4.18, 5.91, 0.00}};

Zum Test mit echten Raumkurven mussen Sie lediglich die z-Koordinaten der Kontrollpunkteauf sinnvolle Werte setzen. Der im Beispielprogramm eingesetzte interaktive Manipulatorermoglicht dann sehr einfach das raumliche Erkunden der Kurve.

Erweitern Sie das Beispielprogramm so, dass es Bezier-Kurvensegmente beliebigen Gradsdarstellen kann!

2. Vervollstandigen Sie das Programm zur Anzeige des Utah-Teapots, so dass der gesamte Tea-pot dargestellt wird! Generieren Sie auch eine Ausgabe des Teapots mit ausgefullten Flachen!

Losung:

Page 51: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

3 Geometrisches Modellieren mit Kurven und Flachen 46

Sie mussen aus den 9 vorhandenen Segmenten durch Spiegelungen noch insgesamt weitere19 Segmente erzeugen. Beispielsweise fehlen fur die Krempe noch 3 Segmente und fur denDeckel noch 6 Segmente. Verwenden Sie dazu das vorgegebene Programmgerust UtahTeapotzu dieser Fallstudie.

Das Ergebnis finden Sie ebenfalls als Quellcode UtahTeapotWire zu dieser Fallstudie. Voll-ziehen Sie die Anderungen am Quellcode nach!

Wollen wir nun einen Teapot mit ausgefullten Flachen darstellen, mussen wir nur noch Lichtund Materialien definieren und die Flachendarstellung einschalten. Das Ergebnis finden Sieunter UtahTeapotFaces. Aber halt, warum ist der Teapot denn kariert? Wir haben Vorder-und Ruckseiten unterschiedliche Materialien gegeben! Mit unseren naiven Spiegelungen zurHerstellung der fehlenden Segmente, haben wir Vorder- und Ruckseiten im Modell gemischt!Dies ist uns bei der Gitterliniendarstellung nicht aufgefallen. Der Durchlaufsinn der entste-henden Primitive ist hier fur die einzelnen Segmente unterschiedlich. Die Orientierung einesSegments wurde bereits fur Sie korrigiert. Korrigieren Sie alle restlichen Segmente!

3. Experimentieren Sie mit der Darstellung des NURBS-Flachensegments und vergewissern Siesich insbesondere, dass Sie den hier notwendigen Umgang mit den homogenen Koordinatenverstanden haben!

Losung:Das notwendige Programmgerust finden Sie unter den Quelldateien zu dieser Fallstudie alsNURBSFlachensegment.

Page 52: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

Kapitel 4

Polygonale Netze

4.1 Polygone und Polyeder

1. Zeichnen Sie die planaren Graphen der Polyeder aus Abbildung 4.5 und uberprufen SieGultigkeit der Euler’schen Formel fur diese Objekte!

Losung:Fur den Tetraeder gilt 4 − 6 + 4 = 2; fur die vierseitige Pyramide 5 − 8 + 5 = 2 und fur dasPrisma ganz rechts in Abbildung 4.5 auf Seite 198 gilt 6 − 9 + 5 = 2.

Abbildung 4.1: Die planaren Graphen der Aufgabe 1

2. Uberprufen Sie das linke Polygon aus Abbildung 4.2 mit Hilfe des Verfahrens auf Seite 197auf Konvexitat, falls die Eckpunkte die in Tabelle 4.1 angegebenen Koordinaten besitzen!

Tabelle 4.1: Die Koordinaten fur Aufgabe 2

V0 V1 V2 V3 V4 V5(1, 0) (5, 0) (5, 2.5) (4, 2.5) (3, 3) (1, 1)

Losung:Der Schwerpunkt fur das linke Polygon in Abbildung 4.1 ist gegeben als

C =16(1 + 5 + 5 + 4 + 3 + 1, 0 + 2.5 + 2.5 + 3 + 1) = (

196

,32).

Page 53: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

4 Polygonale Netze 48

Die Normale fur V0V1 ist n0 =

(01

), die Normale fur V1V2 ist n1 =

(−10

). Fur V2V3 ist

n2 =

(0−1

), fur V5V0 ist die Normale gegeben durch

(10

). Dann sind die Normalenformen

gegeben durch

y = 0,−x − 5 = 0,

−y − 52

0,

x = 0.

Die Normalenform fur die Gerade fur die Kante V3V4 ist gegeben durch

−2x − 12

y +152

= 0.

Die Normalenform fur die Gerade fur die Kante V4V5 ist gegeben durch

x − y = 0.

Setzt man C in diese Normalenformen ein, erhalt man immer positives Vorzeichen; also istdieses Polygon konvex.

V0 V1

V3V4

V5

V2

C

Abbildung 4.2: Das Polygon und der Schwerpunkt fur Aufgabe 2

3. An den Eckpunkten eines planaren Polygons ist der Außenwinkel α und Innenwinkel β wiein Abbildung 4.3 definiert.

a) Weisen Sie nach, dass die Summe aller Innenwinkel eines n-seitigen konvexen Polygonsgleich (n − 2)π ist!

b) Weisen Sie nach, dass die Summe aller Außenwinkel gleich 2π ist!

αβ

Abbildung 4.3: Innen- und Außenwinkel in einem planaren Polygon

Losung:

a) Wir wahlen einen der Eckpunkte, Vi, beliebig aus und bilden Dreiecke mit den restlichenEckpunkten. Dann gibt es n − 2 Dreiecke wie in Abbildung 4.4.Die Summe der Innenwinkel dieser Dreiecke ist immer π . Dann ist die Summe der Innen-winkel gleich I = (n − 2)π .

Page 54: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

4 Polygonale Netze 49

b) An einer Ecke gilt fur die Summe des Innen- und Außenwinkels offensichtlich immerα + β = π . Also ist α = π −β und

E =n

∑i=1

αi =n

∑i=1

(π −βi)

= nπ −n

∑i=1

βi

= nπ − I= nπ − (n − 2)π

= 2π .

Abbildung 4.4: Dreiecke falls das Eck rechts unten als Vi gewahlt wurde in Aufgabe 3

4. Ist ein Polygon mit n Eckpunkten sowohl gleichseitig als auch gleichwinklig wird es ein re-gulares n-Eck genannt. Regulare Sternpolygone entstehen durch Verbinden des jeweils ubernach-sten Punkts in einem regularen n-Eck. Sind V0, V1, V2, V3 und V4 die Eckpunkte eines re-gularen 5-Ecks, dann ist ein regulares Sternpolygon gegeben durch den geschlossenen Po-lygonzug {(V0, V2), (V2, V4), (V4, V1), (V1, V3), (V3, V0)}. Zeichnen Sie regulare n-Ecke furn = 3, 4, 5, 6, 7, 8 und regulare Sternpolygone fur n = 5, n = 7 und n = 9!

Losung:Die Eckpunkte regularer n-Ecke legen wir auf den Einheitskreis mit Mittelpunkt im Ursprung.Dann sind die Eckpunkte gegeben durch

Vj = (cos j · (2π

n), sin j · (2π

n), j = 0, . . . n − 1.

Aus den Abbildungen sehen Sie, dass fur großes n die regularen n-Ecken als Naherung vonKreisen auf dem Bildschirm geeignet sind.

In den Abbildungen 4.5 und 4.6 sehen Sie die n-Ecke fur n = 3, 4, 5, 6, 7 und n = 8.

Abbildung 4.5: Regulare n-Ecke fur n = 3, 4, 5 und n = 6 fur Aufgabe 4

Abbildung 4.6: Regulare n-Ecke fur n = 7 und n = 8 fur Aufgabe 4

In Abbildung 4.7 finden Sie die entsprechenden regularen Sternpolygone. Eine Methode zurKonstruktion der Sternpolygone ist es, wie in der Aufgabenstellung von den regularen n-Ecken auszugehen. Die Sternpolygone sind Beispiele fur nicht-einfache Polygone. Jede der

Page 55: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

4 Polygonale Netze 50

Seiten wird in 3 Teile geteilt. Die jeweils mittleren Teilen bilden ein konvexes regulares Poly-gon, den sogenannten Kern des regularen Sternpolygons.Dadurch wird eine weitere Konstruktion der Sternpolygone moglich.Zeichnen Sie ein re-gulares n-Eck. Die Ecken des entsprechenden regularen Sternpolygons sind gegeben als Schnitt-punkt der Geraden, die die Kanten des n-Ecks enthalten. Dabei wird die i-te Kante immer mitder (i + 2)-ten Kante geschnitten!

Abbildung 4.7: Die regularen Sternpolygone fur n = 5, n = 7 und n = 9 fur Aufgabe 4

4.2 Datenstrukturen fur polygonale Netze

1. Gegeben sind die Punkte V1 = (1, 1), V2 = (2, 5), V3 = (2, 1), V4 = (3, 5), V5 = (4, 3),V6 = (5, 2), V7 = (4, 0) und V8 = (3, 0). Skizzieren Sie das polygonale Netz fur die Eckenli-ste F1 = (1, 2, 3), F2 = (3, 2, 4), F3 = (3, 4, 5, 6), F4 = (6, 7, 8), F5 = (1, 3, 8), F6 = (3, 6, 8).

Losung:

(a) Die Skizze finden Sie in Abbildung 4.8.(b) Fur die Kantenliste werden die Kanten neu nummeriert durch Zeiger auf ihre Eckpunkte;

daruberhinaus darf man nicht vergessen, die Orientierung der Kanten anzugeben!

E1 = (1, 2; 1, N), E2 = (2, 3; 1, N), E3 = (3, 1; 1, N),E4 = (2, 4; 2, N), E5 = (3, 4; 3, 2), E6 = (4, 5; 3, N),E7 = (5, 6; 3, N), E8 = (3, 6; 6, 3), E9 = (6, 7; 4, N),

E10 = (7, 8; 4, N), E11 = (6, 8; 6, 4), E12 = (3, 8; 5, 6), E13 = (1, 8; N, 5).

Jetzt konnen die Facetten durch Verweise auf dıe nummerierten Kanten angegeben wer-den:

F1 = (1, 2, 3), F2 = (2, 4, 5), F3 = (5, 6, 7, 8),F4 = (9, 10, 11), F5 = (3, 12, 13), F6 = (8, 11, 12).

2. In der Tabelle 4.2 finden Sie die 10 Ecken V0, . . . , V9. Skizzieren Sie das polygonale Netz furdie folgende Eckenliste: F0 = (0, 2, 1), F1 = (0, 3, 2), F2 = (2, 5, 6, 1), F3 = (3, 4, 5, 2), F4 =(1, 6, 8), F5 = (4, 7, 6, 5), F6 = (7, 9, 6).Stellen Sie fur die gegebene Facettennummerierung und die folgende Kantennummerierungdie Kantenliste und die doppelt verkettete Kantenliste fur dieses Netz auf: E0 = (0, 1), E1 =(0, 2), E2 = (0, 3), E3 = (1, 2), E4 = (2, 3), E5 = (1, 8), E6 = (1, 6), E7 = (2, 5), E8 = (3, 4),E9 = (6, 8), E10 = (5, 6), E11 = (4, 7), E12 = (6, 7), E13 = (6, 9), E14 = (7, 9), E15 = (4, 5).

Tabelle 4.2: Die Eckenkoordinaten fur Aufgabe 2

0 1 2 3 4 5 6 7 8 9(0,0) (1,2) (2,1) (2,0) (3,0) (3,1) (4,2) (4,0) ( 5

2 , 4) (5,0)

Losung:

Page 56: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

4 Polygonale Netze 51

-

6

F3

F6F4

F5

F1

F2

Abbildung 4.8: Die Skizze des Netzes in Aufgabe 1 a)

(a) Die Losung finden Sie in Abbildung 4.9. Fur die Skizze benotigen Sie die Eckenkoordina-ten nicht, sie sind nur zur besseren Orientierung oder falls Sie die Skizze nochmals aufeinem separaten Blatt machen mochten mit angegeben!

(b) Die Nummerierung der Facetten wie in Teilaufgabe a) wird weiter verwendet. Dann er-geben sich die folgenden Kanten fur die Kantenliste:

E0 = (0, 1; N, 0), E1 = (0, 2; 0, 1), E2 = (0, 3; 1, N), E3 = (1, 2; 2, 0),E4 = (2, 3; 3, 1), E5 = (1, 8; N, 4), E6 = (1, 6; 4, 2), E7 = (2, 5; 2, 3),E8 = (3, 4; 3, N), E9 = (6, 8; 4, N), E10 = (5, 6; 2, 5), E11 = (4, 7; 5, N),

E12 = (6, 7; 6, 5), E13 = (6, 9; N, 6), E14 = (7, 9; 6, N), E15 = (4, 5; 3, 5).

Jetzt konnen die Facetten als Zeiger auf diese Ecken dargestellt werden:

F0 = (1, 3, 0), F1 = (2, 4, 1), F2 = (3, 7, 10, 6), F3 = (8, 15, 7, 4),F4 = (6, 9, 5), F5 = (15, 11, 12, 10), F6 = (12, 14, 13).

3. Berechnen Sie die Facettennormale fur das durch V0 = (1, 1, 2), V1 = (2, 0, 5), V2 = (5, 1, 4)und V3 = (6, 0, 7) gegebene Viereck mit Hilfe des Newell-Verfahrens! Ist das Viereck planar?Wenn ja, vergleichen Sie Ihr Ergebnis mit der Normale, die Sie mit Hilfe des Vektorproduktsberechnen!

Losung:Das Vektorprodukt ergibt das unnormierte Ergebnis (−2, 10, 4)T , durch Normieren erhaltenwir (−0.182574, 0.912871, 0.365148)T .

Newell ergibt als Ergebnis den Nullvektor.

Trotzdem liegen die vier Punkte in einer Ebene. Die Matrix( 1 1 2

2 0 55 1 46 0 7

)hat den Rang 3. Es gilt

v3 = −v0 + v1 + v2.

4. Gegeben ist ein polygonales Netz mit den Eckenkoordinaten in Tabelle 4.3 und der EckenlisteF1 = (0, 1, 2, 3), F2 = (3, 2, 4, 5), F3 = (5, 4, 6, 7). Berechnen Sie die Facettennormalen n1, n2und n3 fur die drei gegebenen Facetten mit Hilfe des Newell-Verfahrens! Berechnen Sie dieEckennormalen fur die Ecken V2, V3, V4 und V5!

Losung:

Page 57: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

4 Polygonale Netze 52

-

6

0

3 4 7 9

1

2 5

6

8

Abbildung 4.9: Die Skizze des Netzes fur Aufgabe 2

Tabelle 4.3: Die Eckenkoordinaten fur Aufgabe 4

V0 V1 V2 V3 V4 V5 V6 V7x 0 0 1 1 2 2 3 3y 0 0 1 1 0 0 1

234

z 0 1 1 0 1 0 12

14

(a) Fur die Berechnungen mit dem Newell-Verfahren schreiben wir die benotigten Eckennochmals in ein Schema.Fur n1, also die Normale auf der Facette F1 benotigen wir die Eckenkoordinaten im Sche-ma

V0 V1 V2 V3x 0 0 1 1y 0 0 1 1z 0 1 1 0

Dann erhalten wir

nx =12((0 − 0)(0 + 1) + (0 − 1)(1 + 1) + (1 − 1)(1 + 0) + (1 − 0)(0 + 0))

=12· (−2)

= −1.

ny =12((0 − 1)(0 + 0) + (1 − 1)(0 + 1) + (1 − 0)(1 + 1) + (0 − 0)(1 + 0))

=12· 2

= 1.

Page 58: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

4 Polygonale Netze 53

nz =12((0 − 0)(0 + 0) + (0 − 1)(0 + 1) + (1 − 1)(1 + 1) + (1 − 0)(1 + 0))

=12· (−1 + 1)

= 0.

Anschließendes Normieren ergibt

n1 =12

√2

−110

−0, 7070, 707

0

.

Fur n2, also die Normale auf der Facette F2 benotigen wir die Eckenkoordinaten im Sche-ma

V3 V2 V4 V5x 1 1 2 2y 1 1 0 0z 0 1 1 0

Dann erhalten wir

nx =12((1 − 1)(0 + 1) + (1 − 0)(1 + 1) + (0 − 0)(1 + 0) + (0 − 1)(0 + 0))

=12· 2

= 1.

ny =12((0 − 1)(1 + 1) + (1 − 1)(1 + 2) + (1 − 0)(2 + 2) + (0 − 0)(2 + 1))

=12(−2 + 4)

=12· 2

= 1.

nz =12((1 − 1)(1 + 1) + (1 − 2)(1 + 0) + (2 − 2)(0 + 0) + (2 − 1)(0 + 1)

=12· (−1 + 1)

= 0.

Anschließendes Normieren ergibt

n2 =12

√2

110

0, 7070, 707

0

.

Fur n3, also die Normale auf der Facette F3 benotigen wir die Eckenkoordinaten im Sche-ma

V5 V4 V6 V7x 2 2 3 3y 0 0 1

234

z 0 1 12

14

Page 59: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

4 Polygonale Netze 54

Dann erhalten wir

nx =12((0 − 0)(0 + 1) + (0 − 1

2)(1 +

12) + (

12− 3

4)(

12

+14) + (

34− 0)(

14

+ 0))

=12(−1

2· 3

2− 1

4· 3

4+

34· 1

4)

=12(−3

4− 3

16+

316

)

=12·(−3

4

)

= −38

.

ny =12((0 − 1)(2 + 2) + (1 − 1

2)(2 + 3) + (

12− 1

4)(3 + 3) + (

14− 0)(3 + 2))

=12(−4 +

52

+32

+54)

=12· 5

4

=58

.

nz =12((2 − 2)(0 + 0) + (2 − 3)(0 +

12) + (3 − 3)(

12

+34) + (3 − 2)(

34

+ 0))

=12· (0 − 1

2+ 0 +

34)

=12· 1

4

=18

.

Anschließendes Normieren ergibt

n3 ≈ 10, 7395

− 3

85818

−0, 5070, 8450, 169

.

(b) Die Eckennormalen ergeben sich jeweils durch Mitteln der beteiligten Facettennormalen.Dabei ist dann auf Grund der Topologie nV2 = nV3 und nV4 = nV5 .

nV2 = nV3 =12

n1 +12

n2

=12

− 1

2

√2

12

√2

0

+

12

12

√2

12

√2

0

=

012

√2

0

00, 707

0

.

Normieren ergibt das Endergebnis

nV2 = nV3 =

010

.

Page 60: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

4 Polygonale Netze 55

nV4 = nV5 =12

n2 +12

n3

≈ 12

0, 7070, 707

0

+

12

−0, 5070, 8450, 169

0, 10, 776

0, 0845

.

Normieren ergib dann das Endergebnis

nV4 = nV5 ≈

0, 1270, 7650, 009

.

5. Berechnen Sie einen Normalenvektor fur das Viereck mit den Punkten V0 = (0, 0, 0), V1 =(0,−a, 1), V2 = (1, a, 1) und V3 = (1, 0, 0) in Abhangigkeit von a und interpretieren Sie dasErgebnis!

Losung:Das Newell-Verfahren ergibt

nx =12((0 + a) · 1 + (−a − a) · 2 + (a − 0) · 1 + 0 · 0) = − 1

22a = −a,

ny =12((0 − 1) · 0 + (1 − 1) · 1 + (1 − 0) · 2 + 0 · 1) = 1,

nz =12(0 · 0 + (−1) · (−a + a) + (1 − 1) · a+ = +1 · 0) = 0.

Normiert erhalt man dann die Normale

n =1√

1 + a2

−a10

.

Das Viereck ist offensichtlich nur im Fall a = 0 planar. Die Normale in diesem Fall ist gegebendurch die y-Achse, denn dann liegen alle Punkte in der Ebene y = 0. Also ist in diesem Fall

n0 =

010

.

Das Newell-Verfahren ”glattet“ kleine Messfehler bei der Berechnung der Normalen. Fur a 6=0 und der Verwendung der drei Punkte V0, V1 und V2 ergibt das Vektorprodukt das folgendeErgebnis:

n =1√

1 + 5a2

−2a

1a

.

Der Fehler hat sich jetzt in beide Komponenten, die x und die z-Komponente fortgepflanzt.

4.3 Dreiecksnetze

1. Triangulieren Sie den Wurfel in Abbildung 4.2 auf Seite 192 so, dass er durch einen TriangleStrip darstellbar ist!

Page 61: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

4 Polygonale Netze 56

Losung:Die Losung finden Sie in der Fallstudie ”Polygonale Netze in OpenGL“ als Beispiel fur dieVerwendung von Vertex Arrays!

2. Konstruieren Sie fur das Netz in Abbildung 4.23 auf Seite 206 Triangle Strips. Uberprufen Siedas Verhaltnis zwischen der Menge der Dreiecke und der ubertragenen Punkte!

Losung:Als Startdreieck fur den gierigen Algorithmus zur Konstruktion von Triangle Strips ergibtsich das Dreieck mit den Ecken 12, 13 und 6, da es nur einen Nachbarn im Adjazenzgraphenhat. Dann ergeben sich 5 Triangle Strips:

(12, 13, 6, 7, 1, 2) (2, 3, 7, 4, 8, 5, 9, 10) (5, 11, 10, 17) (13, 14, 7, 15) (15, 16, 9, 10).

Das Verhaltnis zwischen ubertragenen Punkten und Dreiecken ist 138 . Fur den Generalized

Triangle Strip im Buch ist das Verhaltnis 2116 .

Fur die Konstruktion des Generalized Triangle Meshes ist es wichtig, welche Randkantenman als Start verwendet. Verwendet man die Kanten mit den Ecken 12, 13, 14, 15, 16 und 17,das ist der untere Rand, dann ergibt sich das Generalized Triangle Mesh in Tabelle 4.4.

Tabelle 4.4: Ein Generalized Triangle Mesh zu Abbildung 4.10

12R 6ROp 13RO 7ROp 14RO 15RO 8RMp 9ROp16RM 10RMp 17RO 11ROp 5RM -3RM -4RO 4RM-5RO 3RO 2RO 1RM -6RM

Dafur erhalt man das gleiche Verhaltnis zwischen ubertragenen Punkten und Dreiecken wiefur die im Buch angegebene Variante, namlich 15

16 .

12

6

1 23 4

5

11

17

16

1514

13

7

8 9

10

Abbildung 4.10: Das Netz fur Aufgabe 2

3. Skizzieren Sie den Generalized Triangle Strip, das durch die Replacement Codes 1R, 2RO,3RO, 4RO, 5RO, 6RO, 7RO, 8RM, 3RM, 9RO, 10R, 11RO, 12RO, 9RM und die Ecken mitden Koordinaten in Tabelle 4.5 gegeben ist!

Tabelle 4.5: Die Eckenkoordinaten fur Aufgabe 3

1 2 3 4 5 6 7 8 9 10 11 12x 1 2 3 4 0.5 1.5 2.5 2.6 2 3 2 3y 2.3 2.3 2.3 2.3 3 3 3 1.6 1 1 0 0

Losung:

Page 62: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

4 Polygonale Netze 57

1 3 5 7

2 4 6

8

109

1112

Abbildung 4.11: Die Losung fur Aufgabe 3

4.4 Modellieren mit Netzen

1. Welches Objekt ist durch die Parameterdarstellung

F(u, v) =

√1 − v2 cos (u)√1 − v2 sin (u)

v

, (u, v) ∈ [0, 2π) × [−1, 1].

gegeben? Beschreiben Sie die die Iso-Linien!

Losung:Setzt man die gegebene Parametrisierung in die implizite Darstellung der Kugel in Standard-lage ein, erhalt man

F(u, v) = (1 − v2) cos2 (u) + (1 − v2) sin2 (u) + v2 − 1

= (1 − v2)(cos2 (u) + sin2 (u)) + v2 − 1= 0.

Also ist wieder die Einheitskugel beschrieben.

Die Isolinien fur konstantes v sind wieder Breitenkreise; die Isolinien fur konstantes u sindHalbkreise, die Langenkreisen entsprechen. Allerdings sind diesmal die Abstande zwischenden einzelnen Breitenkreise fur Parameterwerte

Vj = 1 − j · 2nL − 1

, j = 0, nL − 1,

aquistant. Bei der Tesselation der Kugel mit der Parametrisierung wie im Buch ist die Bo-genlange zwischen den einzelnen Schichten konstant. Dies ergibt eine erhebliche bessere vi-suelle Qualitat. Wenn Sie die Darstellung in Abbildung 4.12 betrachten, fallt dies vor allemim Polbereich auf. Dort ist die Abbildung aus dem Buch sehr viel ”runder“.

Eine Implementierung dieser Tesselation in OpenGL finden Sie bei den Quellcodes zu diesemKapitel!

2. Vergleichen Sie die planaren Graphen in den Abbildungen 4.29 und 4.31! Worin unterschei-den sich die Netze, was haben sie gemeinsam?

Page 63: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

4 Polygonale Netze 58

Abbildung 4.12: Das Ergebnis der Parametrisierung in Aufgabe 1

Losung:Verwendet man fur Kugel und Zylinder die gleiche Auflosungen nB und nL, dann erhalt manidentische planare Graphen. Also ist die Topologie der beiden Tesselationen gleich. Nur dieGeometrie der beiden Netze unterscheidet sich; die Punktkoordinaten sind durch die jeweili-gen Parameterdarstellungen gegeben.

3. Stellen Sie die Eckenliste eines Zylinders und eines Kegels in Standardlage mit nB = 8 undnL = 2 auf!

Losung:

Zylinder

Wenn die Nummerierung wie im Buch vorgeschlagen wird, erhalt man die 17 Punktkoordi-naten als

V0 = (0, 0, 1), V17 = (0, 0, 0),

Vk = (cos ((k − 1)π

4), sin (

(k − 1)π

4), 1), k = 1, . . . , 8

Vk = (cos ((k − 9)π

4), sin (

(k − 9)π

4), 0), k = 9, . . . 16.

In Tabelle 4.6 finden Sie die Eckenliste; Abbildung 4.13 den planaren Graphen.

Abbildung 4.13: Der planare Graph fur den Standardzylinder fur nB = 8, nL = 2 in Aufgabe 3

Page 64: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

4 Polygonale Netze 59

Tabelle 4.6: Die Eckenliste fur die Tesselation des Zylinders in Standardlage mit nB = 8, nL = 2

0 0, 1, 21 0, 2, 32 0, 3, 43 0, 4, 54 0, 5, 65 0, 6, 76 0, 7, 87 0, 8, 18 1, 9, 10, 29 2, 10, 11, 310 3, 11, 12, 411 4, 12, 13, 512 5, 13, 14, 613 6, 14, 15, 714 7, 15, 16, 815 8, 16, 9, 116 17, 10, 917 17, 11, 1018 17, 12, 1119 17, 13, 1220 17, 14, 1321 17, 15, 1422 17, 16, 1523 17, 9, 16

Beim Kegel fallen die Vierecke komplett weg, die Tesselation besteht aus zwei Triangle Fans.Die Punktkoordinaten der 10 Punkte sind gegeben als

V0 = (0, 0, 1),

Vk = (cos ((k − 1)π

4), sin (

(k − 1)π

4), 0), k = 1, . . . , 8

V10 = (0, 0, 0).

In Tabelle 4.7 finden Sie die Eckenliste; Abbildung 4.14 den planaren Graphen.

Tabelle 4.7: Die Eckenliste fur die Tesselation des Kegels in Standardlage mit nB = 8, nL = 2

0 0, 1, 21 0, 2, 32 0, 3, 43 0, 4, 54 0, 5, 65 0, 6, 76 0, 7, 87 0, 8, 18 10, 2, 19 10, 3, 210 10, 4, 311 10, 5, 412 10, 6, 513 10, 7, 614 10, 8, 715 10, 1, 8

4. Beschreiben Sie das Ergebnis der Anwendung eines Tapers entlang der z-Achse mit fTaper(x) =x + 1 und eines Twists um die z-Achse mit fTwist(x) = π

2 (x + 1) auf einen Wurfel mit den Eck-

Page 65: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

4 Polygonale Netze 60

Abbildung 4.14: Der planare Graph fur den Kegel fur nB = 8, nL = 2

punkten (±1,±1,±1)!

Losung:Die Matrix eines Tapers entlang der z-Richtung ist gegeben durch

Tz =

f (x3) 0 00 f (x3) 10 0 1

angewandt auf Punkte (x1, x2, x3).

Fur die gegebene Funktion sind die Funktionswerte fur 1 und −1 interessant; es gilt

f (1) = 2, f (−1) = 0.

Also werden die Punkte in der Ebene z = −1 auf einen Punkte, den Ursprung, abgebildet.Fur eine Funktion f , fur die f (−1) < 0 erfullt ware wurde der Wurfel sogar ”umgestulpt“,was Sie sich an Hand der Funktion f (x) = x − 1

2 klar machen sollten.

Hier das Ergebnis fur f (x) = x + 1:

Tz(1, 1, 1) = (2, 2, 1),Tz(−1, 1, 1) = (−2, 2, 1),

Tz(−1,−1, 1) = (−2,−2, 1),Tz(1,−1, 1) = (2,−2, 1).

Fur die Punkte in der Ebene z = 1 entspricht der gegebene Taper einer gleichmaßigen Skalie-rung um den Faktor 2.

Die Punkte des Wurfels in der Ebene z = −1 werden alle auf den Ursprung abgebildet:

Tz(±1,±1,−1) = (0, 0,−1).

Insgesamt erhalten wir eine auf dem Kopf stehende Pyramide, denn die Taperfunktion f istlinear, die Kanten werden also nicht verbogen.

Die Twistmatrix ist gegeben durch

Tz =

cos ( f (x3)) sin ( f (x3)) 0sin ( f (x3)) cos ( f (x3)) 1

0 0 1

angewandt auf Punkte (x1, x2, x3).

Page 66: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

4 Polygonale Netze 61

Fur z = 1 ist f (1) = π , die Matrix ist gegeben durch

Twist(1) =

−1 0 00 −1 00 0 1

.

Diese Matrix entspricht einer Drehung mit ϕ = π .In der Ebene z = −1 gilt f (−1) = 0, also ist dort die Twist-Matrix gegeben als die Identitat:

Twist(−1) =

1 0 00 1 00 0 1

.

Dazwischen variiert der Drehwinkel linear, in der Ebene z = 0 ist der Twist eine Drehung umϕ = π

2 .

5. Weisen Sie nach, dass ein Twist volumenerhaltend ist!

Losung:Wir betrachten einen Twist um die z-Achse, fur die beiden anderen Falle ist das Ergebnisanalog herzuleiten.Die lokale Volumenveranderung wird durch die Jacobi-Matrix J beschrieben. Diese ist fur denTwist um die z-Achse gegeben durch

J =

cos ( f (x3)) − sin ( f (x3)) − sin ( f (x3)) f ′(x3)x1 − cos ( f (x3)) f ′(x3)x2sin ( f (x3)) cos ( f (x3)) cos ( f (x3)) f ′(x3)x1 − sin ( f (x3)) f ′(x3)x2

0 0 1

.

Dann ist die Determinante gegeben als

det(J)(x1, x2, x3) =

∣∣∣∣cos ( f (x3)) − sin ( f (x3))sin ( f (x3)) cos ( f (x3))

∣∣∣∣ = cos2 ( f (x3)) + sin2 ( f (x3)) = 1.

6. Fuhren Sie zwei Subdivision-Schritte fur den zweidimensionalen Polygonzug {(0, 1) ,(1, 0),(2, 1), (3, 0)} durch und skizzieren Sie das Ergebnis!

Losung:In Abbildung 4.15 finden Sie eine Darstellung des Ausgangspolynomzugs.

(0, 1) (2, 1)

(1, 0) (3, 0)

Abbildung 4.15: Der Polygonzug fur Aufgabe 6

Die erste Unterteilung liefert die neuen Punkte

V′1 = V1 = (0, 1),

V′2 =

12(V1 + V2) = (

12

,12),

V′3 = V2 = (1, 0),

V′4 =

12(V2 + V3) = (

32

,12),

V′5 = V3 = (2, 1),

V′6 =

12(V3 + V4) = (

52

,12),

V′7 = V4 = (3, 0).

Page 67: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

4 Polygonale Netze 62

Durch das Mitteln sind die Punkte der ersten Subdivisionsstufe dann gegeben als

V′1 = (

14

,34),

V′2 = (

12

,12),

V′3 = (1,

12),

V′4 =

32

,12),

V′5 = 2,

34),

V′6 = (

52

,12),

V′7 = (

114

,14).

Im zweiten Subdivisionsschritt wird zuerst einmal unterteilt:

V′′1 = V′

1,

V′′2 =

12(V′

1 + V′2) = (

38

,58),

V′′3 = V′

2,

V′′4 =

12(V′

2 + V′3) = (

34

,38),

V′′5 = V′

3,

V′′6 =

12(V′

3 + V′4) = (

54

,38),

V′′7 = V′

4,

V′′8 =

12(V′

4 + V′5) = (

74

,58),

V′′9 = V′

5,

V′′10 =

12(V′

5 + V′6) = (

94

,58),

V′′11 = V′

6,

V′′12 =

12(V′

6 + V′7) = (

218

,38),

V′′13 = V′

7.

Durch das anschließende Mitteln ergibt sich das Ergebnis

V′′1 = (

516

,1116

),

V′′2 = (

38

,58),

V′′3 = (

1732

,12),

V′′4 = (

34

,38),

V′′5 = (1,

516

),

Page 68: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

4 Polygonale Netze 63

V′′6 = (

54

,38),

V′′7 = (

32

,12),

V′′8 = (

74

,58),

V′′9 = (2,

1116

),

V′′10 = (

94

,58),

V′′11 = (

7932

,12),

V′′12 = (

218

,38),

V′′13 = (

4316

,5

16).

In Abbildung 4.16 finden Sie eine graphische Darstellung des Ergebnisses!(0, 1) (2, 1)

(1, 0) (3, 0)

Abbildung 4.16: Die Ausgangsform und das Ergebnis nach zwei Subdivisionsschritten fur Aufgabe 6

.

4.5 Level-of-Detail und Vereinfachen von Netzen

1. Beschreiben Sie eine Funktion, die fur einen Punkt den Abstand zu einer Linie oder zu einemPolygonzug bestimmt!

Losung:Wir betrachten zuerst den Fall der Linie. Angenommen, der Abstand zwischen dem Punkt Vund der Linie, gegeben als

L = {A | A = V0 + tv, t ∈ R}soll bestimmt werden. Wir nehmen an, dass der Richtungsvektor v normiert ist.

Dann wird der kurzeste Abstand zwischen V und der Linie L an der Orthogonalprojektionvon V auf L angenommen. Es gilt

orthoV = V0 + t0v

mitt0 = 〈v, V0V〉

Der gesuchte Abstand ist dann gegeben durch

dist(V, L) = ‖(V0 + t0v)V‖.

Ist nicht eine Linie, sondern nur das Segment zwischen zwei Punkten V1 und V2 gegeben,dann kann der kurzeste Abstand am Rand angenommen werden. Es ist v = V1V2. Auch hiersollte dieser Richtungsvektor normiert werden.

Page 69: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

4 Polygonale Netze 64

Ist t0 < 0, dann wird der kurzeste Abstand im Punkt V1 angenommen; ist t0 > 1, im PunktV2. Sonst liegt die Orthogonalprojektion zwischen V1 und V2.

Ist die Gerade durch eine Normalenform gegeben, dann kann leicht der orientierte Abstandbestimmt werden. Mehr dazu finden Sie in Brill, Mathematik fur Informatiker, Abschnitt 9.3.

Im Fall eines Polygonzugs P wird jetzt zu jedem Segment Pi der Abstand berechnet; das Seg-ment, das den kurzesten Abstand liefert definiert den gesuchten Abstand:

dist(V, P) = mini

dist(V, Pi).

2. Beschreiben Sie eine Funktion, die den Abstand zwischen einem Punkt und einem Dreieckbestimmt!

Losung:Moglich ware wie in der Losung von Aufgabe 1, die Orthogonalprojektion des Punkts V aufdie Ebene zu bestimmen, die durch das Dreieck gegeben ist; und anschließend zu uberprufen,ob diese Orthogonalprojektion im Innern oder auf dem Rand des Dreiecks liegt.

Diese Uberprufung kann sinnvollerweise mit Hilfe von baryzentrischen Koordinaten erfol-gen, wie sie in Kapitel 2 eingefuhrt wurden.

Sind V1, V2 und V3 die Punkte des Dreiecks, dann bilden wir die zwei Richtungsvektorenv1 = V1V2 und v2 = V1V3. Das Dreieck (inklusive seines Randes) ist dann gegeben als

D = {A ∈ A3 | A = V1 + sv1 + tv2, s, t ∈ [0, 1], s + t ≤ 1}.

Damit konnen wir den Abstand zwischen dem Punkt V und D als Minimierungsproblem ins und t mit Nebenbedingungen formulieren:

Finde s, t ∈ [0, 1], s + t ≤ 1 so, dass

Q(s, t) = ‖V1 + sv1 + tv2 − V‖

minimal wird. Die Funktion Q ist quadratisch in s und t:

Q(s, t) = as2 + 2bst + ct2 + 2ds + 2et + f ,

mit

a = ‖v1‖,b = 〈v1, v2〉 ,c = ‖v2‖,d = 〈v1, VV1〉 ,e = − 〈v2, VV1〉 ,f = ‖VV1‖.

Die Diskrimante dieses Kegelschnitts ist ac − b2 = ‖v1 × v2‖2. Ist wirklich ein Dreieck ge-geben, sind also die beiden Richtungsvektoren linear unabhangig, dann ist die Diskrimante> 0.

Das gesuchte Minimum wird an einer Nullstelle des Gradienten oder am Rand des Dreiecks-bereichs mit s + t = 1 angenommen. Der Gradient ist gegeben durch

∇Q(s, t) = 2(

as + bt + dbs + c + e

).

Eine Nullstelle des Gradienten ist gegeben durch

s =be − cdac − b2 , t =

bd − aeac − b2 .

Page 70: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

4 Polygonale Netze 65

Liegen diese Werte innerhalb des gegebenen Bereichs, ist das Minimum gefunden; der kurzesteAbstand wird im Innern des Dreiecks angenommen. Andernfalls muss der Rand des zulassi-gen Bereichs fur s und t uberpruft werden und dort das Minimum bestimmt werden.

3. Wie konnen Attribute wie Farben oder Normalenvektoren von Eckpunkten eines Netzes beieinem Edge Collapse berucksichtigt werden?

Losung:Die neuen Attribute sollten auf Grund der Attribute der beiden Dreiecke bestimmt werden,die durch den Edge Collapse verschwinden. Liegen die beiden Dreiecke nicht in einer Ebene,dann bilden die vier Punkte Vi , Vj, Vk und Vl einen Tetraeder. Wie in Kapitel 2 dargestellt,konnen alle Punkte im Tetraeder und auf dem Rand mit Hilfe von baryzentrischen Koordina-ten beschrieben werden.

Dann konnen wir fur den neuen Punkt V ′j , der durch den Edge Collapse entsteht, die zu-

gehorigen baryzentrischen Koordinaten bestimmen. Die neuen Attribute werden ebenfallsmit Hilfe dieser baryzentrischen Koordinaten berechnet. Ist also

V′j = λ1Vi + λ2Vj + λ3Vk + λ4Vl , λ1 + λ2 + λ3 + λ4 = 1,

dann wird ein neues skalares Attribut a′j, beispielsweise die RGB-Werte einer Farbe, durch

a′j = λ1ai + λ2a j + λ3ak + λ4al , λ1 + λ2 + λ3 + λ4 = 1

berechnet. Das kann offensichtlich auch fur die Normalenvektoren durchgefuhrt werden (dieaffine Kombination von Vektoren ergibt einen Vektor als Ergebnis).

Im Fall, dass eine der baryzentrischen Koordinaten negativ ist (was dem Fall entspricht, dassder neue Punkt V ′

j nicht im Innern des Tetraeders liegt), sollten diese baryzentrischen Koor-dinaten auf 0 oder 1 abgeschnitten werden (”clamp“), um sinnvolle Werte fur die Attributezu garantieren – Sie wollen bestimmt keine negativen Farbwerte produzieren . . .

4.7 Fallstudien

4.7.1 Polygonale Netze in OpenGL

1. Erstellen Sie fur jede der Topologien GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN,GL_QUADS, GL_QUAD_STRIP und GL_POLYGON ein kleines OpenGL-Programm. Verandern Sieinsbesondere die Default-Definition der Durchlaufrichtung mit glFrontFace()!

Losung:In den folgenden Bildern wurde immer eine Ausgabe der Achsen und der kanonischen Ein-heitsvektoren integriert. Dabei codiert rot-grun-blau die Reihenfolge x-y-z. In den Abbildun-gen ist immer links die Darstellung fur glFrontFace(GL_CCW), rechts glFrontFace(GL_CW)zu sehen.

GL TRIANGLES

Der Quellcode

glBegin(GL_TRIANGLES);glVertex3f(0.0, 0.0, 0.0);glVertex3f(1.0, 1.0, 0.0);glVertex3f(0.0, 1.0, 0.0);

glEnd();

Page 71: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

4 Polygonale Netze 66

Abbildung 4.17: Ausgabe eines Dreiecks mit Hilfe von GL_TRIANGLES

erzeugt die Ausgabe wie in Abbildung 4.17.

GL TRIANGLE STRIP

Der Quellcode

glBegin(GL_TRIANGLE_STRIP);glVertex3f(0.0, 1.0, 0.0);glVertex3f(0.0, 0.0, 0.0);glVertex3f(1.0, 1.0, 0.0);glVertex3f(1.0, 0.0, 0.0);

glEnd()

erzeugt die Ausgabe wie in Abbildung 4.18.

Abbildung 4.18: Ausgabe eines Triangle Strips mit Hilfe von GL_TRIANGLE_STRIP

GL TRIANGLE FAN

Der Quellcode

glColor3f(1.0, 1.0, 0.0);glBegin(GL_TRIANGLE_FAN);

glVertex3f(0.0, 0.0, 0.0);glVertex3f(1.0, 0.0, 0.0);glVertex3f(1.0, 1.0, 0.0);glVertex3f(0.0, 1.0, 0.0);

glEnd();

erzeugt die Ausgabe wie in Abbildung 4.19.

GL QUADS

Der Quellcode

Page 72: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

4 Polygonale Netze 67

Abbildung 4.19: Ausgabe eines Triangle Fans mit Hilfe von GL_TRIANGLES_FAN

glBegin(GL_QUADS);glVertex3f(0.0, 0.0, 0.0);glVertex3f(1.0, 0.0, 0.0);glVertex3f(1.0, 1.0, 0.0);glVertex3f(0.0, 1.0, 0.0);

glEnd()

erzeugt die Ausgabe wie in Abbildung 4.20.

Abbildung 4.20: Ausgabe eines Vierecks mit Hilfe von GL_QUADS

GL QUAD STRIPS

Der Quellcode

glBegin(GL_QUAD_STRIP);glVertex3f(0.0, 1.0, 0.0);glVertex3f(0.0, 0.0, 0.0);glVertex3f(0.5, 1.0, 0.0);glVertex3f(0.5, 0.0, 0.0);glVertex3f(1.0, 1.0, 0.0);glVertex3f(1.0, 0.0, 0.0);

glEnd()

erzeugt die Ausgabe wie in Abbildung 4.21. Beachten Sie die Reihenfolge der Punkte. In Ab-bildung 4.22 sehen Sie, was passieren kann, falls Sie die beiden letzten Punkte wie in

glBegin(GL_QUAD_STRIP);glVertex3f(0.0, 1.0, 0.0);glVertex3f(0.0, 0.0, 0.0);glVertex3f(0.5, 1.0, 0.0);

Page 73: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

4 Polygonale Netze 68

glVertex3f(0.5, 0.0, 0.0);glVertex3f(1.0, 0.0, 0.0);glVertex3f(1.0, 1.0, 0.0);

glEnd()

vertauschen!

Abbildung 4.21: Ausgabe eines Quad Strips mit Hilfe von GL_QUADS

Abbildung 4.22: Ausgabe eines Quad Strips mit Hilfe von GL_QUADS mit vertauschter Reihenfolge derletzten beiden Punkte

2. Geben Sie einen Wurfel in einem OpenGL-Programm mit Hilfe von Vertex Arrays und eineseinzigen Triangle Strips aus!

Losung:Die Losung steht in den Code-Fragmenten im Buch. Wenn man davon ausgeht, dass nur derWurfel ausgegeben wird, dann konnen Sie die Verwendung von Vertex Arrays in der init-Funktion aktivieren; die display-Funktion greift dann auf die entsprechenden Felder zuruckund gibt sie mit Hilfe von glDrawelements aus. Hier nochmals einige Code-Abschnitte; denkompletten Quellcode finden Sie bei den Downloads zu diesem Kapitel:

void init(void){

glClearColor (1.0, 1.0, 1.0, 1.0);glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);glLineWidth(2.0);

glColor3f(0.0, 0.0, 0.0);

glEnableClientState(GL_VERTEX_ARRAY);}

Page 74: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

4 Polygonale Netze 69

void display(void){

static GLfloat vertices[] = {1.0, 1.0, 1.0, 0.0, 1.0, 1.0,0.0, 0.0, 1.0, 1.0, 0.0, 1.0,1.0, 1.0, 0.0, 0.0, 1.0, 0.0,0.0, 0.0, 0.0, 1.0, 0.0, 0.0};

static GLshort topology[] = { 2, 3, 6, 7, 4, 3, 0, 2, 1, 6,5, 4, 1, 0};

glClear(GL_COLOR_BUFFER_BIT);

glVertexPointer(3, GL_FLOAT, 0, vertices);glDrawElements(GL_TRIANGLE_STRIP, 14, GL_UNSIGNED_SHORT, topology);

glutSwapBuffers();}

3. Geben Sie mit Hilfe von Dreiecken und Vierecken das nicht-konvexe Polygon aus Abbildung4.23 in OpenGL aus! Mit Hilfe der Funktion glEdgeFlag konnen Sie OpenGL angeben, ob diefolgenden Eckpunkte zu einer Randkante gehoren oder nicht. Verwenden Sie diese Funktion,um eine Darstellung ohne innere Kanten wie in Abbildung 4.23 zu erhalten!

0

12

3

4

5

67

0 1 2 3(0, 4) (−2, 0) (−6,−2) (−2,−4)

4 5 6 7(0,−8) (2,−4) (6,−2) (2, 0)

Abbildung 4.23: Das Polygon und die Eckpunktkoordinaten fur Aufgabe 3

Losung:Der Stern wird mit Hilfe von vier Dreiecken fur die Spitzen und einem Viereck fur das Innereausgegeben. Mit Hilfe von glEdgeFlag kann dafur gesorgt werden, dass die inneren Kantennicht mehr dargestellt werden. Hier die Quelltext der display-Funktion; die einzelnen Po-lygone werden der Ubersichtlichkeit halber mit unterschiedlichen Farben markiert; die Ver-wendung der Randkanten kann mit Hilfe der logischen Variable EDGE interaktiv verandertwerden:

void display(void){

glClear(GL_COLOR_BUFFER_BIT);

glColor3f(1.0, 0.0, 0.0);glBegin(GL_TRIANGLES);

glColor3f(1.0, 0.0, 0.0);glEdgeFlag(EDGE);glVertex2f(-2.0f, 0.0f);glEdgeFlag(true);glVertex2f(2.0f, 0.0f);glVertex2f(0.0f, 4.0f);

glColor3f(0.0, 1.0, 0.0);glVertex2f(-2.0f, 0.0f);glVertex2f(-6.0f, -2.0f);glEdgeFlag(EDGE);glVertex2f(-2.0, -4.0f);

Page 75: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

4 Polygonale Netze 70

glEdgeFlag(true);

glColor3f(0.0, 0.0, 1.0);glVertex2f(-2.0f, -4.0f);glVertex2f(0.0f, -8.0f);glEdgeFlag(EDGE);glVertex2f(2.0f, -4.0f);glEdgeFlag(true);

glColor3f(1.0, 1.0, 0.0);glVertex2f(2.0f, -4.0f);glVertex2f(6.0f, -2.0f);glEdgeFlag(EDGE);glVertex2f(2.0f, 0.0f);glEdgeFlag(true);

glEnd();

// Das Quadrat in der Mitte als ein QuadglBegin(GL_QUADS);

glColor3f(1.0, 0.0, 1.0);glEdgeFlag(EDGE);glVertex2f(-2.0f, 0.0f);glVertex2f(-2.0f, -4.0f);glVertex2f(2.0f, -4.0f);glVertex2f(2.0f, 0.0f);glEdgeFlag(true);

glEnd();}

Bei den Downloads zu diesem Kapitel finden Sie den kompletten Quelltext. In Abbildung4.24 sehen Sie rechts das Ergebnis fur EDGE==true, links fur EDGE==false!

Abbildung 4.24: Das Polygon fur Aufgabe 3 mit (rechts) und ohne (links) Verwendung von Edge Flags

4. Implementieren Sie eine C++-Klasse, die Grundkorper wie Kugel, Zylinder und Wurfel alspolygonale Netze reprasentiert! Vergleichen Sie Ihre Ergebnisse mit den in der GLUT ange-botenen Primitiven!

Losung:Die Implementierung verwendet die in Abschnitt 4.4 vorgestellte Tesselation und Vertex Ar-rays. Bei den Downloads zu diesem Kapitel finden Sie eine Implementierung und auch einemit doxygen erzeugte Dokumentation der Klassen!

Page 76: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

4 Polygonale Netze 71

4.7.2 Fallstudie Platonische und archimedische Korper

1. Geben Sie ausgehend von einem Hexaeder mit Eckpunkten in (±1,±1,±1) die Eckenkoor-dinaten eines Oktaeders an!

Losung:Der planare Graph eines Okaeders ist im Buch angegeben. Durch die Dualitat zwischen He-xaeder und Oktaeder ergeben sich dann die folgenden Eckpunkte:

VO1 = (0, 0,−1),VO2 = (0, 0, 1),VO3 = (−1, 0, 0),VO4 = (1, 0, 0),VO5 = (0,−1, 0),VO6 = (0, 1, 0).

2. Begrunden Sie, dass fur den abgeschnittenen Hexaeder die Seitenlange der Achtecke durchλ = 2(

√2 − 1) gegeben ist!

Losung:λ ist die Seitenlange eines regelmaßigen Achtecks mit Innenkreisradius ri = 1, wie in Abbil-dung 4.25 dargestellt. Die Seitenlange des umbeschriebenen Quadrats ist 2.

V1 = (−1, 1,±1) V2 = (1, 1,±1)

W1 W2

-� λ

6

?

ri

Abbildung 4.25: Die Seitenlange λ in Aufgabe 2

Fur λ gilt dannλ = 2ru sin (

ϕ

2)

mit dem Innenwinkel ϕ = 45◦; ru ist der Umkreisradius des Achtecks. Fur diesen Umkreis-radius gilt

ru =ri

cos (ϕ2 )

=1√

1+cos (ϕ)2

=

√2√

1 + 12

√2

.

Page 77: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

4 Polygonale Netze 72

Dann ist

λ =2√

2√1 + 1

2

√2

√1 − 1

2

√2

2

= 2

√1 − 1

2

√2

√1 + 1

2

√2

= 2

√1 − 1

2

1 + 12

√2

=

√2

1 + 12

√2

= 2(√

2 − 1).

3. Stellen Sie Ikosaeder und Dodekaeder mit Hilfe von OpenGL dar!

Losung:Den kompletten Quelltext finden Sie bei den Downloads zu diesem Kapitel; in Abbildung4.26 sehen Sie das Ergebnis.

Abbildung 4.26: Dodekaeder und Ikosaeder in OpenGL fur Aufgabe 3

Die Eckenliste des Dodekaeders in Feldern, die fur Vertex Arrays verwendbar sind:

static GLfloat A = (GLfloat) 0.618034f;static GLfloat B = (GLfloat) 1.0f+A;

// Die Eckenkoordinatenstatic GLfloat v[60] =

{ 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, -1.0, 1.0,1.0, -1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, -1.0,

-1.0, -1.0, 1.0, -1.0, -1.0, -1.0, A, B, 0.0,-A, B, 0.0, A, -B, 0.0, -A, -B, 0.0,B, 0.0, A, B, 0.0, -A, -B, 0.0, A,

-B, 0.0, -A, 0.0, A, B, 0.0, -A, B,0.0, A, -B, 0.0, -A, -B};

// Die Topologie als einzelne Funfecke

Page 78: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

4 Polygonale Netze 73

static GLshort f1[5] = {1, 8, 0, 12, 13};static GLshort f2[5] = {4, 9, 5, 15, 14};static GLshort f3[5] = {2, 10, 3, 13, 12};static GLshort f4[5] = {7, 11, 6, 14, 15};static GLshort f5[5] = {2, 12, 0, 16, 17};static GLshort f6[5] = {1, 13, 3, 19, 18};static GLshort f7[5] = {4, 14, 6, 17, 16};static GLshort f8[5] = {7, 15, 5, 18, 19};static GLshort f9[5] = {4, 16, 0, 8, 9};static GLshort f10[5] = {2, 17, 6, 11, 10};static GLshort f11[5] = {1, 18, 5, 9, 8};static GLshort f12[5] = {7, 19, 3, 10, 11};

Dann kann der Dodekaeder mit Hilfe der folgenden display-Funktion ausgegeben werden:

void display(void){

glClear(GL_COLOR_BUFFER_BIT);

/* Virtuelle Kamera in Funktion examine() */examine();

// Gitter ausgebengrid(10);

glVertexPointer(3, GL_FLOAT, 0, v);

glDrawElements(GL_POLYGON, 5, GL_UNSIGNED_SHORT, f1);glDrawElements(GL_POLYGON, 5, GL_UNSIGNED_SHORT, f2);glDrawElements(GL_POLYGON, 5, GL_UNSIGNED_SHORT, f3);glDrawElements(GL_POLYGON, 5, GL_UNSIGNED_SHORT, f4);glDrawElements(GL_POLYGON, 5, GL_UNSIGNED_SHORT, f5);glDrawElements(GL_POLYGON, 5, GL_UNSIGNED_SHORT, f6);glDrawElements(GL_POLYGON, 5, GL_UNSIGNED_SHORT, f7);glDrawElements(GL_POLYGON, 5, GL_UNSIGNED_SHORT, f8);glDrawElements(GL_POLYGON, 5, GL_UNSIGNED_SHORT, f9);glDrawElements(GL_POLYGON, 5, GL_UNSIGNED_SHORT, f10);glDrawElements(GL_POLYGON, 5, GL_UNSIGNED_SHORT, f11);glDrawElements(GL_POLYGON, 5, GL_UNSIGNED_SHORT, f12);

glutSwapBuffers();}

Die Eckenliste des Ikosaeders in Feldern, die fur Vertex Arrays verwendbar sind:

// Ecken mit Hilfe des goldenen Schnittsstatic GLfloat X = (GLfloat) 0.525731112119133606;static GLfloat Z = (GLfloat) 0.850650808352039932;

// Die Eckenkoordinatenstatic GLfloat v[36] =

{-X, 0.0, Z, X, 0.0, Z, -X, 0.0, -Z, X, 0.0, -Z,0.0, Z, X, 0.0, Z, -X, 0.0, -Z, X, 0.0, -Z, -X,Z, X, 0.0, -Z, X, 0.0, Z, -X, 0.0, -Z, -X, 0.0};

// Die Topologiestatic GLshort topology[60] =

{ 1,4,0, 4,9,0, 4,5,9, 8,5,4, 1,8,4,1,10,8, 10,3,8, 8,3,5, 3,2,5, 3,7,2,3,10,7, 10,6,7, 6,11,7, 6,0,11, 6,1,0,

Page 79: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

4 Polygonale Netze 74

10,1,6, 11,0,9, 2,11,9, 5,2,9, 11,2,7};

Dann kann der Ikosaeder mit Hilfe der folgenden display-Funktion ausgegeben werden:

void display(void){

glClear(GL_COLOR_BUFFER_BIT);

/* Virtuelle Kamera in Funktion examine() */examine();

// Gitter ausgebengrid(10);

glVertexPointer(3, GL_FLOAT, 0, v);glDrawElements(GL_TRIANGLES, 60, GL_UNSIGNED_SHORT, topology);

glutSwapBuffers();}

4. Stellen Sie einen abgeschnittenen Hexaeder und einen abgeschnittenen Ikosaeder mit Hilfevon OpenGL dar!

Losung:Den kompletten Quelltext finden Sie bei den Downloads zu diesem Kapitel; in Abbildung4.27 sehen Sie das Ergebnis.

Abbildung 4.27: Abgeschnittener Hexaeder und Ikosaeder in OpenGL fur Aufgabe 4

Versuchen Sie insbesondere beim abgeschnittenen Ikosaeder nicht, die komplette Eckenlistezu definieren und dann erst darzustellen. Schalten Sie Backface Culling ein und fugen Sie suk-zessive Polygon fur Polygon hinzu!

Die Eckenliste des abgeschnittenen Hexaeders in Feldern, die fur Vertex Arrays verwendbarist:

static GLfloat A = 0.292893219, B = 0.707106781,ZERO = 0.0, ONE = 1.0;

static GLfloat v[72] = {ZERO, A, ZERO, //0A, ZERO, ZERO, //1ZERO, ZERO, A, //2B, ZERO, ZERO, //3

Page 80: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

4 Polygonale Netze 75

ONE, A, ZERO, //4ONE, ZERO, A, //5ONE, B, ZERO, //6B, ONE, ZERO, //7ONE, ONE, A, //8A, ONE, ZERO, //9ZERO, B, ZERO, //10ZERO, ONE, A, //11ZERO, ZERO, B, //12A, ZERO, ONE, //13ZERO, A, ONE, //14B, ZERO, ONE, //15ONE, ZERO, B, //16ONE, A, ONE, //17ONE, B, ONE, //18B, ONE, ONE, //19ONE, ONE, B, //20A, ONE, ONE, //21ZERO, ONE, B, //22ZERO, B, ONE}; //23

// Die Achtecke, die aus den Vierecken des Wurfels entstehenstatic GLshort ACHT1[8] = {10, 9, 7, 6, 4, 3, 1, 0};static GLshort ACHT2[8] = {3, 5, 16, 15, 13, 12, 2, 1};static GLshort ACHT3[8] = {0, 2, 12, 14, 23, 22, 11, 10};static GLshort ACHT4[8] = {14, 13, 15, 17, 18, 19, 21, 23};static GLshort ACHT5[8] = {6, 8, 20, 18, 17, 16, 5, 4};static GLshort ACHT6[8] = {9, 11, 22, 21, 19, 20, 8, 7};

// Die Dreiecke in den Eckenstatic GLshort DREIECKE[24] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,

12, 13, 14, 15, 16, 17, 20, 19, 18,21, 22, 23};

Dann kann der abgeschnittene Hexaeder mit Hilfe der folgenden display-Funktion ausge-geben werden:

void display(void){

glClear(GL_COLOR_BUFFER_BIT);/* Virtuelle Kamera in Funktion examine() */examine();// Gitter ausgebengrid(10);

glLineWidth(6.0);glColor3f(0.0, 1.0, 0.0);

// Die GeometrieglVertexPointer(3, GL_FLOAT, 0, v);

// Die Topologie// Die Achtecke, die aus den Vierecken des Wurfels entstehenglDrawElements(GL_POLYGON, 8, GL_UNSIGNED_SHORT, ACHT1);glDrawElements(GL_POLYGON, 8, GL_UNSIGNED_SHORT, ACHT2);glDrawElements(GL_POLYGON, 8, GL_UNSIGNED_SHORT, ACHT3);glDrawElements(GL_POLYGON, 8, GL_UNSIGNED_SHORT, ACHT4);glDrawElements(GL_POLYGON, 8, GL_UNSIGNED_SHORT, ACHT5);glDrawElements(GL_POLYGON, 8, GL_UNSIGNED_SHORT, ACHT6);

Page 81: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

4 Polygonale Netze 76

glDrawElements(GL_TRIANGLES, 24, GL_UNSIGNED_SHORT, DREIECKE);

glutSwapBuffers();}

Die Eckenliste des abgeschnittenen Ikosaeders in Feldern, die fur Vertex Arrays verwendbarist:

GLfloat v[] = { 0.0, 1.0, 0.20601133, //00.0, 1.0, -0.20601133, //10.333333333,0.872677996,0.412022659, //20.666666667,0.745355992,0.20601133, //30.20601133,0.666666667,0.745355992, //40.412022659,0.333333333,0.872677996, //5-0.20601133,0.666666667,0.745355992, //6-0.412022659,0.333333333,0.872677996, //7-0.333333333,0.872677996,0.412022659, //8-0.666666667,0.745355992,0.20601133, //90.333333333,0.872677996,-0.412022659, //100.666666667,0.745355992,-0.20601133, //110.20601133,0.666666667,-0.745355992, //120.412022659,0.333333333,-0.872677996, //13-0.20601133,0.666666667,-0.745355992, //14-0.412022659,0.333333333,-0.872677996, //15-0.333333333,0.872677996,-0.412022659, //16-0.666666667,0.745355992,-0.20601133, //171.0,0.20601133,0.0, //181.0,-0.20601133,0.0, //190.872677996,0.412022659,0.333333333, //200.745355992,0.20601133,0.666666667, //210.872677996,0.412022659,-0.333333333, //220.745355992,0.20601133,-0.666666667, //230.666666667,-0.745355992,-0.20601133, //240.333333333,-0.872677996,-0.412022659, //250.666666667,-0.745355992,0.20601133, //260.333333333,-0.872677996,0.412022659, //270.872677996,-0.412022659,0.333333333, //280.745355992,-0.20601133,0.666666667, //290.872677996,-0.412022659,-0.333333333, //300.745355992,-0.20601133,-0.666666667, //310.0,-1.0,-0.20601133, //320.0,-.01,0.20601133, //330.20601133,-0.666666667,-0.745355992, //340.412022659,-0.333333333,-0.872677996, //35-0.20601133,-0.666666667,-0.745355992, //36-0.412022659,-0.333333333,-0.872677996, //37-0.333333333,-0.872677996,-0.412022659, //38-0.666666667,-0.745355992,-0.20601133, //390.20601133,-0.666666667,0.745355992, //400.412022659,-0.333333333,0.872677996, //41-0.20601133,-0.666666667,0.745355992, //42-0.412022659,-0.333333333,0.872677996, //43-0.333333333,-0.872677996,0.412022659, //44-0.666666667,-0.745355992,0.20601133, //450.20601133,0.0,1.0, //46-0.20601133,0.0,1.0, //47-0.745355992,0.20601133,0.666666667, //48-0.872677996,0.412022659,0.333333333, //49

Page 82: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

4 Polygonale Netze 77

-0.745355992,-0.20601133,0.666666667, //50-0.872677996,-0.412022659,0.333333333, //510.20601133,0.0,-1.0, //52-0.20601133,0.0,-1.0, //53-0.745355992,0.20601133,-0.666666667, //54-0.872677996,0.412022659,-0.333333333, //55-0.745355992,-0.20601133,-0.666666667, //56-0.872677996,-0.412022659,-0.333333333, //57-1.0,0.20601133,0.0, //58-1.0,-0.20601133,0.0}; //59

/** Die Funfecke

*/GLshort FUENF1[5] = {0,8,6,4,2};GLshort FUENF2[5] = {1, 10, 12, 14, 16};GLshort FUENF3[5] = {3, 20, 18, 22, 11};GLshort FUENF4[5] = {19, 28, 26, 24, 30};GLshort FUENF5[5] = {25, 32, 38, 36, 34};GLshort FUENF6[5] = {33, 27, 40, 42, 44};GLshort FUENF7[5] = {41, 29, 21, 5, 46};GLshort FUENF8[5] = {43, 47, 7, 48, 50};GLshort FUENF9[5] = {35, 52, 13, 23, 31};GLshort FUENF10[5] = {37, 56, 54, 15, 53};GLshort FUENF11[5] = {55, 58, 49, 9, 17};GLshort FUENF12[5] = {59, 57, 39, 45, 51};/** Die Sechsecke

*/GLshort SECHS1[6] = {0, 1, 16, 17, 9, 8};GLshort SECHS2[6] = {2, 3, 11, 10, 1, 0};GLshort SECHS3[6] = {22, 23, 13, 12, 10, 11};GLshort SECHS4[6] = {4, 5, 21, 20, 3, 2};GLshort SECHS5[6] = {21, 29, 28, 19, 18, 20};GLshort SECHS6[6] = {19, 30, 31, 23, 22, 18};GLshort SECHS7[6] = {30, 24, 25, 34, 35, 31};GLshort SECHS8[6] = {24, 26, 27, 33, 32, 25};GLshort SECHS9[6] = {40, 27, 26, 28, 29, 41};GLshort SECHS10[6] = {38, 32, 33, 44, 45, 39};GLshort SECHS11[6] = {41, 46, 47, 43, 42, 40};GLshort SECHS12[6] = {47, 46, 5, 4, 6, 7};GLshort SECHS13[6] = {43, 50, 51, 45, 44, 42};GLshort SECHS14[6] = {8, 9, 49, 48, 7, 6};GLshort SECHS15[6] = {52, 53, 15, 14, 12, 13};GLshort SECHS16[6] = {35, 34, 36, 37, 53, 52};GLshort SECHS17[6] = {37, 36, 38, 39, 57, 56};GLshort SECHS18[6] = {54, 55, 17, 16, 14, 15};GLshort SECHS19[6] = {55, 54, 56, 57, 59, 58};GLshort SECHS20[6] = {58, 59, 51, 50, 48, 49};

Dann kann der abgeschnittene Hexaeder mit Hilfe der folgenden display-Funktion ausge-geben werden:

void display(void){

glClear(GL_COLOR_BUFFER_BIT);examine();// Gitter ausgebengrid(15);

Page 83: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

4 Polygonale Netze 78

glColor3f(0.0, 1.0, 0.0);glLineWidth(6.0);

// Die GeometrieglVertexPointer(3, GL_FLOAT, 0, v);

// Die Topologie// Die FunfeckeglDrawElements(GL_POLYGON, 5, GL_UNSIGNED_SHORT, FUENF1);glDrawElements(GL_POLYGON, 5, GL_UNSIGNED_SHORT, FUENF2);glDrawElements(GL_POLYGON, 5, GL_UNSIGNED_SHORT, FUENF3);glDrawElements(GL_POLYGON, 5, GL_UNSIGNED_SHORT, FUENF4);glDrawElements(GL_POLYGON, 5, GL_UNSIGNED_SHORT, FUENF5);glDrawElements(GL_POLYGON, 5, GL_UNSIGNED_SHORT, FUENF6);glDrawElements(GL_POLYGON, 5, GL_UNSIGNED_SHORT, FUENF7);glDrawElements(GL_POLYGON, 5, GL_UNSIGNED_SHORT, FUENF8);glDrawElements(GL_POLYGON, 5, GL_UNSIGNED_SHORT, FUENF9);glDrawElements(GL_POLYGON, 5, GL_UNSIGNED_SHORT, FUENF10);glDrawElements(GL_POLYGON, 5, GL_UNSIGNED_SHORT, FUENF11);glDrawElements(GL_POLYGON, 5, GL_UNSIGNED_SHORT, FUENF12);

// Die SechseckeglDrawElements(GL_POLYGON, 6, GL_UNSIGNED_SHORT, SECHS1);glDrawElements(GL_POLYGON, 6, GL_UNSIGNED_SHORT, SECHS2);glDrawElements(GL_POLYGON, 6, GL_UNSIGNED_SHORT, SECHS3);glDrawElements(GL_POLYGON, 6, GL_UNSIGNED_SHORT, SECHS4);glDrawElements(GL_POLYGON, 6, GL_UNSIGNED_SHORT, SECHS5);glDrawElements(GL_POLYGON, 6, GL_UNSIGNED_SHORT, SECHS6);glDrawElements(GL_POLYGON, 6, GL_UNSIGNED_SHORT, SECHS7);glDrawElements(GL_POLYGON, 6, GL_UNSIGNED_SHORT, SECHS8);glDrawElements(GL_POLYGON, 6, GL_UNSIGNED_SHORT, SECHS9);glDrawElements(GL_POLYGON, 6, GL_UNSIGNED_SHORT, SECHS10);glDrawElements(GL_POLYGON, 6, GL_UNSIGNED_SHORT, SECHS11);glDrawElements(GL_POLYGON, 6, GL_UNSIGNED_SHORT, SECHS12);glDrawElements(GL_POLYGON, 6, GL_UNSIGNED_SHORT, SECHS13);glDrawElements(GL_POLYGON, 6, GL_UNSIGNED_SHORT, SECHS14);glDrawElements(GL_POLYGON, 6, GL_UNSIGNED_SHORT, SECHS15);glDrawElements(GL_POLYGON, 6, GL_UNSIGNED_SHORT, SECHS16);glDrawElements(GL_POLYGON, 6, GL_UNSIGNED_SHORT, SECHS17);glDrawElements(GL_POLYGON, 6, GL_UNSIGNED_SHORT, SECHS18);glDrawElements(GL_POLYGON, 6, GL_UNSIGNED_SHORT, SECHS19);glDrawElements(GL_POLYGON, 6, GL_UNSIGNED_SHORT, SECHS20);

glutSwapBuffers();}

4.7.3 Fallstudie Polygonale Netze in Alias MAYA

1. Modellieren Sie mit Hilfe der Alias MAYA PLE eine Hand wie im Text angedeutet. Verwen-den Sie dabei Ihre eigene Hand als Vorbild.

Losung:Bei den Downloads zu diesem Kapitel finden Sie eine entsprechende MAYA Datei!

2. Modellieren Sie eine Hand in Subdivision-Darstellung und vergleichen Sie die Ergebnisse mitdem Netz aus Aufgabe 1!

Page 84: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

4 Polygonale Netze 79

Losung:Auch fur diese Aufgabe finden Sie eine entsprechende MAYA Datein bei den Downloads zudiesem Kapitel.

Es soll an dieser Stelle nochmals darauf hingewiesen werden, dass Sie beim Smooth-Operator(nicht nur in MAYA) extrem vorsichtig sein sollten – wenigstens falls Sie auf die Anzahl derPolygone im endgultigen Modell achten mussen!

3. Modellieren Sie mit Hilfe der Alias MAYA PLE verschiedene Schachfiguren als Subdivisions-Modell!

Losung:Auch fur diese Aufgabe finden Sie eine entsprechende MAYA Datei bei den Downloads zudiesem Kapitel!

Page 85: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

Kapitel 5

Bildsynthese

5.7 (Anti-)Aliasing

1. Zum Rendern ohne Supersampling eines Bilds der Auflosung 768 × 576 benotigten Sie 20Minuten. Sie entscheiden sich, das Bild produktionsreif zu berechnen, und wahlen ein vierfa-ches Supersampling aus. Mit welcher Renderzeit mussen Sie jetzt fur das Bild rechnen? Mitwelcher Renderzeit mussen Sie rechnen, wenn Sie einen entsprechenden Film der Lange 5Minuten rendern mochten (nehmen Sie eine zu berechnende Bildwiederholrate von 50 Hzund eine gleichaufwandige Bildberechnung an)?

Losung:Einzelbild:20 Minuten · 4 · 4 = 320 Minuten = 5 Stunden 20 Minuten

5 Minuten Sequenz:

320 Minuten · 5 · 60 · 50 = 4.800.000 Minuten= 80.000 Stunden= 3.333 Tage 8 Stunden= 9 Jahre 48 Tage 8 Stunden

2. Betrachten Sie das obige Beispiel des sich drehenden Wagenrads. Was passiert, wenn wir dasRad genauso schnell drehen, dass eine achtel Umdrehung 0.02 s dauert? Warum ist eine va-riierende Geschwindigkeit des Rads in einem Bereich um diese Geschwindigkeit besondersstorend?

Losung:Bei dieser Geschwindigkeit des Rads scheint es still zu stehen. Andert sich allerdings dieGeschwindigkeit leicht zu- oder abnehmend, sehen wir das Rad abwechselnd vorwarts undruckwarts drehen.

3. Betrachten Sie das obige Beispiel des sich drehenden Wagenrads einer Kutsche. Die Wa-genrader der Kutsche haben einen Durchmesser von 1.10 m. Bis zu welcher Geschwindig-keit darf die Kutsche gerade nicht mehr beschleunigen, damit keine Aliasing-Effekte bei derWahrnehmung der Wagenrader auftreten?

Losung:Eine volle Periode (eine achtel Umdrehung) muss mehr als 0.04 s dauern. Also muss eine

Page 86: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

5 Bildsynthese 81

volle Umdrehung mehr als 0.32 s dauern. Eine volle Umdrehung entspricht dem zuruckge-legten Weg von 2 · π · 1.1/2 m = 3.46 m. Damit ist die maximale Geschwindigkeit kleiner als10.8 m/s = 38.9 km/h.

5.9 Fallstudien

5.9.1 Beleuchtung, Materialien und Schattierungen in OpenGL

1. Schreiben Sie ein kurzes OpenGL-Programm, das als Objekt eine einfache Kugel darstellt.Beleuchten Sie diese abwechselnd mit einem Richtungslicht und einer Punktlichtquelle. Ver-wenden Sie einmal ein in der Szene fest platziertes Licht und im Gegensatz dazu ein Head-light!

Losung:Ein entsprechendes Beispielprogramm finden Sie unter KugelBeleuchtung in den Quellcodeszu diesem Kapitel.

2. Definieren Sie sich per Hand mit GL_TRIANGLES Primitiven einen goldfarbenen Wurfel. Ent-fernen Sie eine der Seitenflachen und experimentieren Sie mit glFrontFace, glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,*) und Backface-Culling!

Losung:Ein entsprechendes Beispielprogramm finden Sie unter GoldenerWurfel in den Quellcodes zudiesem Kapitel.

Warum erkennt man bei eingeschalteter Beleuchtung und aktiviertem Flat-Shading die dia-gonale Kante auf einer Wurfelseite?

3. Definieren Sie per Hand mit GL_QUADS Primitiven einen Wurfel mit den sechs unterschiedli-chen Materialien schwarzes Plastik, Messing, Bronze, Kupfer, Gold und Silber!

Losung:Ein entsprechendes Beispielprogramm finden Sie unter MaterialienWurfel in den Quellcodeszu diesem Kapitel.

4. Benutzen Sie die GLUT-Funktion glutSolidSphere zur Darstellung einer ausgefullten Ku-gel. Diese Funktion setzt u. a. die Eckennormalen automatisch. Definieren Sie ein Materialfur die Kugel und experimentieren Sie mit Flat- und Gouraud-Shading in OpenGL! Polygo-nalisieren Sie nun selbst eine Kugel mit variabler Unterteilung in Richtung des Langen- undBreitengrads. Bestimmen Sie einmal Ihre Eckennormalen optimal fur Flat-Shading und ein-mal optimal fur Gouraud-Shading. Vergleichen Sie Ihre Ergebnisse!

Losung:Ein entsprechendes Beispielprogramm finden Sie unter KugelExperiment in den Quellcodes zudiesem Kapitel.

Offensichtlich sieht die von GLUT generierte Kugel sowohl bei Gouraud- als auch bei Flat-Shading ”gut“ aus.

Wir polygonalisieren nun selbst eine Kugel, indem wir Sie von oben nach unten in Strei-fen/Lagen einteilen und jeden dieser Streifen mit Quads approximieren. Die Anzahl der La-gen bezeichnen wir mit STACKS, die der Quads pro Lage mit SLICES. Unter Zuhilfenahmevon Kugelkoordinaten sollte Ihnen die Berechnung der einzelnen Eckpunkte gelingen. Wennwir nun mittels der Eckpunkte Quads erzeugen, mussen wir uns uber die Normalen, die wirdabei setzen mussen, im Klaren sein.

Page 87: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

5 Bildsynthese 82

Fur Gouraud-Shading setzen wir im Eckpunkt das Mittel der angrenzenden Facettennorma-len. Dies ist fur unsere benutzte Einheitskugel um den Ursprung genau identisch der Eck-punktkoordinate – wir mussen nichts ausrechnen. Beachten Sie, dass es zu jedem Eckpunkt(egal wie oft er physikalisch existiert) nur ”eine“ Normale in eine Richtung gibt. BeachtenSie im Beispielprogramm die Darstellung mit dargestellten Normalenvektoren. Diese Modellsieht bei Gouraud- und bei Flat-Shading gut aus und gleicht dem GLUT-Modell sehr. EineSchwierigkeit ist vorhanden: Bei Flat-Shading scheint die eine Polkappe flach zu sein? Woranliegt das? Verbessern Sie das Beispielprogramm!

Beim Flat-Modell wahlen wir jeweils fur jeden Quad in allen seinen Eckpunkten die Ecken-normale gleich der Facettennormale. Damit kann eine Ecke ”mehrere“ Normalen haben! Siebenotigen dazu das Kreuzprodukt. Vergessen Sie nicht, die Normalen zu normieren! Waspassiert eigentlich bei aktiviertem Gouraud-Shading? Das Objekt bleibt anscheinend Flat be-leuchtet. Warum? Aber halt – andert sich da nicht die Farbe um eine Nuance? Konnen Sie sichdas erklaren?

Es ist ubrigens nicht relevant, dass fur das Gouraud-Modell Quad-Strips verwendet wurden– hier konnten ebenso einzelne Quads verwendet werden, es wurde nur ineffizienter.

Programmieren Sie das gesamte Beispielprogramm nach! Dies ist eine gute Ubung und Siewerden staunen, uber wieviele Fallstricke (auf diese ist in unserem Quelltext hingewiesen)Sie stolpern, obwohl das Prinzip klar ist.

5.9.2 Cg Vertex-Shader in OpenGL

1. Erweitern Sie unseren Phong-Shader um eine zweite Lichtquelle!

Losung:Ein entsprechendes Beispielprogramm finden Sie unter CgTwoLights in den Quellcodes zudiesem Kapitel.

2. Das umgesetzte Phong-Modell ist nicht exakt identisch mit dem in Abschnitt 5.3.2 eingefuhr-ten Phong-Modell. Beheben Sie dies!

Losung:Wir haben im vorgefuhrten Shader-Beispiel von vielen Einzelheiten abstrahiert. Insbesonderehat eine Lichtquelle verschiedene Anteile (ambient, diffus, spiegelnd). Diese lassen sich auchin OpenGL als Parameter einer Lichtquelle einstellen. Auch die Materialparameter wurdeneinfach gewahlt und fest im Shader verankert. Auch diese stellt man in OpenGL uber Mate-rialparameter ein.

Ihre Aufgabe ist nun, alle OpenGL-Parameter uber geeignete Parameterubergaben in denShader weiter zu reichen (Beispiele zur Parameterubergabe birgt das gegebene Beispiel) unddie Phong-Beleuchtungsformel detaillierter umzusetzen.

3. Implementieren Sie die Variante des Phong-Modells, die den Reflexionsvektor statt des Halfway-Vektors benutzt! Vergleichen Sie die Ergebnisse!

Losung:Ein entsprechendes Beispielprogramm finden Sie unter CgPhongBeleuchtungR in den Quellco-des zu diesem Kapitel.

4. Fugen Sie dem Cartoon-Shading Farbe hinzu!

Losung:Ein entsprechendes Beispielprogramm finden Sie unter CgColorCartoon in den Quellcodes zudiesem Kapitel.

Page 88: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

5 Bildsynthese 83

5.9.3 GLSL Vertex- und Fragment-Shader

1. Implementieren Sie das Phong-Shading fur die Original-Phong-Beleuchtung mit dem Refle-xionsvektor r! Vergleichen Sie!

Losung:Ein entsprechendes Beispielprogramm finden Sie unter PhongShadingR in den Quellcodes zudiesem Kapitel.

2. Implementieren Sie die Phong-Beleuchtung mittels Per Vertex-Lighting!

Losung:Ein entsprechendes Beispielprogramm finden Sie unter PhongBeleuchtungR in den Quellcodeszu diesem Kapitel.

3. Implementieren Sie die Blinn-Beleuchtung mittels Per Vertex-Lighting!

Losung:Ein entsprechendes Beispielprogramm finden Sie unter PhongBeleuchtungH in den Quellcodeszu diesem Kapitel.

4. Implementieren Sie ein farbiges Cartoon-Shading mittels Per Pixel-Lighting!

Losung:Ein entsprechendes Beispielprogramm finden Sie unter GLSLColorCartoon in den Quellcodeszu diesem Kapitel.

5.9.4 Mapping in OpenGL

1. Benutzen Sie eine beliebige Textur und konstruieren Sie per Hand mit Primitiven und denzugehorigen Textur-Koordinaten die linken Bilder aus Abbildung 5.32 nach!

Losung:Ein entsprechendes Beispielprogramm finden Sie unter AbbildungTexturing in den Quellcodeszu diesem Kapitel.

Die Schwierigkeit ist das nicht planare Viereck - korrekter das bilineare Flachenstuck! Dieskonnen wir mittels eines Bezier-Flachensegments vom Grad (1,1) darstellen und dann wiein der letzten Aufgabe dieses Kapitels mit uv-Mapping texturieren. Denken Sie insbesonderedaran, dass OpenGL uberhaupt nicht definiert was passiert, falls ein Primitiv nicht planaroder nicht konvex ist – es kann etwas beliebig falsches rauskommen.

2. Konstruieren Sie per Hand einen Spiel-Wurfel mit entsprechenden Texturen!

Losung:Ein entsprechendes Beispielprogramm finden Sie unter Spielwurfel in den Quellcodes zu die-sem Kapitel.

3. Erzeugen Sie mit einem prozeduralen Ansatz eine Schachbrett-Textur und texturieren Sie da-mit den Teapot!

Losung:Ein entsprechendes Beispielprogramm finden Sie unter SchachbrettTeapot in den Quellcodeszu diesem Kapitel.

4. Erzeugen Sie mit Hilfe eines prozeduralen Ansatzes eine ”Yps“-Textur auf einem Teapot!

Page 89: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

5 Bildsynthese 84

Losung:Ein entsprechendes Beispielprogramm finden Sie unter YpsTeapot in den Quellcodes zu die-sem Kapitel.

5. Texturieren Sie ein Bezier-Flachensegment vom Grad (3, 3) unter Ausnutzung des uv-Mappings!Lesen Sie dazu in [WND00] nach, wie die Evaluatoren fur die Berechnung der Textur-Koordinatenbenutzt werden konnen!

Losung:Idee: Die zu generierenden Textur-Koordinaten sind die Ausgaben der Auswertung eineszweiten (planaren) Bezier-Flachensegments uber dem Einheitsquadrat. Wir wahlen hier denPolynomgrad 1, was die wegen der linearen Prazession entstehenden Textur-Koordinaten li-near ohne Verzerrung auf dem Parametergebiet [0,1] entstehen lasst. Ein entsprechendes Bei-spielprogramm finden Sie unter BezierTexturing in den Quellcodes zu diesem Kapitel.

Interessant ware auch ein hoherer Polynomgrad auf dem Einheitsquadrat mit unregelmaßigverteilten inneren Kontrollpunkten; damit lasst sich die Verformung der Textur modellieren.Probieren Sie dies aus!

Page 90: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

Kapitel 6

Visualisierung

6.2 Datenstrukturen

1. Vergleichen Sie den Speicherbedarf, falls 100 × 100 × 100 float[3] Punkte als kartesischesGitter, rechtwinkliges Gitter, strukturiertes Gitter oder unstrukturiertes Gitter von Hexaedernvorliegen!

Losung:Die 1003 Punkte werden als Volumen von 100 × 100 × 100 Punkten angenommen. Fur intund float werden 4 Byte angesetzt.

kartesisches Gitter: Es werden 3 float Werte fur den Ursprung und 3 float fur die Schritt-weiten in die Koordinatenrichtungen benotigt, plus 3 int Werte fur die Anzahl der Punk-te in jede Richtung. Dann werden fur den Datensatz 36 Byte benotigt.

rechtwinkliges Gitter: Fur den Ursprung 12 Byte, fur die Anzahl der Punkte in jede Rich-tung 12 Byte und fur jede Koordinatenrichtung 99 Schrittweiten, die wir auch als floatannehmen. Insgesamt ergibt sich ein Speicherbedarf von rund 1.2 MB.

strukturiertes Gitter: Die Punktkoordinaten mussen explizit gespeichert werden plus 12 Bytefur die Anzahl der Punkte in jeder Richtung. Dies ergibt einen Speicherbedarf von rund4 MB.

unstrukturiertes Gitter: Wieder mussen die Punktkoordinaten explizit gespeichert werden,dafur werden 4 MB benotigt. Fur jede Zelle (Hexaeder) werden 8 int Werte benotigt,um die Topologie abzuspeichern. Gehen wir von 100 000 Zellen aus, dann ergibt sich einSpeicherbedarf von rund 3, 2 MB. Allgemein ist der Speicherbedarf gegeben durch 4 MB+ NoZ ·32 Byte; wenn NoZ die Anzahl der Zellen bezeichnet.

2. Bestimmen Sie den Speicherbedarf fur die Attribute an 100 × 100 × 100 float[3] Punkten,falls dafur die Datentypen unsigned int, float, float[3], double[3][3] verwendet wer-den!

Losung:Fur int und float wird von einem Speicherbedarf von 4 Byte ausgegangen; bei double von8 Byte. Fur die 1003 = 1 000 000 Punkte entstehen dann je nach Attributwert folgenderSpeicherbedarf fur die Attribute:

unsigned int: 4 MB;

float: 4 MB;

Page 91: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

6 Visualisierung 86

float[3]: 12 MB;

double[3][3]: 72 MB.

3. Bestimmen Sie den Speicherbedarf fur einen Datensatz, der eine zeitabhangige Simulationmit 100 Zeitschritten darstellt! Dabei soll der Datensatz 100 × 100 × 100 float[3] Punkteenthalten, als Attribute liegen float[3] Werte vor.

Losung:Fur die Berechnung wird einmal davon ausgegangen, dass die Punkte im Datensatz als struk-turiertes Gitter vorliegen. Dann benotigt man fur den Datensatz 4 MB. Sind nur die Attributezeitabhangig, dann entsteht pro Zeitschritt ein Speicherbedarf von 12 MB und insgesamt furdie 100 Zeitschritte 4 MB + 100 · 12 MB ≈ 1, 2 GB.

Ist auch die Geometrie zeitabhangig, dann entsteht ein Speicherbedarf von 100 · (4 + 12) MB≈ 1, 6 GB.

4. Beschreiben Sie kartesische und strukturierte Gitter in Polar- und in Kugelkoordinaten anHand eines kleinen Beispiels!

Losung:Ein kartesisches Gitter in Polarkoordinaten hat gleichmassige Schrittweiten im Radius undim Winkel. Dadurch entstehen konzentrische Kreise wie in Abbildung 6.1. Fur ein rechtwink-liges Gitter wird ein Vektor mit Radiuswerten und ein Vektor mit Winkelwerten angegeben;mit gleichmassiger Topologie. Wenn wir immer von Vierecken ausgehen entsteht ein Bildwie in Abbildung 6.3. Fur diese Abbildung werden die Radien (0.5, 1.0, 2.0, 2.5, 2.75) und dieWinkel (0◦, 45◦, 60◦, 90◦, 135◦ , 360◦) angenommen.

In Abbildung 6.2 sehen Sie ein kleines Beispiel eines strukturierten Gitters in Polarkoordina-ten. Dabei sollen die Punkte V1 = (0.5, 0◦), V2 = (0.7, 30◦), V3 = (0.4, 90◦), V4 = (1.0, 10◦),V5 = (0.9, 45◦) und V6 = (1.5, 75◦) enthalten sein. Als Zellen sind die ”Vierecke“ mit denEcken 1, 4, 5, 2 und 2, 5, 6, 3 enthalten.

Abbildung 6.1: Ein kartesisches Gitter in Polarkoordinaten fur Aufgabe 4

6.3 Algorithmen fur skalare Attribute

1. Suchen Sie 6 Farben mit moglichst hohem Kontrast!

Losung:Schwarz, Weiß, Grun, Rot, Gelb, Cyan. Die minimale Differenz in der Luminanz ist dann 0.11.

2. Fuhren Sie Marching Squares manuell fur einen Kreis in impliziter Darstellung x2 + y2 = 1durch. Benutzen Sie dafur Gitter mit einer Auflosung von 5× 5 bzw. 10× 10. Die Gitter sollendabei das Quadrat [−1.5, 1.5] × [−1.5, 1.5] umfassen.

Page 92: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

6 Visualisierung 87

Abbildung 6.2: Ein strukturiertes Gitter inPolarkoordinaten fur Aufgabe 4

Abbildung 6.3: Ein ”rechtwinkliges“ Git-ter in Polarkoordinate fur Aufgabe 4

Losung:Fur die beiden Auflosungen finden sie in Tabelle 6.1 die entsprechenden Skalare; in Abbil-dung 6.4 die grafische Darstellung.

Tabelle 6.1: Die Daten fur Aufgabe 2

4.5 2.8125 2.25 2.8125 4.52.8125 1.125 0.5625 1.125 2.8125

2.25 0.5625 0 0.5625 2.252.8125 1.125 0.5625 1.125 2.8125

4.5 2.8125 2.25 2.8125 4.5

4.5 3.61 2.94 2.5 2.27 2.27 2.5 2.94 3.61 4.53.61 2.72 2.055 1.61 1.388 1.388 1.61 2.055 2.72 3.61

2.944 2.055 1.388 0.944 0.722 0.722 0.944 1.388 2.055 2.9442.5 1.61 0.944 0.5 0.277 0.277 0.5 0.944 1.61 2.5

2.277 1.388 0.722 0.277 0.055 0.055 0.277 0.72 1.388 2.2772.27 1.388 0.722 0.277 0.055 0.055 0.277 0.722 1.388 2.2772.5 1.61 0.944 0.5 0.277 0.277 0.5 0.944 1.61 2.5

2.944 2.055 1.388 0.944 0.722 0.722 0.944 1.388 2.055 2.9443.61 2.722 2.055 1.61 1.388 1.388 1.61 2.055 2.722 3.614.5 3.61 2.944 2.5 2.277 2.277 2.5 2.944 3.61 4.5

Abbildung 6.4: Die Berechnung von Konturlinien durch lineare Interpolation fur Aufgabe 2; linksAuflosung 5 × 5, rechts 10 × 10 in Aufgabe 2

3. Reduzieren Sie die 16 im Marching-Squares auftretenden Falle durch Symmetrie, Rotationenund Spiegelungen auf moglichst wenige Falle!

Losung:Man kommt durch Symmetrie und Rotation auf 4 Falle:

(a) 0, 15;

Page 93: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

6 Visualisierung 88

(b) 1, 2, 4, 7, 8, 11, 13, 14;

(c) 3, 6, 9, 12;

(d) 5, 10.

6.4 Direkte Volumen-Visualisierung

1. Skizzieren Sie den Verlauf des kubischen Splines als Rekonstruktionsfilter von Mitchell undNetravali fur B = 0, 5, C = 0, 85!

Losung:Den Filter nach Mitchell und Netravali sehen Sie in Abbildung 6.5. An der Stelle |x| = 2 giltimmer Ht(B, C) = 0; fur |x| = 1 ist der Funktionswert Ht(B, c) = B und an der Stelle x = 0gilt Ht(B, C) = 6 − 2B.

-

6

1−1 2−2

Abbildung 6.5: Der Filter nach Mitchell und Nevanlina fur B = 0.5, C = 0.85

2. Definieren Sie eine Transferfunktion fur einen Datensatz, in dem Skalare im Intervall [100, 200]als Haut, im Intervall [200, 300] als Muskelgewebe und im Intervall [300, 400] Knochen re-prasentieren.

Losung:Eine scharfe Trennung ist nicht moglich bei der Lage; eine Moglichkeit ware die Kurve in Ab-bildung 6.6. Moglich ware auch eine Realisierung mit einer uberlappenden, ”fuzzy“ Transfer-funktion.

-

6

100 200 300 400Abbildung 6.6: Ein Vorschlag einer Transferfunktion fur Aufgabe 2

3. Weisen Sie mit Hilfe von Associated Colors nach, dass das Compositing assoziativ ist!

Page 94: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

6 Visualisierung 89

Losung:Das Beispiel im Text mit den umgekehrten Reihenfolgen hat bereits gezeigt, dass Compositingnicht kommutativ ist. Ist ⊕ der Composting-Operator, dann bedeutet Assoziativitat, dass

(C1 ⊕ C2)⊕ C3 = C1 ⊕ (C2 ⊕ C3)

gilt.

Angenommen, Sie haben zwei Bilder C1 und C2, die Sie mit Compositing ubereinander le-gen mochten; Sie wissen jedoch noch nicht, welchen Hintergrund C3 Sie spater verwendenmochten. Falls das Compositing assoziativ ist bedeutet dies, dass Sie schon einmal die beidenBilder ubereinander legen konnen und spater entscheiden, welchen Hintergrund Sie verwen-den.

Der Nachweis ist am einfachsten, wenn man Associated Colors verwendet. Dann sind alsodie drei Farben

C′1 = α1C1, C′

2 = α2C2, C′3 = α3C3

gegeben. Fur C′1 ⊕ C′

2 war

C′1 ⊕ C′

2 = (1 −α2)C′1 + C′

2,γ = (1 −α2)α1 +α2.

Dabei ist γ die Opazitat der Farbe C′1 ⊕ C′

2.

Es gilt

(C′1 ⊕ C′

2)⊕ C′3 = ((1 −α2)C′

1 + C′2)⊕ C′

3

= (1 −α3)((1 −α2)C′1 + C′

2) + C′3

= (1 −α3)(1 −α2)C′1 + (1 −α3)C′

2 + C′3

= (1 −α2 +α2α3 −α3)C′1 + (1 −α3)C′

2 + C′3

= (1 −α2(1 −α3)−α3)C′1 + (1 −α3)C′

2 + C′3

= C′1 ⊕ (C′

2 ⊕ C′3).

Die letzte Identitat folgt aus der Tatsache, dass die Opazitat fur C2 ⊕C′3 durch (1−α3)α2 +α3

gegeben ist.

6.5 Visualisierung von Vektorfeldern

1. Skizzieren Sie die Vektorfelder:

f(x, y) = (y, x), f(x, y) = (−x, 2y),

f(x, y) =1√

x2 + y2(y,−x), f(x, y) = (y2 − 2xy, 3xy − 6x2).

Losung:Die Skizzen finden Sie in den Abbildungen 6.7 bis 6.10.

2. Skizzieren Sie die Gradientenvektorfelder fur F(x, y) = x2 − 12 y2 und F(x, y) = ln

√x2 + y2.

Losung:Die Gradientenvektorfelder finden Sie in den Abbildungen 6.11 und 6.12.

Page 95: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

6 Visualisierung 90

Abbildung 6.7: f (x, y) = (y, x) Abbildung 6.8: f (x, y) = (−x, 2y)

Abbildung 6.9: f (x, y) = 1√x2+y2

(y,−x)Abbildung 6.10: f (x, y) = (y2 −2xy, 3xy − 6x2)

Abbildung 6.11: F(x, y) = x2 − 12 y2

Abbildung 6.12: F(x, y) = ln (√

x2 + y2)

3. Skizzieren Sie Feldlinien, Trajektorien und Spurlinien fur das Vektorfeld f(x, y, t) = ((1 −t)x, (t − 1)y) fur t ∈ [0, 1].

Losung:Die Feldlinien dieses Vektorfelds sind die Hyperbeln y = C/x. In Abbildung 6.13 sehen Siedie Trajektorien zum Zeitpunkt t = 0.

Page 96: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

6 Visualisierung 91

Abbildung 6.13: Die Trajektorien des Felds in Aufgabe 4 zum Zeitpunkt t = 0

4. Skizzieren Sie das Vektorfeld fur die Umstromung einer Kugel mit Hilfe von Vektoren furausgewahlte Punkte. Dieses Vektorfeld ist ein Gradientenfeld mit dem Potenzial

F(x, y, z) = v0

(z +

R3z

2√

x2 + y2 + z23

).

Losung:Durch Ableiten des Potenzials bestimmt sich das Vektorfeld als

f (x, y, z) = v0

001

+

R3

2√

x2 + y2 + z25

−3xz−3yz

x2 + y2 − 2z2

Auf den Koordinatenachsen erhalt man damit

f (0, 0,±R) = v0

001

+

R3

2R5

00

−2R2

= 0,

f (±R, 0, 0) = v0

001

+

R3

2R5

00

R2

=

32

v0

001

,

f (0,±R, 0) = v0

001

+

R3

2R5

00

R2

=

32

v0

001

.

Fur den Punkt P = (x, y, z) und R = ‖P‖ gilt

〈 f (x, y, z), P〉 = v0(z +1

2R2 (−2z)R2) = 0.

Das Vektorfeld steht also immer senkrecht auf dem Punkt; also tangential zur umstromtenKugel! Die Abbildungen 6.44, 6.45 und 6.48 im Buch zeigen dieses Vektorfeld.

Page 97: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

6 Visualisierung 92

6.7 Fallstudien

6.7.1 Die Visualisierungs-Pipeline in VTK

1. Schreiben Sie VTK-Pipelines, die die Abbildungen 6.58 und 6.60 zum Ergebnis haben!

Losung:Hier ein Ausschnitt aus der Losung; den kompletten Quelltext finden Sie bei den Downloadszu diesem Kapitel!

vtkPoints *points = vtkPoints::New();// Die Gitterpunktkoordinaten setzen.points->SetNumberOfPoints(23);points->InsertPoint(0,0,0,0);points->InsertPoint(1,1,0,0);points->InsertPoint(2,0,1,0);points->InsertPoint(3,1,1,0);points->InsertPoint(4,0,0,1);points->InsertPoint(5,1,0,1);points->InsertPoint(6,0,1,1);points->InsertPoint(7,1,1,1);// Die Punkte fur den Tetraeder.points->InsertPoint(8,1.5,0,0);points->InsertPoint(9,2.5,0,0);points->InsertPoint(10,2.0,1,0);points->InsertPoint(11,2.0, 0.5, 1);// Die Punkte fur das Prisma.points->InsertPoint(12, 3,1,0);points->InsertPoint(13, 3,0,0);points->InsertPoint(14, 3,0.5, 0.5);points->InsertPoint(15, 4,1,0);points->InsertPoint(16, 4,0,0);points->InsertPoint(17, 4,0.5,0.5);// Die Punkte fur die Pyramide.points->InsertPoint(18, 5,0,0);points->InsertPoint(19, 6,0,0);points->InsertPoint(20, 6,1,0);points->InsertPoint(21, 5,1,0);points->InsertPoint(22, 5.5,0.5,1);// Eine Voxel-ZellevtkVoxel *aVoxel = vtkVoxel::New();

for (i=0; i<8; i++) aVoxel->GetPointIds()->SetId(i,i);// Eine Tetraeder-ZellevtkTetra *aTetra = vtkTetra::New();

aTetra->GetPointIds()->SetId(0,8);aTetra->GetPointIds()->SetId(1,9);aTetra->GetPointIds()->SetId(2,10);aTetra->GetPointIds()->SetId(3,11);

// Eine Prisma-ZellevtkWedge *aWedge = vtkWedge::New();

aWedge->GetPointIds()->SetId(0,12);aWedge->GetPointIds()->SetId(1,13);aWedge->GetPointIds()->SetId(2,14);aWedge->GetPointIds()->SetId(3,15);aWedge->GetPointIds()->SetId(4,16);aWedge->GetPointIds()->SetId(5,17);

vtkPyramid *aPyramid = vtkPyramid::New();aPyramid->GetPointIds()->SetId(0,18);

Page 98: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

6 Visualisierung 93

aPyramid->GetPointIds()->SetId(1,19);aPyramid->GetPointIds()->SetId(2,20);aPyramid->GetPointIds()->SetId(3,21);aPyramid->GetPointIds()->SetId(4,22);

// Die Zellen in den Datensatz ablegen.// Instanz eines unstrukturierten Gitters;// die Instanz points wird als Gitterpunkte verwendet.vtkUnstructuredGrid *theGrid = vtkUnstructuredGrid::New();

theGrid->Allocate(1,1);theGrid->SetPoints(points);theGrid->InsertNextCell(aVoxel->GetCellType(),aVoxel->GetPointIds());theGrid->InsertNextCell(aTetra->GetCellType(),aTetra->GetPointIds());theGrid->InsertNextCell(aWedge->GetCellType(),aWedge->GetPointIds());theGrid->InsertNextCell

(aPyramid->GetCellType(),aPyramid->GetPointIds());// Die Daten abbilden auf ein polygonales Netz.vtkDataSetMapper *mapper = vtkDataSetMapper::New();

mapper->SetInput(theGrid);

2. Gegeben ist eine Bitmap mit 100 × 100 Pixeln. Wie groß ist der Speicherbedarf, wenn Sie dieDaten als vtkStructuredGrid, vtkStructuredPoints oder vtkPolyData abspeichern?

Losung:Fur alle drei Formate mussen auf jeden Fall die Attribute, also die Farben, gespeichert wer-den. Moglich ware naturlich eine Zahl und eine Farbtabelle; oder direkt die RGB-Werte. Wennwir 8 Bit fur die Farbe pro Kanal ansetzen entsteht dadurch ein Bedarf von 30KB.

Fur vtkUnstructuredPoints ergibt sich ein Speicherbedarf von 36 Byte; der Ursprung, dieAnzahl der Punkte und das Spacing.

Fur vtkStructuredGrid mussen die Punktkoordinaten explizit gespeichert werden; dadurchergibt sich ein Bedarf von 40 KByte.

Fur vtkPolyData ergibt sich ein Bedarf von 40 KByte fur die Punktkoordinaten, plus 5 int-Werte pro Zelle fur die Topologie; also insgesamt 40 + 200 = 240 KByte.

3. Schreiben Sie eine Funktion, die fur eine Instanz vtkPolyData, in der Dreiecke oder TriangleStrips enthalten sind, diese Dreiecke abfragt und mit Hilfe von entsprechenden OpenGL-Primitiven GL_TRIANGLE und GL_TRIANGLE_STRIP ausgibt!

Losung:Hier ein Ausschnitt aus der Losung; den kompletten Quelltext finden Sie bei den Downloadszu diesem Kapitel.

#include "vtkPolyDataReader.h"#include "vtkOBJReader.h"#include "vtkPolyData.h"#include "vtkCellArray.h"

...

// Globale Großen fur VTK. Einlesen in init; darstellen in display.// Unterstutzt werden in diesem Code nur Linien und Dreiecke. Alle// anderen Zelltypen konnen aber analog behandelt werden.vtkPolyData *data = vtkPolyData::New();vtkCellArray *lines = vtkCellArray::New();vtkCellArray *polys = vtkCellArray::New();

/* display-Callback */

Page 99: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

6 Visualisierung 94

void display(void){

int i, prim=0, npts, *pts;GLfloat *aVertex;

glClear(GL_COLOR_BUFFER_BIT);

// Kamerasteuerungexamine();glMatrixMode(GL_MODELVIEW);

grid(10);

// VTKCellArrays durchlaufen und mit OpenGL ausgeben.//// Linienprim = 0;for (lines->InitTraversal(); lines->GetNextCell(npts, pts); prim++) {

glBegin(GL_LINES);for (i=0; i<npts; i++) {

aVertex = data->GetPoint(pts[i]);glVertex3f(aVertex[0], aVertex[1], aVertex[2]);

}glEnd();

}

// Dreiecke und Vierecke.prim = 0;for (polys->InitTraversal(); polys->GetNextCell(npts, pts); prim++) {

// Dreieck? Dann ...switch( npts ) {case 3: glBegin(GL_TRIANGLES);

for (i=0; i<npts; i++) {aVertex = data->GetPoint(pts[i]);

glVertex3f(aVertex[0], aVertex[1], aVertex[2]);}glEnd();break;

case 4: glBegin(GL_QUADS);for (i=0; i<npts; i++) {

aVertex = data->GetPoint(pts[i]);glVertex3f(aVertex[0], aVertex[1], aVertex[2]);}glEnd();break;

default: break;}

}

glFlush();glutSwapBuffers();

}

6.7.2 Volumen-Visualisierung mit VTK

1. Vergleichen Sie das Ergebnis des Ray-Castings ohne Schattierung mit den gezeigten Abbil-dungen!

Page 100: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

6 Visualisierung 95

Losung:In den Abbildungen 6.14 bis 6.17 finden Sie das Ergebnis eines Ray-Castings mit einer Pipeli-ne wie fur Bild 6.68 und Farbtafel 17; jeweils mit und ohne Schattierung und mit tri-linearerund mit nachster Nachbar- Interpolation. Die Bilder sind mit einem Datensatz mit Viertel-Auflosung (”headsq/quarter“) berechnet; was man deutlich am Aliasing erkennt. ProbierenSie einmal den Datensatz mit voller Auflosung; Sie finden Ihn unter den Quellen zu Kapitel 6;genauso wie die notige Pipeline. Die Bilder sind alle mit einer Post-Shading Pipeline (in VTKInterpolateFirst) gerechnet; der Default in VTK.

Abbildung 6.14: Ray-Casting mit Nearest-Neighbour und Schattierung

Abbildung 6.15: Ray-Casting mit Nearest-Neighbour ohne Schattierung

Abbildung 6.16: Ray-Casting mit tri-linearer Interpolation und Schattierung

Abbildung 6.17: Ray-Casting mit tri-linearer Interpolation ohne Schattierung

2. Erstellen Sie ein Programm, das angelehnt an die Beispiele die Maximumsprojektion stattCompositing fur den Schadel-Datensatz verwendet. Alternativ konnen Sie den DatensatzironProt.vtk verwenden. Vergleichen Sie Ihr Ergebnis mit Abbildung 6.70!

Losung:Den kompletten Quelltext finden Sie bei den Downloads zu diesem Kapitel!

vtkPiecewiseFunction *transfer = vtkPiecewiseFunction::New();vtkPiecewiseFunction *opaq = vtkPiecewiseFunction::New();vtkPiecewiseFunction *gradientOpaq = vtkPiecewiseFunction::New();

Page 101: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

6 Visualisierung 96

vtkVolumeProperty *prop = vtkVolumeProperty::New();vtkVolumeRayCastMIPFunction *mip = vtkVolumeRayCastMIPFunction::New();vtkVolumeRayCastMapper *mapper = vtkVolumeRayCastMapper::New();vtkVolume *volume = vtkVolume::New();

reader->SetFileName("ironProt.vtk");

// Transferfunktionen setzentransfer->ClampingOn();transfer->AddPoint(0, 0.0);transfer->AddPoint(64, 0.4);transfer->AddPoint(128, 0.6);transfer->AddPoint(192, 0.8);transfer->AddPoint(255, 1.0);

opaq->ClampingOn();opaq->AddPoint(20,0.0);opaq->AddPoint(64,0.1);opaq->AddPoint(128, 0.3);opaq->AddPoint(192, 0.5);opaq->AddPoint(255,0.7);

gradientOpaq->ClampingOn();gradientOpaq->AddPoint(0,0);gradientOpaq->AddPoint(3,0);gradientOpaq->AddPoint(6,1);

// Eigenschaftenprop->SetColor(transfer);

prop->SetInterpolationTypeToLinear();

prop->ShadeOn();prop->SetDiffuse(0.9);prop->SetAmbient(0.01);prop->SetSpecular(0.5);prop->SetSpecularPower(70.0);

// Mappermapper->SetInput(reader->GetOutput());mapper->SetVolumeRayCastFunction(mip);mapper->SetSampleDistance(1.0);

volume->SetMapper(mapper);volume->SetProperty(prop);

3. Verwenden Sie eine Post-shaded-Pipeline fur Ray-Casting mit dem VTK, und vergleichen Siedie Ergebnisse!

Losung:In Abbildung 6.18 sehen Sie das Ergebnis der Pipeline fur Abbildung 6.16 und Farbtafel 17;allerdings mit einer Pre-Shading-Pipeline. Beachten Sie unbedingt, dass Sie in VTK zwischenden beiden Pipelines nur umschalten konnen, wenn Sie tri-lineare Interpolation verwenden!

4. Das VTK bietet die Moglichkeit, verschiedene Level-of-Details fur die Volumendarstellungzu instanziieren; dazu dient die Klasse vtkLODProp3D. Experimentieren Sie mit dieser Klasseund den im Text dargestellten Visualisierungsalgorithmen!

Page 102: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

6 Visualisierung 97

Abbildung 6.18: Die Pipeline aus Abbildung 6.16 mit einer Pre-Shading Pipeline

Losung:Die Klasse vtkLODProp3D akzeptiert sowohl Ray-Casting-Mapper oder Texture-Mapping alsauch von vtkPolyDataMapper. So ist es beispielsweise moglich, mit vtkOutlineFilter dieBounding-Box des Datensatzes zu extrahieren und als niedrigsten Level-Of-Detail einzustel-len. In den Quellen zu diesem Kapitel finden Sie eine Pipeline. Fur eine Instanz volume derKlasse vtkLODProp3D werden drei verschiedene Levels hinzugefugt. Der letzte Parameter derFunktion ::AddLOD bedeutet, dass VTK selbst versucht die benotigte Renderzeit zu schatzen.

// Bounding - Box mit eigenem Materialoutline->SetInput(reader->GetOutput());outlineMapper->SetInput(outline->GetOutput());outlineProperty->SetColor(0.0, 0.0, 0.0);

// Texture2D Instanz als Level 2lowresMapper->SetInput(reader->GetOutput());

// Ray-Casting als level 3hiresMapper->SetInput(reader->GetOutput());hiresMapper->SetVolumeRayCastFunction(composite);hiresMapper->SetSampleDistance(distance);

int level1 = volume->AddLOD(outlineMapper, outlineProperty, 0.0);int level2 = volume->AddLOD(lowresMapper, prop, 0.0);int level3 = volume->AddLOD(hiresMapper, prop, 0.0)

6.7.3 Visualisierung von Vektorfeldern mit VTK

1. Implementieren Sie eine VTK-Pipeline, die das Vektorfeld f(x, y) = (−y, x)T visualisiert!

Losung:

Um die in der Fallstudie vorgestellten Methoden auf das Vektorfeld anzuwenden, muss ersteinmal ein Datensatz erstellt werden, der dieses enthalt. Dazu wird ein vtkStructuredGrid

instanziiert und an jeden Punkt (x, y) der Vektor (−y, x) gehangt. Der folgende Quelltextleistet das, mit einer Auflosung von 100 Punkten im Quadrat [−5, 5] × [−5, 5].

vtkPoints *points = vtkPoints::New();vtkFloatArray *vectors = vtkFloatArray::New();

Page 103: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

6 Visualisierung 98

vtkStructuredGrid *grid = vtkStructuredGrid::New();vtkStructuredGridWriter *writer = vtkStructuredGridWriter::New();dimension = 101;dims[0] = dimension;dims[1] = dimension;dims[2] = 1;

// Den Structured Grid erzeugen.grid->SetDimensions(dims);

// Punkte und Vektoren erzeugenvectors->SetNumberOfComponents(3);vectors->SetNumberOfTuples(dimension*dimension);points->Allocate(dimension*dimension);vectors->Allocate(dimension*dimension);

// SchrittweitendeltaY = (2.0*maxY)/(dims[1]-1);deltaX = (2.0*maxX)/(dims[0]-1);

x[2] = 0.0;v[2] = 0.0;for (j=0; j<dims[1]; j++)

{x[1] = -maxY + j*deltaY;jOffset = j * dims[0];for (i=0; i<dims[0]; i++)

{x[0] = -maxX + i*deltaX;v[0] = x[0];v[1] = x[1];whirl(v);offset = i + jOffset;points->InsertPoint(offset,x);vectors->InsertTuple(offset,v);}

}

grid->SetPoints(points);grid->GetPointData()->SetVectors(vectors);

// Daten schreibenwriter->SetInput(grid);writer->SetFileName("2Drot.vtk");writer->SetFileTypeToBinary();writer->Write();

Das eigentliche Vektorfeld wird in der Funktion whirl erzeugt:

// Die Feldfunktionenvoid whirl(float field[2]){

float swap = field[0];field[0] = -field[1];field[1] = swap;

}

Das Feld selbst ist naturlich ”langweilig“; als Stromlinien mussen immer Kreise mit Mittel-punkt im Ursprung herauskommen.

Page 104: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

6 Visualisierung 99

Der folgende Quelltext produziert Stromlinien; ausgehend von der x-Achse als Quelle:

vtkStructuredGridReader *reader = vtkStructuredGridReader::New();reader->SetFileName("2Drot.vtk");reader->Update();

vtkLineSource *rake = vtkLineSource::New();rake->SetPoint1(-5,0,0);rake->SetPoint2(5,0,0);rake->SetResolution(numLines);

vtkProperty *rakeProperty = vtkProperty::New();rakeProperty->SetColor(0.0,0.0,0.0);rakeProperty->SetLineWidth(2.0);

vtkPolyDataMapper *rakeMapper = vtkPolyDataMapper::New();rakeMapper->SetInput(rake->GetOutput());

vtkActor *rakeActor = vtkActor::New();rakeActor->SetMapper(rakeMapper);rakeActor->SetProperty(rakeProperty);

vtkRungeKutta4 *integ = vtkRungeKutta4::New();vtkStreamLine *sl = vtkStreamLine::New();sl->SetInput(reader->GetOutput());sl->SetSource(rake->GetOutput());sl->SetIntegrator(integ);sl->SpeedScalarsOn();sl->SetMaximumPropagationTime(propTime);sl->SetIntegrationStepLength(0.1);sl->SetIntegrationDirectionToForward();sl->SetStepLength(0.001);

vtkCleanPolyData *clean = vtkCleanPolyData::New();vtkPolyDataMapper *mapper = vtkPolyDataMapper::New();vtkActor *actor = vtkActor::New();vtkCamera *camera = vtkCamera::New();vtkRenderer *renderer = vtkRenderer::New();vtkRenderWindow *imgWin = vtkRenderWindow::New();vtkRenderWindowInteractor *interactor = vtkRenderWindowInteractor::New();

// Polylines saubernclean->SetInput(sl->GetOutput());clean->PointMergingOn();clean->SetTolerance(0.01);

Wichtig ist dabei der Einsatz der Klasse vtkCleanPolyData; sie ist dafur zustandig, die An-zahl der Punkte in den Polygonzugen zu reduzieren. In Abbildung 6.19 sehen Sie das Ergeb-nis fur MaximumPropagationTime(1); links mit einer Toleranz fur clean von 0.1, rechts ohneAnwendung von clean.

Fur eine Zeitangabe in sl->SetMaximumPropagationTime(3.2) erhalt man einen vollstandi-gen Kreis; da als Integration mit vtkRungeKutta4 ein Verfahren 4. Ordnung verwendet wird,werden die Kreise auch geschlossen. Das Ergebnis sehen Sie in Abbildung 6.20; einmal wiedermit 4 Quellpunkten, einmal mit 50 Quellpunkten aus dem Intervall [−5, 5].

Ohne Integration kommt die Methode aus, Kegel oder andere Objekte an die Punkte desGitters zu hangen; diese werden entsprechend des Felds ausgerichtet. Wichtig ist dabei, nichtalle Gitterpunkte zu verwenden; verschiedene Ergebnisse sehen Sie in den Abbildungen 6.21

Page 105: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

6 Visualisierung 100

Abbildung 6.19: Das Feld in Aufgabe 1, mit und ohne vtkCleanPolyData

Abbildung 6.20: Das Feld in Aufgabe 1 mit sl->SetMaximumPropagationTime(3.2)

und 6.22. Ob die Punkte regelmassig oder zufallig von der Klasse vtkMaskPoints ausgewahltwerden, kann ebenfalls eingestellt werden. In Abbildung 6.21 sehen Sei zufallig, in Abbildung6.22 regelmassig ausgewahlte Punkte.

Die Anderung im Quelltext ist nicht groß; statt den Stromlinien wird wie in der Fallstudiebeschrieben der folgende Quelltext eingeschoben:

vtkExtractGrid *extract = vtkExtractGrid::New();extract->SetInput(reader->GetOutput());extract->SetVOI(0, 100, 0, 100, 0, 100);extract->IncludeBoundaryOn();

vtkMaskPoints *mask = vtkMaskPoints::New();mask->SetInput(extract->GetOutput());//mask->RandomModeOn();mask->RandomModeOff();mask->SetOnRatio(ratio);

vtkConeSource *cone = vtkConeSource::New();cone->SetResolution(3);cone->SetHeight(1.0);

Page 106: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

6 Visualisierung 101

cone->SetRadius(0.5);

vtkGlyph3D *icon = vtkGlyph3D::New();icon->SetInput(mask->GetOutput());icon->SetSource(cone->GetOutput());icon->SetScaleFactor(0.1);

mapper->SetInput(icon->GetOutput());mapper->ScalarVisibilityOff();

Abbildung 6.21: Das Feld in Aufgabe 1, visualisiert mit Hilfe von vtkGlyph3D und zufalliger Anordnungder verwendeten Punkte

Abbildung 6.22: Das Feld in Aufgabe 1, visualisiert mit Hilfe von vtkGlyph3D und regelmassiger Anord-nung der verwendeten Punkte

Wie in der Fallstudie beschrieben konnen mit Hilfe von VTK auch Strombander und StreamTubes erzeugt werden. Die entsprechenden Ergebnisse finden Sie in den Abbildungen 6.23und 6.24. Das Feld ist zweidimensional; die OpenGL-Ausgabe ist naturlich dreidimensional.Und bei diesen Primitiven macht es auch Sinn, eine dreidimensionale Ansicht einzustellen;auch dies ist in den beiden Abbildungen zu sehen.

Alle Quelltexte zu dieser Aufgabe finden Sie unter den Downloads zu diesem Kapitel.

Page 107: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

6 Visualisierung 102

Abbildung 6.23: Das Feld in Aufgabe 1, visualisiert mit Hilfe von Strombandern

Abbildung 6.24: Das Feld in Aufgabe 1, visualisiert mit Hilfe von Stream Tubes

2. Implementieren Sie Pipelines, die fur verschiedene Datensatze, die dem VTK beigefugt sind,die Vektorfelder als Stromlinien, Symbole, Strombander oder Stream Tubes visualisieren! Ver-wenden Sie dafur den Datensatz kitchen.vtk oder office.vtk.

Losung:Bei den Downloads zu diesem Kapitel finden Sie Programme, die zu den Abbildungen imBuch fuhren.

Hier eine Pipeline fur die Erzeugung von Stromlinien und dem Datensatz kitchen.vtk, wienochmals in Abbildung 6.25 dargestellt. Das Einlesen der Mobel und den kompletten Quell-text finden Sie bei den Downloads zu diesem Kapitel.

//// Daten einlesen//vtkStructuredGridReader *reader = vtkStructuredGridReader::New();

reader->SetFileName("kitchen.vtk");reader->Update(); // Lesen erzwingen!reader->GetOutput()->GetLength();

Page 108: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

6 Visualisierung 103

Abbildung 6.25: Das Ergebnis der Pipeline

if ( reader->GetOutput()->GetPointData()->GetScalars() ){reader->GetOutput()->GetPointData()->GetScalars()->GetRange(range);}

if ( reader->GetOutput()->GetPointData()->GetVectors() ){maxVelocity = reader->GetOutput()->GetPointData()

->GetVectors()->GetMaxNorm();maxTime = 35.0*reader->GetOutput()->GetLength()/maxVelocity ;}

//// Stromlinien erzeugen//vtkLineSource *line = vtkLineSource::New();

line->SetResolution(39);line->SetPoint1(0.08, 2.50, 0.71);line->SetPoint2(0.08, 4.50, 0.71);

vtkPolyDataMapper *rakeMapper = vtkPolyDataMapper::New();rakeMapper->SetInput(line->GetOutput());

vtkActor *rake = vtkActor::New();rake->SetMapper(rakeMapper);

vtkStreamLine *streamers = vtkStreamLine::New();streamers->SetInput(reader->GetOutput());streamers->SetSource(line->GetOutput());streamers->SpeedScalarsOn();streamers->SetMaximumPropagationTime(maxTime);streamers->SetStepLength(maxTime/500.0);streamers->SetIntegrationStepLength(0.2);streamers->Update();

3. Experimentieren Sie mit den Datensatzen Blunt Fin und LoX Post und den in dem VTK ent-haltenen Algorithmen zur Visualisierung von Vektorfeldern!

Losung:Hier eine Pipeline fur die Erzeugung von Stream Tubes und dem Datensatz LoXPost; mehrdazu finden Sie auch bei den Quellen zu diesem Kapitel.

// Daten einlesen

Page 109: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

6 Visualisierung 104

vtkPLOT3DReader *reader = vtkPLOT3DReader::New();reader->SetXYZFileName("postxyz.bin");reader->SetQFileName("postq.bin");reader->Update();

// Farbtabelle definierenrainbow->SetHueRange(0.667,0.0);rainbow->SetSaturationRange(1.0, 1.0);rainbow->SetValueRange(1.0, 1.0);rainbow->SetNumberOfColors(256);rainbow->Build();

// Die Geometrie des Bodens extrahieren und darstellenfloor->SetExtent(0,37,0,75,0,0);floor->SetInput(reader->GetOutput());

floorMapper->SetInput(floor->GetOutput());floorMapper->ScalarVisibilityOff();

floorActor->SetMapper(floorMapper);floorActor->SetProperty(wireGray);

// Die Geometrie des Pfostens extrahieren und darstellenpost->SetExtent(10, 10, 0, 75, 0, 37);post->SetInput(reader->GetOutput());

postMapper->SetInput(post->GetOutput());postMapper->ScalarVisibilityOff();

postActor->SetMapper(postMapper);postActor->SetProperty(surfaceGray);

fan->SetExtent(0, 37, 38, 38, 0, 37);fan->SetInput(reader->GetOutput());

fanMapper->SetInput(fan->GetOutput());fanMapper->ScalarVisibilityOff();

fanActor->SetMapper(fanMapper);fanActor->SetProperty(surfaceGray);

// Berechnung der Stromlinien

// Die Quelle fur die Stromlinien extrahierenrake->SetExtent(10, 10, 38, 39, 10, 35);rake->SetInput(reader->GetOutput());

// Stromlinien integrierenstreamlines->SetInput(reader->GetOutput());streamlines->SetSource(rake->GetOutput());streamlines->SetMaximumPropagationTime(250);streamlines->SpeedScalarsOn();streamlines->SetIntegrationStepLength(0.2);streamlines->SetStepLength(0.25);

tubes->SetInput(streamlines->GetOutput());tubes->SetNumberOfSides(8);tubes->SetRadius(0.05);

Page 110: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

6 Visualisierung 105

tubes->SetVaryRadiusToVaryRadiusOff();

lineProp->SetLineWidth(5);

lineMapper->SetInput(tubes->GetOutput());lineMapper->SetLookupTable(rainbow);lineMapper->SetScalarRange(streamlines->GetOutput()->GetScalarRange());

lineActor->SetMapper(lineMapper);lineActor->SetProperty(lineProp);

Page 111: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

Kapitel 7

Computer-Animation

7.2 Basistechnologien und Interpolation

1. Die Polygonzuge P1 = {(0, 1), (1, 1), (1, 0)} und P2 = {(1, 1), (1, 0), (0, 0)} sollen zwei Keyf-rames einer Animation darstellen.

a) Berechnen Sie mit Hilfe von punktweiser linearer Interpolation (1− t)P1 + tP2 die Framesfur ti = i

10 , 0 ≤ i ≤ 10 und stellen Sie diese Frames in einem kartesischen Koordinaten-sytem dar!

b) Berechnen Sie Frames fur die beiden Keyframes, falls die Animation aus einer Drehungvon P1 um den Punkt Z = ( 1

2 , 12 ) besteht!

Losung:

a) In Abbildung 7.1 sehen Sie nochmals die beiden Ausgangsposition. Allgemein gilt fur eint ∈ R

X1(t) = (1 − t)(

01

)+ t(

11

)=

(t1

),

X2(t) = (1 − t)(

11

)+ t(

10

)=

(1

1 − t

)

X3(t) = (1 − t)(

10

)+ t(

00

)=

(1 − t

0

).

Es ist P1 = {X1(0), X2(0), X3(0)} und P2 = {X1(1), X2(1), X3(1)}. Der Ubergang zwi-schen den Punkten erfolgt immer auf einer Linie; beispielsweise verlasst X1(t) nie dieLinie zwischen (0, 1) und (1, 1). Das bedeutet insbesondere, dass der Abstand zwischenden einzelnen Punkten nicht konstant bleibt. Es ist

‖X2(t)− X1(t)‖2 = 1 − 2t + 2t2 = ‖X3(t)− X2(t)‖2.

Die Abstande zwischen den einzelnen Punkte fur festes t sind allerdings gleich. Der ma-ximale Abstand wird fur t = 0 und t = 1 angenommen; minimal ist der Abstand beit = 1

2 , dann ist ‖X2(t)− X1(t)‖ = ‖X3(t)− X2(t)‖ = 14

√10 ≈ 0.79.

b) Die Ergebnisse der Teilaufgabe a) deuten darauf hin, dass lineare Interpolation der Poly-gonecken nicht zum gewunschten Ergebnis fuhrt. Betrachtet man sich die beiden Keyfra-mes, dann deutet vieles darauf hin, dass der Ubergang von P1 zu P2 durch eine Drehungim Uhrzeigersinn um den Punkt ( 1

2 , 12 ) erfolgt.

Page 112: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

7 Computer-Animation 107

-

6

-

6

Abbildung 7.1: Die beiden Keyframes fur Aufgabe 1

Die Transformationsmatrix fur diese Drehung fur einen Winkel ϕ ∈ [0,−π ] ist gegebendurch

T = T(12

,12

, 0)Rz(ϕ)T(−12

,− 12 , 0)

=

cos (ϕ) − sin (ϕ) 0 − 12 cos (ϕ) + 1

2 sin (ϕ) + 12

sin (ϕ) cos (ϕ) 0 − 12 sin (ϕ)− 1

2 cos (ϕ) + 12

0 0 1 00 0 0 1

.

c) Setzt man jetzt 10 aquidistant gewahlte Winkel aus dem Intervall [0, π ] ein, dann erhaltman in b) immer Polygonzuge, bei denen die Abstande zwischen den drei beteiligtenPunkten immer konstant gleich 1 sind.

2. Schreiben Sie ein Programm, mit dessen Hilfe das simple Auto-Modell aus Abbildung 7.6 dar-stellt und uber 900 Frames animiert. Verwenden Sie dabei lineare Interpolation fur die Berech-nung der Zwischenpositionen! Verwenden Sie fur das ”Chassis“ den Polygonzug {(−0.2, 0.25),(1.85, 0.25), (1.85, 0.75), (1.4, 0.75), (1.4, 1.25), (0.25, 1.25) , (0.25, 0.75), (−0.2, 0.75)} undfur die ”Reifen Kreise mit Radius r = 0.25.

Losung:Diese Aufgabe kann mit Hilfe von OpenGL implementiert werden. Hier der display-Callbackfur die GLUT:

void display(void){

float xPos;// Lineare InterpolationxPos = linear(frame, numberOfFrames, minX, maxX);

glMatrixMode(GL_MODELVIEW);glClear(GL_COLOR_BUFFER_BIT);

glColor3f(0.0, 0.0, 0.0);// Boden ausgebenglBegin(GL_LINE_STRIP);

glVertex2f(-0.5, -0.25);glVertex2f(8.5, -0.25);

glEnd();

// Auto ausgeben mit Hilfe der Funktion drawCarglPushMatrix();

glTranslatef(xPos, 0.0, 0.0);drawCar(xPos);

glPopMatrix();}

Hier die Implementierung der linearen Interpolation und die Ausgabefunktion:

void drawCircle(float r, int n)

Page 113: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

7 Computer-Animation 108

{int i;float x;glBegin(GL_LINE_LOOP);

for (i=0; i<n-1; i++) {x = (float)i/(float)(n-1);glVertex2f(r*cos(2.0*M_PI*x),

r*sin(2.0*M_PI*x));}

glEnd();}

void drawCar(float xPos){

glColor3f(0.0, 0.0, 0.0);glBegin(GL_LINE_LOOP);

glVertex2f(-0.2, 0.25);glVertex2f(1.85, 0.25);glVertex2f(1.85, 0.75);glVertex2f(1.4, 0.75);glVertex2f(1.4, 1.25);glVertex2f(0.25, 1.25);glVertex2f(0.25, 0.75);glVertex2f(-0.2, 0.75);

glEnd();

// Hinter-Reifen ausgebenglPushMatrix();

glTranslatef(0.25, 0.0, 0.0);drawCircle(0.25, 19);

glPopMatrix();

// Vorder-Reifen ausgebenglPushMatrix();

glTranslatef(1.4, 0.0, 0.0);drawCircle(0.25, 19);

glPopMatrix();}

float linear(int frame, int numberOfFrames, float key0, float key1){

float t;t = (float)frame/(float)numberOfFrames;return (1.0-t)*key0 + t*key1;

}

Den kompletten Quelltext finden Sie unter den Downloads zu diesem Kapitel!

3. Implementieren sie eine Funktion, die es Ihnen mit Hilfe von Hermite-Polynomen erlaubt,Geschwindigkeitskurven zu definieren, und steuern Sie damit die Animation aus Aufgabe 2so, dass das Modell langsam beschleunigt, schneller wird und am Ende langsam abbremstund zum Halten kommt!

Losung:Im Quelltext finden Sie drei verschiedene Inbetweenings. In Abbildung 7.2 sehen Sie einScreen-Capture des Programms. Einmal ganz oben linear, dann ease-in-ease-out, also zweiKeyframes und zu Beginn und am Ende die Ableitung Null.

Page 114: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

7 Computer-Animation 109

Ganz unten sehen Sie ein Auto, das von einem Hermite-Spline gesteuert wird. Dabei wurdenneben den beiden Anfangs- und Endframe noch nach einem Drittel und nach zwei Drittel derWegstrecke Schlusselszenen eingefugt; und dort die Ableitung, also die Geschwindigkeit desAutos, auf Null gesetzt.

Wollen Sie dieses Verhalten andern, konnen Sie dies durch eine Anderung des Quelltextsin der Funktion display tun. Hier der Ausschnitt, in dem die Anderungen vorgenommenwerden mussen.

// Hier die Schlusselszenen.keys[0] = minX;keys[1] = (maxX - minX)/3.0;keys[2] = 2.0 * keys[1];keys[3] = maxX;

// Hier die Geschwindigkeitswertederivs[0] = 0.0;derivs[1] = 0.0;derivs[2] = 0.0;derivs[3] = 0.0;

xPos0 = nonlinear(frame, numberOfFrames, keys, derivs);xPos1 = easeineaseout(frame, numberOfFrames, minX, maxX);xPos2 = linear(frame, numberOfFrames, minX, maxX);

Den kompletten Quellcode finden Sie unter den Downloads zu diesem Kapitel!

Abbildung 7.2: Screen-Capture zu Aufgabe 3

4. Drehen Sie ein Quadrat der Seitenlange 1 in der xy-Ebene, dessen linker unterer Eckpunkt imUrsprung liegt mit Hilfe von Quaternionen!

Losung:

Page 115: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

7 Computer-Animation 110

Die Rotationsachse ist n =

001

, die z-Achse. Dann entspricht eine Drehung um ϕ = 45◦

dem Quaternion

q = (cos (45◦), 0, 0, sin (45◦)) = (12

√2, 0, 0,

12

√2).

Das konjugierte Quaternion ist dann

q′ = (12

√2, 0, 0,−1

2

√2).

Exemplarisch soll der Punkt P = (1, 1, 0) gedreht werden. Dann bilden wir diesen Punkt aufdas Quaternion p = (0, 1, 1, 0) ab; die Rotation ist dann in Quaternionen gegeben durch

Rq(p) = q · p · q′

= (12

√2, 0, 0,−1

2

√2)(0, 1, 1, 0)(

12

√2, 0, 0,−1

2

√2)

= (0, 0,√

2, 0)(12

√2, 0, 0,−1

2

√2)

= (0,−1, 1, 0).

Der rotierte Punkt kann jetzt im Imaginarteil abgelesen werden als P′ = (−1, 1, 0).

Bei den Downloads zu diesem Kapitel finden Sie eine Implementierung einer C++-KlassevlQuaternion, mit deren Hilfe Sie Ihre Ergebnisse uberprufen konnen!

5. Jedem Quaternion mit Lange 1 entspricht eine Rotationsmatrix. Beschreiben Sie eine Funkti-on, die diese Umwandlung durchfuhrt!

Losung:Gegeben sei ein Quaternion q = s + ia + jb + kc mit |q| = 1 mit s = cos (θ

2 ) und a = sin (θ2 )n1,

b = sin (θ2 )n2, c = sin (θ

2 )n3, wenn die Drehachse gegeben ist durch (n1, n2, n3)T .

Eine solche Drehung kann dargestellt werden durch

R =

tn21 + c tn1n2 − sn3 tn1n3 + sn2 0

tn1n2 + snz tn22 + c tn2n3 − sn1 0

tn1n3 − sn2 tn2n3 + sn1 tn23 + c 0

0 0 0 1

mit s = sinθ, c = cosθ und t = 1 − cosθ; diese Darstellung finden sie im Kapitel 2 auf Seite20. Die euklidische Lange der Achse ist 1, damit kann die Matrix geschrieben werden als

R =

1 − t(n22 + n2

3) tn1n2 − sn3 tn1n3 + sn2 0tn1n2 + sn3 1 − t(n2

1 + n23) tn2n3 − sn1 0

tn1n3 − sn2 tn2n3 + sn1 1 − t(n21 + n2

2) 00 0 0 1

Fur die trigonometrischen Funktionen gilt:

2 sin2 (θ

2) = 1 − cos (θ), sin (θ) = 2 sin (

θ

2) cos (

θ

2).

Dann konnen wir die folgenden Gleichungen herleiten:

2sa = n1 sin (θ), 2sb = n2 sin (θ), 2sc = n3 sin (θ),

2a2 = n21(1 − cos (θ)), 2b2 = n2

2(1 − cos (θ)), 2c2 = n23(1 − cos (θ)),

2ab = n1n2(1 − cos (θ)), 2ac = n1n3(1 − cos (θ)), 2bc = n2n3(1 − cos (θ)).

Page 116: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

7 Computer-Animation 111

Dasas Element r11 ist gegeben durch

r11 = 1 − (1 − cos (θ))(n22 + n2

3) = 1 − 2b2 − 2c2;

r12 durchr12 = − sin (θ)n3 + (1 − cos (θ))n1n2 = −2sc + 2ab;

r13 durchr13 = sin (θ)n2 + (1 − cos (θ))n1n3 = 2sb + 2ac.

Insgesamt ist die Rotationsmatrix R zum Quaternion q = s + ia + jb + kc mit |q| = 1 gegebendurch

R =

1 − 2b2 − 2c2 −2sc + 2ab 2sb + 2ac2sc + 2ab 1 − 2a2 − 2b2 −2sa + 2bc−2sb + 2ac 2sa + 2bc 1 − 2a2 − 2b2

7.3 Animation hierarchischer Objekte

1. Berechnen Sie die Koordinaten des Greifers G3 des Roboters aus Abbildung 7.39 fur a1 =2,θ2 = 10◦, a3 = 2 und den Steuerparametern θ1 = −45◦, a2 = 1,θ3 = 30◦ beziehungsweiseθ1 = 30◦, a2 = 2,θ3 = −45◦. Gehen Sie dabei davon aus, dass G0 im Ursprung des Welt-Koordinatensystems liegt. Skizzieren Sie zur Probe die Position des Roboters!

Losung:Die Greiferposition fur den ersten Satz von Parametern ist gegeben durch (4.22576,−2.1621)T .Fur den zweiten Satz von Parametern erhalt man die Greiferposition (5.25653, 2.11126)T .

Abbildung 7.3: Die Positionen in Aufgabe 1; links der erste, rechts der zweite Parametersatz

2. Berechnen Sie die Bahnflache des Greifers G3 des Roboters aus Abbildung 7.39 fur a1 =2,θ2 = 10◦, a3 = 2, falls a2 = 2 ist und die Achswinkel θ1 und θ3 jeweils zwischen −45◦

und 45◦ variieren!

Losung:Man erhalt eine ebene Flache, da alle Gelenke des Roboters in einer Ebene liegen. In Abbil-dung 7.4 zeigt den Erreichbarkeitsbereich fur die Winkel θ1,θ3 ∈ [−45◦, 45◦]. Eine Naherungerhalt man durch Variieriung beiden Winkel, in der Abbildung mit 1◦ Schritten.

3. Beschreiben Sie den Roboter auf Seite 77 mit Denavit-Hartenberg-Parametern!

Losung:Wenn man diesmal die Kette von der Bodenplatte des Beins aufbaut, erhalt man fur das Beindas erste Gelenk mit einem Langenparameter a1 und dem Rotationswinkel θ1.

Als zweites Gelenk folgt jetzt der Kopf. Dabei ist in a2, dem Achsabstand auch die Torsogroßezu berucksichtigen. Sie ist auf jeden Fall fest. Variabel ist der Kopfwinkel θ2. Jetzt folgen nochzwei Drehgelenke fur die beiden Schultern, und noch zwei Schiebegelenke fur die beidenDaumen.

Page 117: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

7 Computer-Animation 112

2.5 3.5 4 4.5 5 5.5

-4

-2

2

4

Abbildung 7.4: Der Erreichbarkeitsraum zu Aufgabe 2

4. Die Pseudo-Inverse der Jacobi-Matrix fur das Beispiel der inversen Kinematik in Abbildung7.48 ist gegeben als

J+ =

0.320066 0.382848−0.374437 −0.179934−0.491589 −0.320066

.

Bestimmen Sie die Korrektur fur verschiedene selbstgewahlte Zielpunkte; bestimmen Sie furdie Analyse der Ergebnisse den Tracking-Fehler und den euklidischen Abstand zwischenZielpunkt und neuer Endeffektor-Position!

Losung:Die Lage des Endeffektors in der Ausgangslage war (vgl. Seite 463) gegeben durch 3 +

√3, 1 +√

3) = (4.73205, 2.73205).

Fur den Zielpunkt (4.7, 2.6) erhalt man den Korrektorvektor

(∆θ1, ∆θ2, ∆θ3) = (−0.0010614, 0.000624155, 0.00101265)

und die Endeffektor-Position (4.69522, 2.59882). Daraus ergibt sich ein Tracking-Fehler von5.55 · 10−17), das kann als Null angesehen werden, und als euklidischen Abstand zwischenZiel und Endeffektor- Position von 0.153959.

Fur den Zielpunkt (4.75, 2.7) erhalt man den Korrektorvektor

(∆θ1, ∆θ2, ∆θ3) = (−0.000113894,−0.000016647, 0.0000250411)

und die Endeffektor-Position (4.74989, 2.69994). Daraus ergibt sich ein Tracking-Fehler von3.47 · 10−18), das kann als Null angesehen werden, und als euklidischen Abstand zwischenZiel und Endeffektor- Position von 3.8 · 10−3.

7.4 Prozedurale Animationstechniken

1. Berechnen Sie den Pfad eines Partikels, das sich zum Zeitpunkt t = 0 im Ursprung befindetund den Geschwindigkeitsvektor v(0) = (1, 1, 1)T hat. In der Szene liegen drei stationareEbenen, die durch x + z = 0, x = 1 und x = −1 gegeben sind. Bei der Bewegung soll die

Page 118: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

7 Computer-Animation 113

Erdbeschleunigung g = (0, 0,−9.8)T berucksichtigt werden!

Losung:In Abbildung 7.5 sehen Sie das Ergebnis der Berechnung mit einer Schrittweite von ∆t = 0.4fur t ∈ [0; 1]. Es treten nur Kollissionen mit den Ebenen x + z = 1 und x = 1 auf. Fur alle Ebe-nen wurde α = 0.5 verwendet. Die Darstellung zeigt nur die xz-Ebene, denn die Kollissionenerzeugen nur Krafte in dieser Ebene.

-6

x = 1

x + z = 1

Abbildung 7.5: Der Pfad des Partikels fur Aufgabe 1

2. Schreiben Sie ein Programm, das fur das Partikel aus Abbildung 7.53 mit Ausgangspositionim Ursprung, Ausgangsgeschwindigkeit (1, 1)T die Bahn unter dem Einfluss der Gravitationund einer Reibung berechnet und mit OpenGL ausgibt! Variieren Sie die Ausgangsgeschwin-digkeit, die Gravitation und die Reibungskonstante, und beobachten Sie die Resultate!

Losung:In Abbildung 7.6 sehen Sie die Ausgabe des Programms. Von links nach rechts und von obennach unten wurden die Werte kr = 0, 1, 5 und kr = 10 verwendet. Die Quellen finden Sieunten den Quellcodes zu diesem Kapitel.

Hier ein Auszug aus den Quellen; die Ausgabe wird auf dem Feld points abgelegt, das ininit entsprechend der gewunschten Anzahl der Integrationsschritte dimensioniert wird.

void euler(double x0[2], double v0[2], double deltat, int steps, double kr,double **points)

{int i;double g = -9.8;

Page 119: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

7 Computer-Animation 114

Abbildung 7.6: Die Abbildungen zu Aufgabe 2

double v[2], a[2]; // Die Geschwindigkeit und Beschleunigung

points[0][0] = x0[0]; points[0][1] = x0[1];

v[0] = v0[0];v[1] = v0[1];

for (i=1; i<= steps; i++) {a[0] = -kr*v[0];a[1] = g - kr*v[1];points[i][0] = points[i-1][0] + v[0]*deltat + 0.5*a[0]*deltat*deltat;points[i][1] = points[i-1][1] + v[1]*deltat + 0.5*a[1]*deltat*deltat;v[0] += deltat*a[0];v[1] += deltat*a[1];

}}

Page 120: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

7 Computer-Animation 115

7.6 Fallstudien

7.6.1 Key-Framing und Pfad-Animation in Alias MAYA

1. Modellieren und animieren Sie in der Alias MAYA Personal Learning Edition einen Ball, derwie im Text beschrieben von einer Stufe fallt.

a) Stellen Sie dabei das Verhalten des Balls so ein, dass er scheinbar aus einem weichen,elastischen Material besteht. Verwenden Sie dafur den Graph View von Alias MAYA.

b) Verandern Sie das Material des Balls, so dass er sich wie eine Kegelkugel verhalt!

Losung:Die Maya-Datei finden Sie bei den Downloads zu diesem Kapitel.

2. Modellieren Sie einen Quader, der sich in 60 Frames von x = −10 nach x = 10 bewegt. Er-zeugen Sie Key-Frames fur die Frames 0, 30 und 60. Verandern Sie den Funktionsverlauf imGraph View so, dass ein Slow-In-Slow-Out-Verhalten erzeugt wird!

Losung:Die Maya-Datei finden Sie bei den Downloads zu diesem Kapitel.

3. Modellieren Sie ein kleines Kinderspielzeug oder verwenden Sie eines der Modelle, die inder Personal Learning Edition zur Verfugung stehen. Erstellen Sie eine NURBS-Kurve, diedie Form einer Acht annimmt, und verbinden Sie das Objekt mit dem Pfad.

a) Die Geschwindigkeit des Objekts soll vor den Kurven abnehmen und zum Ausgang derKurven wieder zunehmen. Stellen Sie dieses Verhalten mit Hilfe des Graph View ein!

b) Verandern Sie das Verhalten des Objekts aus Aufgabe a) so, dass in der Animation einigeder Grundprinzipien der Animation enthalten sind!

Losung:

a) Die Maya-Datei finden Sie bei den Downloads zu diesem Kapitel.b) Die Maya-Datei finden Sie bei den Downloads zu diesem Kapitel.

Anticipation ist moglich durch entsprechende Verformungen des Objekts ”vor dem Start“;Ubertreibung durch ein entsprechendes Verformen oder ubertriebenes Kurvenverhalten(beispielsweise auf zwei Radern zu fahren). Wichtig ist auch, dass die einzelnen Aktionenuberlappen!

7.6.2 Expressions in Alias MAYA

1. Bewegen Sie ein einfaches Objekt mit Hilfe der Funktionen linstep, smoothstep und hermite!

Losung:Bei den Downloads zu diesem Kapitel finden Sie eine entsprechende MAYA PLE-Datei!

2. Erstellen Sie zehn Kugeln in Alias MAYA, die in einer Reihe entlang der x-Achse angeordnetsind. Animieren Sie die Position der Kugeln durch eine Expression. Dabei sollen die Kugelnsukzessive nach oben wegfliegen. Die Animation soll im Frame 10 starten. Die nachste Kugelsoll sich dann anfangen zu bewegen, wenn der Vorganger eine Hohe erreicht hat, die demFunffachen ihres Radius entspricht. Die Kugeln sollen in einer Hohe, die dem Zehnfachenihres Radius entspricht, ”verschwinden“.

Losung:Bei den Downloads zu diesem Kapitel finden Sie eine entsprechende MAYA PLE-Datei!

Page 121: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

7 Computer-Animation 116

3. Erstellen Sie eine Szene mit einem autoahnlichen Objekt, und animieren Sie die Translationdurch eine Expression. Koppeln Sie die Rotation der Rader an diese Rotation mit Hilfe einerExpression!

Losung:Bei den Downloads zu diesem Kapitel finden Sie eine entsprechende MAYA PLE-Datei!

4. Erstellen Sie eine Szene, die einen Arm modelliert, wie auf Seite 450 beschrieben. Das Skelettkonnen Sie entweder mit Hilfe eines Polygonzugs erstellen; moglich ist auch die Verwendungvon Sceleton|Joint Tool. Erstellen Sie Expressions, die die Kontrollpunkte des Lattice mit denKoordinaten des Skeletts koppelt. Beobachten Sie fur das Modellieren Ihren eigenen Oberarm!

Losung:Bei den Downloads zu diesem Kapitel finden Sie eine entsprechende MAYA PLE-Datei!

7.6.3 Partikelsysteme in Alias MAYA

1. Erstellen Sie ein einfaches Partikelsystem und experimentieren Sie mit den verschiedenenVektorfeldern in der Alias MAYA PLE!

Losung:Bei den Downloads zu diesem Kapitel finden Sie eine entsprechende MAYA PLE-Datei!

2. Mit Hilfe des Attributs position und positionPP konnen Sie die Position der Partikel in einerExpression kontrollieren. Erstellen Sie Expressions, die die Abbildungen 7.54 und 7.55 nach-empfinden!

Losung:Bei den Downloads zu diesem Kapitel finden Sie eine entsprechende MAYA PLE-Datei!

3. Modellieren Sie mit Hilfe von Kollisionsobjekten und Vektorfeldern in der Alias MAYA PLEeine rotationssymmetrische Staupunktstromung wie in Abbildung 7.56!

Losung:Bei den Downloads zu diesem Kapitel finden Sie eine entsprechende MAYA PLE-Datei!

Page 122: Aufgaben und Losungen¤ · 1. Drucken¤ Sie die auf Seite 42 erlauterte¤ Window-Viewport-Transformation, die dreidimensio-nale Bildkoordinaten in zweidimensionale (kontinuierliche)

Literaturverzeichnis

[BB06] BENDER, MICHAEL und BRILL, MANFRED: Computergrafik – Ein anwendungsorientiertes Lehrbuch.2. Auflage, Hanser, 2006.

[WND00] WOO, MASON; NEIDER, JACKIE und DAVIS, TOM: OpenGL Programming Guide (2nd Ed.) – TheOfficial Guide to Learning OpenGL. Addison-Wesley, 2000.