§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. ba 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 x0x1 ... .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 r31 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 iIN 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 x0x1 ... 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 x0x1 ... 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: x1i xi mi , i 0,1,2,L xm 2i xm1i 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 ,xmk 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