Document

Werbung
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
Aufgabe
Modellieren Sie mittels Bézier-Kurven einen Kreis.
Hinweis: Beginnen Sie mit einem Viertelkreis
Modellieren Sie anschließend eine Kugel aus Bézier-Patches
Visualisierung mit C++ / OpenGL - SS 2005
§2-1
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Rationale Kurven
Rationale Bézier-Kurven
Mit polynomialen Segmenten lassen sich Kegelschnitte, wie z.B.
Kreise und Ellipsen, nicht exakt darstellen. Um dies zu
ermöglichen, betrachten wir Bézier-Kurven in projektiven Räumen
unter Verwendung von homogenen Koordinaten. Als Gewichte der
Kontrollpunkte bi führen wir die Größen wi ein.
Somit erhalten wir die Darstellung für rationale Bézier-Kurven.
Letztere sind gebrochen-rationale Funktionen, d.h. Zähler und
Nenner sind Polynome. Mit dieser Technik wird es möglich,
Kegelschnitte exakt darzustellen.
Visualisierung mit C++ / OpenGL - SS 2005
§2-2
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Rationale Kurven
Wir erhalten folgende rationale Bézier-Kurvendarstellung:
n
X (t ) 
n
w
b
B
 i i i (t )
i 0
n
n
w
B
 i i (t )

n
~n
b
B
 i i (t ),
i 0
i 0
wi Bin (t )
~n
Bi (t )  n
n
w
B
 j j (t )
j 0
Visualisierung mit C++ / OpenGL - SS 2005
§2-3
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Rationale Kurven
10
10
1
10
1
10
1
1
1
1
1
Einfluss unterschiedlicher
Punktgewichte
1
Visualisierung mit C++ / OpenGL - SS 2005
§2-4
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Rationale Kurven
Beispiel:
Darstellung eines Viertelkreises
b0 = (0,1)
w0 = 1
b1 = (1,1)
w1 = 0.5
b2 = (1,0)
w2 = 1
Visualisierung mit C++ / OpenGL - SS 2005
§2-5
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Splinekurven
Bei der Interpolation mit Polynomen treten insbesondere bei hohen
Polynomgraden starke Oszillationen auf. Um diese Oszillationen
einzudämmen, setzt man Kurven aus mehreren Segmenten von
niedrigem Polynomgrad zusammen. Von den einzelnen
Teilpolynomen verlangt man, dass sie sich in den Nahtstellen (die
hier mit den Stützstellen
übereinstimmen) „glatt“ aneinanderfügen.
Visualisierung mit C++ / OpenGL - SS 2005
§2-6
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Splinekurven
Definition: Ck-Stetigkeit
Eine Funktion f(t) ist Ck-stetig (k  0), wenn die Funktion und ihre k
Ableitungen stetig sind. Ck [t0 ,tn] ist die Klasse der Ck-stetigen
Funktionen auf dem Intervall [t0 ,tn].
Definition: Spline
= {t0, t1, L , tn} sei ein monotoner (Knoten-)Vektor mit reellen
Stützstellen ti< ti+1. Eine Funktion S heißt Spline vom Grad k-1 (von
der Ordnung k), wenn gilt:
(1) S ist ein Polynom vom Grad k-1 in jedem Teilintervall [ti, ti+1]
(2) S ist Ck-2-stetig auf [t0, tn].
Visualisierung mit C++ / OpenGL - SS 2005
§2-7
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Splinekurven
Bemerkungen:
1. Der Spline S wird als interpolierender Spline bezeichnet, wenn
für gegebene Interpolationspunkte (Ordinaten).
2. Der interpolierende Spline ist i.a. nicht eindeutig bestimmt. Er
hat noch k-2 Freiheitsgrade, d.h. eine Vorgabe von Randbedingungen ist nötig.
Für kubische Spines (k=4) wählt man oft die natürlichen
Randbedingungen S´´(t0) = 0 und S´´(tn) = 0.
Identifiziert man die Knoten t0 und tn miteinander, so entsteht ein
geschlossener Spline (ohne Randbedingungen).
Visualisierung mit C++ / OpenGL - SS 2005
§2-8
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Splinekurven
Kubische Splines
Statt die Form der interpolierenden Funktion vorzuschreiben, z.B.
als Polynom eines bestimmten Höchstgrades, kann man auch
Eigenschaften vorschreiben, wie z.B. einen möglichst „glatten“
Verlauf.
Fordern wir
[1]
tn

g t  dt
2
minimal
t0
unter den Nebenbedingungen
[2]
g(t j )  p j ( j  0,L,n) , g ' (t 0 )  p'0
und g ' (t n )  p'n
so ergibt sich folgendes Resultat:
Visualisierung mit C++ / OpenGL - SS 2005
§2-9
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Splinekurven
Satz: minimum-norm property
Unter allen Funktionen g  C 2 [t 0 , t n ]
, die die Bedingung [2]
erfüllen, erteilt die interpolierende kubische Splinefunktion S dem
Integral [1] den kleinsten Wert.
Es gibt verschiedene Möglichkeiten, die beiden Freiheitsgrade der
Spline-Funktionen zu nutzen. Hier werden die beiden am häufigsten verwendeten Fälle behandelt.
S (t0 )  0 und S (tn )  0  natürlicher Spline
S (t0 )  S (tn ); S (t0 )  S (tn ); S (t0 )  S (tn )  periodischer Spline
Visualisierung mit C++ / OpenGL - SS 2005
§2-10
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Splinekurven
Um den Weg zu Algorithmen für Splinekurven aufzuzeigen,
berechnen wir hier zunächst einmal die Koeffizienten ai , bi , ci , di eines
natürlichen kubischen Splines:
S(t)  Si(t)  ai  bi(t  ti )  ci(t  ti )2  d i(t  ti )3
für t  ti , ti 1 ; i  0,..., n  1
Dies führt auf folgende Bedingungen für die Polynome Si:
Si(ti )  pi i  0,..., n
Si(ti )  Si 1(ti )


Si'(t i )  S'i 1(ti )  i  1,L ,n  1
Si''(t i )  S'' i 1(ti ) 

Visualisierung mit C++ / OpenGL - SS 2005
§2-11
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Splinekurven
Dies hat folgende Auswirkungen auf die Koeffizienten:
ai  pi
i  0,..., n
ai  ai 1  bi 1  ti  ti 1   ci 1  ti  ti 1   di 1  ti  ti 1  , i  1,..., n
2
3
bi  bi 1  2ci 1  (ti  ti 1 )  3d i 1  (ti  ti 1 )2
i  1,..., n  1
2ci  2ci 1  6di 1  (ti  ti 1 )
i  1,..., n  1
Visualisierung mit C++ / OpenGL - SS 2005
§2-12
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Splinekurven
Wir setzen
i:=ti+1-ti und erhalten nach einigen Umformungen:
ci 1(i 1 )  ci( 2  (i 1  i ))  ci 1(i )
3
3
  (ai 1  ai ) 
 (ai  ai 1 )
Δi
Δi 1
1
di 
 (ci 1  ci )
3 i
bi 
i  1,..., n  1
i  0,..., n  1

1
 (ai 1  ai )  i  (ci 1  2ci )
i
3
i  0,..., n  1
Visualisierung mit C++ / OpenGL - SS 2005
§2-13
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Splinekurven
ai  pi
gilt, die ai also bekannt sind, ist im Wesentlichen ein
lineares Gleichungssystem mit n-1 Gleichungen und bislang n+1
Unbekannten ci (i=0,...,n) zu lösen.
Da
Für einen natürlichen kubischen Spline gilt S (t0 )  S (tn )  0 ,
was c0=cn=0 bedeutet.
Fassen wir nun die Erkenntnisse zu einem Algorithmus zusammen:
Visualisierung mit C++ / OpenGL - SS 2005
§2-14
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Splinekurven
Algorithmus für natürliche kubische Splines
Gegeben seien n+1 Stützstellen ti mit t0 < t1 < ... < tn
und die Funktionswerte (bzw. Interpolationspunkte)
p0 ,..., pn.
Gesucht ist der zugehörige natürliche kubische Spline S in
der Darstellung
[3]
Si(t)  ai  bi  (t  ti )  ci  (t  ti )2  d i  (t  ti )3
für t  ti , ti 1  und i  0,..., n  1
Berechnung der Koeffizienten ai , bi , ci , di :
ai  pi
i  0,..., n
c0  cn  0
Visualisierung mit C++ / OpenGL - SS 2005
§2-15
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Splinekurven
[4]
ci-1  (i-1 )  ci  ( 2 i-1  2 i )  ci 1( i )

3
3
 (ai 1  ai ) 
 (ai  ai 1 )
i
 i 1
 i  ti 1  ti
i  1,..., n  1
(Gleichungssystem für ci )
[5]
i
1
bi  (ai 1  ai )  (ci 1  2ci )
i
3
[6]
di 
1
(ci 1  ci )
3 i
i  0,..., n  1
i  0,..., n  1
Bemerkungen:
1. Die Gleichungen [4] lauten in Matrizenschreibweise
Ac  b
Visualisierung mit C++ / OpenGL - SS 2005
§2-16
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Splinekurven
mit
1
0
2   0  1 

1
2  ( 1   2 )  2

A: 
0
2
.


.
.
0

 c1 
 . 
 
c :  . 
 
 . 
cn 1 
.
.
.
 n 2


0

 n 2

2( n 2   n 1 )
.
 a2  a1 a1  a0 



1
0


.



b : 3 
.


.


a

a
a

a
 n
n 1
 n 1 n  2 
  n 1
 n  2 
Visualisierung mit C++ / OpenGL - SS 2005
§2-17
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Splinekurven
2. Die Matrix A ist tridiagonal, symmetrisch, diagonal-dominant,
positiv definit und besitzt nur positive Elemente. A ist damit
regulär und das lineare Gleichungssystem hat eine eindeutige Lösung. Als Lösungsverfahren sollte man die direkte
LU-Zerlegung für tridiagonale Matrizen verwenden, da der
Algorithmus Komplexität O(n) hat.
Im Fall periodischer Splines entfallen die Randbedingungen und
es ergibt sich ein analoger Algorithmus.
Visualisierung mit C++ / OpenGL - SS 2005
§2-18
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Splinekurven
Algorithmus für periodische kubische Splines
Identifiziert man die Stützstellen t0 und tn miteinander, d.h., p0 = pn ,
die Interpolationskurve ist geschlossen und besitzt auch bei t0 (bzw.
tn) einen C2-stetigen Übergang, so ändert sich an dem o.g.
Algorithmus nur die Matrix A des Systems [4]:
1

2   0  1 

1
2  (1   2 )  2

A

0



0
0


0


 n 1
0
0




 n 1

2( n 1   0 )
Visualisierung mit C++ / OpenGL - SS 2005
§2-19
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Splinekurven
Diese Matrix A ist zyklisch tridiagonal, symmetrisch, diagonaldominant, positiv definit und besitzt nur positive Elemente; d.h. A ist
gut konditioniert. Das System kann wiederum in 0(n) gelöst werden.
Visualisierung mit C++ / OpenGL - SS 2005
§2-20
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Splinekurven
Da die Aufgabe der Splines in CAD im Wesentlichen in der
Modellierung ebener oder räumlicher Kurven besteht, benötigen wir
im
folgenden
den
Begriff
des
vektorwertigen
oder
parametrischen Splines.
Definition : Ist :  t0 , ..., t n  , a  t0  t1  ...  t n  b eine
Zerlegung des Intervalls a, b  IR; so heißt eine Abbildung
X : a, b  IR 3 parametrischer Spline vom Grad k-1 (Ordnung k),
wenn die Komponentenfunktionen Splines vom Grad k-1 sind.
Insbesondere gilt für die „Komponenten-Splines“ xi :
xi  C k  2 [a, b] (i  1,2,3) , wofür wir im folgenden kurz
X  C k 2 [a, b] schreiben.
Visualisierung mit C++ / OpenGL - SS 2005
§2-21
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Splinekurven
Lokale Glattheitseigenschaften räumlicher Kurven, die durch
Aneinanderhaftung von Teilkurven entstehen, belegt man
üblicherweise mit folgender Begriffsbildung:
X : t0 , t1   IR 3 und Y : s0 , s1   IR 3
parametrische Kurven mit X  C m [t0 , t1 ] und Y  C n [ s0 , s1 ]
und haben den gemeinsamen Punkt X(t1)=Y(s0), so sprechen wir
genau dann von einem Ck-Übergang der Kurven in ihrem
Definition: Sind
gemeinsamen Punkt, wenn gilt:
dr
dr
X (t1 )  r Y ( s0 )
r
dt
ds
für alle r mit 1  r  k.
(Unstetigkeiten werden als C-1-stetig bezeichnet.)
Visualisierung mit C++ / OpenGL - SS 2005
§2-22
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Splinekurven
Algorithmus für parametrische kubische Splines
Gegeben seien von einer Raumkurve die Interpolationspunkte
pi : xi , yi , zi  i  0,..., n.
Gesucht ist ein interpolierender parametrischer kubischer Spline.
1. Schritt: Parametrisierung: Festlegung der Parameterwerte
ti (i = 0,...,n) zu den Interpolationspunkten
2. Schritt: Festlegung der Randbedingungen
3. Schritt: Berechnung der Spline Komponenten Sx,Sy,Sz so dass
Sx(ti)=xi, Sy(ti)=yi, Sz(ti)=zi, (i=0,...,n) mit Hilfe des
jeweiligen Spline-Algorithmus,
Visualisierung mit C++ / OpenGL - SS 2005
§2-23
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Splinekurven
S x (t )  S xi (t )  a xi  bxi (t  ti )  cxi (t  ti ) 2  d xi (t  ti )3
S y (t )  S yi (t )  a yi  byi (t  ti )  c yi (t  ti ) 2  d yi (t  ti )3
S z (t )  S zi (t )  a zi  bzi (t  ti )  czi (t  ti ) 2  d zi (t  ti )3
t  ti , ti 1  , i  0,..., n  1
Bemerkung:
Bei geschlossenen Kurven eignen sich periodische Splines, sofern
die Kurve überall „glatt“ ist. Liegen eine oder mehrere „Spitzen“ vor
(C0-Übergängen, z.B. beim Querschnitt einer Tragfläche), dann
eignen sich natürliche Splines mit den Spitzen als Anfangs- und
Endpunkten.
Visualisierung mit C++ / OpenGL - SS 2005
§2-24
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Splinekurven
Parametrisierungen
Die Parameterwahl bestimmt sehr stark das Aussehen und damit
auch die Qualität der Kurven (und Flächen).
Gleiche Interpolationsaufgabe mit unterschiedlichen Parametrisierungen
Visualisierung mit C++ / OpenGL - SS 2005
§2-25
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Splinekurven
Parametrisierungen
Die Wirkung der Parameterwahl kann durch folgende kinematische
Interpretation visualisiert werden: Der Kurvenparameter t wird als
Zeitparameter aufgefasst, der angibt, wie lange ein Punkt X
benötigt, um die Kurve X(t) zu durchlaufen.
Wir betrachten zunächst die Interpolation einer Punktmenge durch
eine Kurve; d.h. wir legen ein Parameterintervall [a,b] zugrunde
und interpolieren n+1 Punkte.
Visualisierung mit C++ / OpenGL - SS 2005
§2-26
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Splinekurven
Äquidistante Parametrisierung
Bei der äquidistanten Parametrisierung steht nun für jedes zu
interpolierende Punktepaar (Pi,Pi+1) die gleiche Durchlaufzeit zur
Verfügung.
ba
t 
;
n
ti  a  i  t ; i  0 ,...,n
Sind die Abstände zwischen den Punkten sehr unterschiedlich, so
muss der Kernpunkt X die Interpolationskurve mit unterschiedlicher
Geschwindigkeit durchlaufen. Folgt einem großen Abstand ein
kleiner Abstand, so muss die größere Geschwindigkeit stark
„abgebremst“ werden, was zu einem „Überschwingen“ der
Interpolationskurve führen kann.
Visualisierung mit C++ / OpenGL - SS 2005
§2-27
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Splinekurven
Chordale Parametrisierung
Die Parametrisierung sollte der „Struktur der Punktmenge“ in
gewissem Sinne angepasst werden. Einen solchen Zugang liefert
die chordale Parametrisierung,
ti  ti  ti 1 :
Pi  Pi 1
s
.
Die Parameterintervalle werden proportional zu den Abständen
benachbarter Stütz- bzw. Interpolationspunkte gewählt mit s als
Normierungsfaktor (z.B. s = Gesamtlänge des von den Pi
erzeugten Polygons).
Visualisierung mit C++ / OpenGL - SS 2005
§2-28
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Splinekurven
Zentripetale Parametrisierung
Eine weitere Möglichkeit der Parameterwahl, welche die Struktur
der Daten nachbildet, ist die so genannte zentripetale Parametrisierung [Lee 1975]:
ti :
Pi  Pi 1
s
Hier wird die zentripetale Beschleunigung näherungsweise
minimiert. Sinnvoll sind auch Kombinationen dieser drei Typen.
Eine Parametrisierung, die nicht nur Abstände, sondern auch noch
Winkeländerungen in den Interpolationspunkten berücksichtigt,
wurde von T. Foley entwickelt (siehe [Foley 1989]).
Visualisierung mit C++ / OpenGL - SS 2005
§2-29
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Splinekurven
Visualisierung mit C++ / OpenGL - SS 2005
§2-30
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – B-Splines
Basis Splines
Bei der Konstruktion von Splines haben wir bisher polynomiale
Basisfunktionen (z.B. Bernsteinpolynome) für die Darstellung der
einzelnen Segmente betrachtet. Dies führt zur Konstruktion von
Übergangsbedingungen an den Segmenttrennstellen.
Ein eleganterer Ansatz zur Konstruktion von Splinekurven besteht
darin, Ck-2-stetige Basisfunktionen aus mehreren Segmenten der
Ordnung k zu konstruieren. Bei Verwendung dieser Basis Splines
(B-Splines) entfallen die Übergangsbedingungen und es werden
zudem weniger Kontrollpunkte (Koeffizienten) benötigt.
Visualisierung mit C++ / OpenGL - SS 2005
§2-31
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – B-Splines
Beispiel: Quadratische B-Splinekurve mit Kontrollpunkten d0...d5.
d2
d1
d3
d0
d5
t0=t1= t2
2
t3
d4
t4
3
t5
4
t6= t7= t 8
5
Visualisierung mit C++ / OpenGL - SS 2005
§2-32
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – B-Splines
Eine offene B-Splinekurve der Ordnung k (vom Grad k-1) ist
gegeben durch
m+1 Kontrollpunkte d0,...,dm (de Boor-Punkte) und
m+k+1 Knoten x0x1 ... .xm+k (Knotenvektor).
Das Definitionsgebiet der B-Spline Kurve ist das Intervall
[xk-1, xm+1], welches m-k+2 Segmente enthält. Die übrigen Knoten
bestimmen das Verhalten der Kurve an den Rändern.
Für das erste Splinesegment benötigt man k de Boor-Punkte, für
jedes weitere Segment nur einen zusätzlichen de Boor-Punkt.
Visualisierung mit C++ / OpenGL - SS 2005
§2-33
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – B-Splines
de Boor-Algorithmus
Analog zum de Casteljau-Algorithmus für Bézier-Kurven ermöglicht
der de Boor-Algorithmus die effiziente Auswertung von
B-Splinekurven (ohne die einzelnen Segmente herzuleiten).
Zu gegebenem Parameter t bestimmt man zunächst den Index r,
so dass t  [xr
, xr+1).
Der zugehörige Punkt f ( t ) der Splinekurve wird dann aus den
de Boor-Punkten dr-k+1,...,dr wie folgt ermittelt:
Visualisierung mit C++ / OpenGL - SS 2005
§2-34
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – B-Splines
De Boor-Algorithmus
Für t  [xr
d i0  d i
, xr+1)
berechnet sich die B-Splinekurve aus
(i  r  k  1,..., r )
d i j  (1   i j )d i j 11   i j d i j 1
f (t )  d rk 1
mit
t  xi
i 
xi  k  j  xi
j
(i  r  k  j  1,..., r; j  1,.., k  1)
d r0 k 1
d r0 k  2

d r0
d r1 k  2


d r1
L d rk 1  f (t )
Schema des de Boor-Algorithmus
Visualisierung mit C++ / OpenGL - SS 2005
§2-35
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – B-Splines
De Boor-Algorithmus
1. Beispiel: k=4, m=4
d1
d2
d3
d0
...
dm
x0
x1
xk-1
xm+1
xm+k
m-k+2 = 2 polynomiale Segmente
Visualisierung mit C++ / OpenGL - SS 2005
§2-36
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – B-Splines
De Boor-Algorithmus
1
d2
d1
1. Beispiel: k=4, m=4
d2
d13
d3
d0
x0
d14
t  [x4 , x5)  r=4
x1
xk-1
12
13
dm
t xm+1
xm+k
14
Visualisierung mit C++ / OpenGL - SS 2005
§2-37
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – B-Splines
De Boor-Algorithmus
1
d2
d1
1. Beispiel: k=4, m=4
d2
d23 d13
2
d4
d3
d14
d0
dm
x0
x1
xk-1
23
t xm+1
xm+k
24
Visualisierung mit C++ / OpenGL - SS 2005
§2-38
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – B-Splines
De Boor-Algorithmus
1. Beispiel: k=4, m=4
1
d2
d1
d2
d23 d13
3
f(t)=d4
2
d4
d3
d14
d0
dm
x0
x1
xk-1
t xm+1
xm+k
34
Visualisierung mit C++ / OpenGL - SS 2005
§2-39
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – B-Splines
dr-3
dr-2
2. Beispiel (k=5):
d i1
dr-4
(i  r  3,..., r )
dr
dr-1
...
xr t xr+1
r-3
r-2
r-1
r
r+1 r+2 r+3
Visualisierung mit C++ / OpenGL - SS 2005
§2-40
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – B-Splines
dr-3
dr-2
2. Beispiel (k=5):
d i2
dr-4
(i  r  2,..., r )
dr
dr-1
...
xr t xr+1
r-3
r-2
r-1
r
r+1 r+2 r+3
Visualisierung mit C++ / OpenGL - SS 2005
§2-41
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – B-Splines
dr-3
dr-2
2. Beispiel (k=5):
d i3
dr-4
(i  r  1, r )
dr
dr-1
...
xr t xr+1
r-3
r-2
r-1
r
r+1 r+2 r+3
Visualisierung mit C++ / OpenGL - SS 2005
§2-42
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – B-Splines
dr-3
dr-2
2. Beispiel (k=5):
d r4  f (t )
dr-4
dr
dr-1
...
xr t xr+1
r-3
r-2
r-1
r
r+1 r+2 r+3
Visualisierung mit C++ / OpenGL - SS 2005
§2-43
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – B-Splines
dr-3
dr-2
3. Beispiel (k=5):
Auswerten an einem
Knoten
d i1
dr-4
(i  r  3,..., r )
dr
t=xr
r-3
r-2
r-1
dr-1
...
xr+1
r
r+1 r+2 r+3
Visualisierung mit C++ / OpenGL - SS 2005
§2-44
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – B-Splines
dr-3
dr-2
3. Beispiel (k=5):
Auswerten an einem
Knoten
d i2
dr-4
(i  r  2,..., r )
dr
t=xr
r-3
r-2
r-1
dr-1
...
xr+1
r
r+1 r+2 r+3
Visualisierung mit C++ / OpenGL - SS 2005
§2-45
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – B-Splines
dr-3
dr-2
3. Beispiel (k=5):
Auswerten an einem
Knoten
d r31  d r4  f (t )
dr-4
d r3
dr
t=xr
r-3
r-2
r-1
dr-1
...
xr+1
r
r+1 r+2 r+3
Visualisierung mit C++ / OpenGL - SS 2005
§2-46
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – B-Splines
B-Splines
Aus dem de Boor-Algorithmus ergeben sich die Basisfunktionen
Ni,k(t) (B-Splines) zu den einzelnen de Boor-Punkten di (analog zu
den Bernstein-Polynomen für Bézier-Kurven).
[1]
Rekursionsformel von de Boor und Cox
  xi iIN
sei eine nichtfallende Folge von Knoten.
0
1
Ni ,1 (t ) : 
0
xi  t  xi 1
sonst
 t  xi 
 xi  k  t 
  Ni ,k 1 (t )  
  Ni 1,k 1 (t )
Ni ,k (t ) : 
 xi  k 1  xi 
 xi  k  xi 1 
Visualisierung mit C++ / OpenGL - SS 2005
§2-47
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – B-Splines
Beispiel 1:
 = {0,1,2,3,4}, k=1,...,3
1 t  [0,1)
N 0,1  
0 sonst
1 t  [1,2)
N1,1  
0 sonst
1 t  [2,3)
N 2,1  
0 sonst
1 t  [3,4)
N 3,1  
0 sonst
N 0, 2
[0,1)
t

 2 - t [1,2)
0
sonst

N1, 2
t  1

 3 - t
0

[1,2)
[2,3)
sonst
N 2, 2
t  2

 4 - t
0

[2,3)
[3,4)
sonst
Visualisierung mit C++ / OpenGL - SS 2005
§2-48
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – B-Splines
N 0,3
t 2
[0,1)

2
 2 - t   t  3 - t   t - 1 [1,2)


2
 3 - t 2

[2,3)
 2
0
[3,4)
N1,3
[0,1)
0

2


t

1

[1,2)
 2

  3 - t   t - 1  4 - t   t - 2 
[2,3)

2

2
 4 - t 
[3,4)
 2
Visualisierung mit C++ / OpenGL - SS 2005
§2-49
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – B-Splines
Beispiel 2:
 ={0,0,0,1,2,3,4,4,4}, k=1,...,3
N 0,1  N1,1  0
1 t  [0,1)
N 2,1  
0 sonst
1 t  [1,2)
N 3,1  
0 sonst
1 t  [2,3)
N 4,1  
0 sonst
1 t  [3,4)
N 5,1  
0 sonst
N 6,1  N 7 ,1  0
Visualisierung mit C++ / OpenGL - SS 2005
§2-50
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – B-Splines
N 0, 2  0
N 4 ,2
N 0,3
N1,2
t-2

 4-t
0

1  t 2

0
1  t [0,1)

0 sonst
[2,3)
[3,4)
sonst
[0,1)
sonst
N 5, 2
N 2 ,2
t  3

0
N1,3
t

 2-t
0

[0,1)
[1,2)
sonst
[3,4)
sonst
t  ( 2-t)

t  ( 1-t)  2

2
( 2-t)

 2
0


N 3,2
t-1 [1,2)

 3-t [2,3)
0 sonst

N 6, 2  0
[0,1)
[1,2)
sonst
Visualisierung mit C++ / OpenGL - SS 2005
§2-51
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – B-Splines
N 2 ,3
t 2
[0,1)

2
 t  ( 2  t )  ( 3  t)  (t  1 ) [1,2)


2
( 3-t)2

[2,3)
 2
 0
sonst
N 4 ,3

sonst
0

(t-2 )2

[2,3)
2

 3
- 2 t²  10t  16 [3,4)
N 3 ,3
0

2
(t1
)

 2

  (t -1 )  ( 3  t )  ( 4  t)  (t  2 )

2

2
( 4-t)
 2
N 5, 3
sonst
0

2


t

3
[3,4)

Visualisierung mit C++ / OpenGL - SS 2005
§2-52
sonst
[1,2)
[2,3)
[3,4)
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – B-Splines
Mit Hilfe dieser Basis Splines erhalten wir nun folgende
Darstellung:
[2]
Definition: B (Basis)-Splinekurven
(a)
Das Kontrollpolygon d0,...,dm, die Ordnung k (Grad k-1) und
die m+k+1 Knoten x0x1 ... xm+k definieren eine
offene B-Splinekurve, gegeben durch
m
f (t ) :  d i  N i ,k (t ), t  [ xk 1 , xm 1 ].
i 0
Visualisierung mit C++ / OpenGL - SS 2005
§2-53
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – B-Splines
(b)
Das Kontrollpolygon d0,...,dm, die Ordnung k (Grad k-1) und
die m+2 Knoten x0x1 ... xm+1 definieren eine
geschlossene B-Splinekurve, gegeben durch
m
f (t ) :  d i  N i ,k (t ), t  [ x0 , xm 1 ],
i 0
wobei die fehlenden Knoten periodisch ergänzt werden:
x1i  xi   mi ,
i  0,1,2,L
xm 2i  xm1i  i ,
 i  xi 1  xi .
Diejenigen B-Splines, welche aus dem Intervall [x0,xm+1]
herausragen, müssen am jeweils anderen Rand des Intervalls
angetragen werden.
Visualisierung mit C++ / OpenGL - SS 2005
§2-54
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – B-Splines
Beispiel (k=3, m=4):
...
x0
... m 0
d0
x0
...
xm+1
m 0 ...
dk
xk-1
...
xm+1 xm+k
offene B-Splinekurve
d0
dm
geschlossene B-Splinekurve
Visualisierung mit C++ / OpenGL - SS 2005
§2-55
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – B-Splines
Bemerkungen:
1.
Jede Kontrollpunktänderung hat nur lokalen Einfluss.
2.
Bei offenen B-Splinekurven werden die Randpunkte d0 und
dm interpoliert, wenn gilt: x0=...=xk-1 und xm+1=...=xm+k.
Die Knoten x0 und xm+k haben keinen Einfluss auf den
Kurvenverlauf.
3.
Die Trägerintervalle der B-Splines sind wie folgt definiert:
f s   d 0 N 0 ,k  d1 N1,k  L  d m N m,k

x0 ,L ,xk 


x1,L ,xk 1 L xm ,L ,xmk 
Visualisierung mit C++ / OpenGL - SS 2005
§2-56
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – B-Splines
Satz: Convex-Hull und Variation-Diminishing Property
(a)
Jede Gerade schneidet eine ebene B-Splinekurve nicht öfter
als das zugehörige B-Splinepolygon.
(b)
Die B-Splinekurve liegt in der konvexen Hülle des
zugehörigen B-Splinepolygons. Genau genommen liegt jeder
Kurvenpunkt in der konvexen Hülle von k lokalen
Kontrollpunkten.
Beweis: siehe [Lane:1983]
Bemerkung:
Liegen k aufeinander folgende Kontrollpunkte auf einer Geraden,
so enthält auch die Kurve ein Geradensegment.
Visualisierung mit C++ / OpenGL - SS 2005
§2-57
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – B-Splines
Man kann B-Splinekurven in Bézier-Segmente umwandeln, indem
man die Vielfachheit aller Knoten durch sukzessives
Knoteneinfügen auf k-1 erhöht.
Die B-Splines degenerieren
dadurch zu Bersteinpolynomen.
Visualisierung mit C++ / OpenGL - SS 2005
§2-58
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – NURBS
NURBS (non-uniform rational B-splines)
Wegen der geringeren Datenmenge empfiehlt es sich oft, die
B-Splinedarstellung einzusetzen. NURBS sind rationale, nichtuniforme B-Splines, die besonders im CAD-Bereich Anwendung
finden:
f (t ) 
k
w
d
N
 i i i (t )
w N
i
k
i
(t )
Knoten-Sequenz {x0 ,...., xn+k}
Kontrollpunktmenge {d0 ,....,dn}
Gewichtesequenz {w0 ,....,wn}
Visualisierung mit C++ / OpenGL - SS 2005
§2-59
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Splineflächen
Splineflächen
Splineflächen sind aus mehreren Patches (Flächensegmenten)
zusammengesetzt. An den Trennkurven der Patches sind gewisse
Stetigkeitsbedingungen für glatte Übergänge einzuhalten.
Visualisierung mit C++ / OpenGL - SS 2005
§2-60
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – B-Splineflächen
B-Splineflächen
Aus dem Tensorprodukt der Darstellung für B-Splinekurven gewinnt
man B-Splineflächen. Für die Definition einer B-Splinefläche
benötigt man also
- zwei Ordnungen k und l
- de Boor Punkte dij (i=0,...,m; j=0,...,n)
- zwei Knotenvektoren (x0, ..., xm+k) und (y0, ..., yn+l)
B-Splineflächen können auch in eine oder beide Richtungen
geschlossen sein (Zylindermantel, Torus).
Visualisierung mit C++ / OpenGL - SS 2005
§2-61
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – B-Splineflächen
B-Splineflächen
yn+1
...
(Definitionsbereich)
yl-1
xm+1
...
xk-1
Die B-Spline-Darstellung ist erheblich kompakter als eine
Darstellung der entsprechenden Patches. Die Parametrisierung ist
durch die beiden Knotenvektoren festgelegt.
Visualisierung mit C++ / OpenGL - SS 2005
§2-62
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – B-Splineflächen
B-Splineflächen
Die Auswertung einer B-Splinefläche f(s,t) erfolgt mit dem
de Boor-Algorithmus. Zuerst wertet man für jede Zeile von
de Boor-Punkten eine B-Splinekurve dj := fj (s) aus, welche dann
die Kontrollpunkte einer Flächenkurve f(t) (s = konst.) liefert.
Alternativ dazu kann man auch folgende Summe auswerten:
Visualisierung mit C++ / OpenGL - SS 2005
§2-63
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Darstellung
Darstellung von NURBS in OpenGL
Erzeugung eines NURBS-Objekts und Rückgabe des Zeigers darauf:
GLUnurbsObj* gluNewNurbsRenderer(void);
Definition der NURBS-Eigenschaften
void gluNurbsProperty(GLUnurbsObj* nurbs,
// erzeugtes NURBS-Objekt
GLenum property,
// Eigenschaft
GLfloat value
// Eigenschaftswert
);
Visualisierung mit C++ / OpenGL - SS 2005
§2-64
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Darstellung
NURBS-Eigenschaften und Eigenschaftswerte (Auswahl)
Eigenschaft
mögliche Werte
GLU_SAMPLING_TOLERANCE
value>0
GLU_DISPLAY_MODE
GLU_FILL |
GLU_OUTLINE_POLYGON |
GLU_OUTLINE_PATCH
GLU_CULLING
GL_TRUE | GL_FALSE
GLU_AUTO_LOAD_MATRIX
GL_TRUE | GL_FALSE
Visualisierung mit C++ / OpenGL - SS 2005
§2-65
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Darstellung
Spezifikation eines Callbacks zur Fehlerbehandlung
void gluNurbsCallback(GLUnurbsObj* nurbs,
// erzeugtes NURBS-Objekt
GLenum which,
// Art des Callbacks:
// GLU_ERROR
void (*fn)(GLenum errorCode)
// Funktionspointer des
// Callbacks
);
Visualisierung mit C++ / OpenGL - SS 2005
§2-66
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Darstellung
Beispiel einer Callback-Funktion
void CALLBACK nurbsError(GLenum errorCode)
{
const GLubyte *estring;
estring = gluErrorString(errorCode);
fprintf (stderr, "Nurbs Error: %s\n", estring);
exit (0);
}
Visualisierung mit C++ / OpenGL - SS 2005
§2-67
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Darstellung
Spezifikation der NURBS- / B-Spline-Kurve
Definition der NURBS-Eigenschaften
void gluNurbsCurve(GLUnurbsObj* nurbs,
GLint knotCount,
GLfloat *knots,
GLint stride,
GLfloat *control,
GLint order,
GLenum type
//
//
//
//
//
//
//
//
//
//
//
//
//
NURBS-Objekt
Knotenanzahl
Knotenvektor
Offset zwischen
de Boor Punkten
de Boor Punkte
Ordnung der
Kurve
Typ der
darzustellenden
Kurve, z.B.
GL_MAP1_VERTEX3
GL_MAP1_VERTEX4
);
Visualisierung mit C++ / OpenGL - SS 2005
§2-68
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Darstellung
Spezifikation der NURBS- / B-Spline-Fläche
Definition der NURBS-Eigenschaften
void gluNurbsSurface(GLUnurbsObj* nurbs,// NURBS-Objekt
GLint uKnotNum, GLfloat* uknots, // Knotenvektor u
GLint vKnotNum, GLfloat* vknots, // Knotenvektor v
GLint ustride, GLint vstride
// Offset zwischen
// de Boor Punkten
GLfloat *controlArray,
// de Boor Punkte
GLint uorder, GLint vorder
// Ordnung der
// Kurve
GLenum type
// Typ der
// darzustellenden
// Kurve, z.B.
// GL_MAP1_VERTEX3
// GL_MAP1_VERTEX4
);
Visualisierung mit C++ / OpenGL - SS 2005
§2-69
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Darstellung
Darstellung der NURBS- / B-Spline-Kurve / -Fläche
void gluBeginCurve(GLUnurbsObj* nurbs);
gluNurbsCurve(........);
void gluEndCurve(GLUnurbsObj* nurbs);
bzw.
void gluBeginSurface(GLUNnurbsObj* nurbs);
gluNurbsSurface(........);
void gluEndSurface(GLUnurbsObj* nurbs);
Visualisierung mit C++ / OpenGL - SS 2005
§2-70
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
2.9 Freiformkurven und -flächen – Darstellung
Darstellung von NURBS in OpenGL
Löschen eines NURBS-Renderer-Objekts:
void gluDeleteNurbsRenderer(GLUnurbsObj* nurbs);
Visualisierung mit C++ / OpenGL - SS 2005
§2-71
§2 Darstellung geometrischer Objekte, Farbe,
Beleuchtung
Aufgabe
Ergänzen Sie das Beispielprogramm surface.c von der
Website um folgende Eigenschaften:
-
Ermöglichen Sie eine Navigation um die Fläche mit Hilfe
der Maus
-
Ermöglichen Sie eine Modifikation einzelner Kontrollpunkte
z.B. mit Hilfe der Tastatur
(z.B. Springen von einem Kontrollpunkt zum anderen auf
Tastendruck, Einfärben des jeweils aktiven Kontrollpunkts,
Verschieben des Kontrollpunkts auf Tastendruck.)
Visualisierung mit C++ / OpenGL - SS 2005
§2-72
Herunterladen