Geometriai modellezés Számítógépes grafika elemei modellezés világ leírás modellezés virtuális világ képszintézis Szirmay-Kalos László felhasználó kamera virtuális világ kép képszintézis Modellezés feladatai Geometria megadása pont, görbe, terület, felület, test, fraktálok Transzformációk lokális modellezési és világkoordináta rendszer Színek, felületi optikai tulajdonságok Pontok megadása Mindent számmal! Koordináta rendszer Koordináták megadása Koordináta rendszerek Descartes Polár Homogén y x Descartes eltolás Koordináta rendszerek r φ Polár elforgatás Y h w X h Baricentrikus Homogén vetítés Görbék Görbe pontok halmaza: koordinátáik kielégítenek egy egyenletet implicit: f(x, y) = 0 Kör: (x - x0) 2 + (y - y0) 2 - r 2 = 0 explicit: x = x(t), y = y(t), t [0,] Kör: x(t) = x0 + r cos 2πt y(t) = y0 + r sin 2πt t [0,] Klasszikus görbék van egyenlet definíció = paraméterek megadása
Szabadformájú görbék Definíció kontrolpontokkal Polinom: x(t) = Σ a i t i, y(t) = Σ b i t i A polinomegyütthatók származtatása: Interpoláció Approximáció Lagrange interpoláció Kontrolpontok: r, r 2, r 3,..., r n Keressük azt az r(t) = Σ [a i, b i ] t i -t amelyre r(t ) = r, r(t 2 ) = r 2,,r(t n ) = r n, Megoldás: r(t) = Σ L i (t) r i L i (t) = Π j i (t-t j ) Π j i (t i -t j ) Lagrange interpoláció bázisfüggvényei Görbeszerkesztés Lagrange interpolációval 0 0.33 0.67 L i (t) = Π j i (t-t j ) Π j i (t i -t j ) r(t) = Σ L i (t) r i Bezier approximáció Keresett görbe: r(t) = Σ B i (t) r i B i (t): ne okozzon nem indokolt hullámokat Konvex burok tulajdonság B i (t) 0, Σ B i (t) = Bezier approximáció bázisfüggvényei r r 2 r(t) r 4 B 3 (t) B (t) B 2 (t) B 4 (t) r 3 0 B i (t) = ( ) n i t i (-t) n-i Bernstein polinomok r(t) = Σ B i (t) r i
LagrangePoly tknot( ) L(i,t) Görbék C++ -ban LagrangeCurve Interpolate(t) Primitiv Curve Interpolate(t) Point operator+ operator* BezierPoly B(i,m,t) BezierCurve Interpolate(t) Primitív és Curve class Primitive2D { Array<Point2D> points; Color color; public: Primitive2D( Color& c, int n = 0 ) : color(c), points(n) { Point2D& Point( int i ) { return points[i]; int PointNum( ) { return points.size(); ; class Curve2D : public Primitive2D { public: Curve2D( Color& c ) : Primitive2D( c ) { virtual Point2D Interpolate( double tt ) = 0; ; Lagrange polinom class LagrangePolinom { Array<double> knot_pars; public: int Degree( ) { return knot_pars.size(); double& t( int i ) { return knot_pars[i]; doublel( int i, doublett ) { double Li=.0; for(int j = 0; j < Degree(); j++) if(i!= j) Li *= (tt - t(j)) / (t(i) - t(j)); return Li; void DistributeKnotPars( int n ) { for (int i = 0; i <= n; i++) t(i) = (double)i / n; ; LagrangeCurve class LagrangeCurve2D : publiccurve2d, publiclagrangepolinom { public: LagrangeCurve2D( Color c ) : Curve2D( c ), LagrangePolinom( ) { Point2D Interpolate( doublett ) { Point2D rr(0, 0); for(int i = 0; i < Degree(); i++) rr += Point(i) * L(i, tt); return rr; ; Bezier polinom class BezierPolinom { public: doubleb( int i, doublett, int m ) { doublebi =.0; for(int j = ; j <= i; j++) Bi *= tt * (m-j)/j; for( ; j < m; j++) Bi *= (-tt); ; return Bi; BezierCurve class BezierCurve2D : public Curve2D, publicbezierpolinom { public: BezierCurve2D( Color c ) : Curve2D( c ), BezierPolinom( ) { Point2D Interpolate( doublett ) { doublebi =.0; Point2D rr(0, 0); for(int i = 0; i < PointNum(); i++) rr += Point(i ) * B(i, tt, PointNum()); return rr; ;
Bonyolult görbék Nagyon magas fokszámú polinom Összetett görbék: Több alacsony fokszámú + folytonos illesztés folytonossági kategóriák Spline Spline: C 2 folytonos összetett görbe Harmadfokú spline B-spline G 0 C 0 : r (t veg ) = r 2 (t kezd ) G 0 = C 0 G C : r (t veg ) = r 2 (t kezd ) C G C 2 : r (t veg ) = r 2 (t kezd ) Harmadfokú spline p(t) = a 3 t 3 + a 2 t 2 + a t + a 0 Új szemléletes reprezentáció: p(0) = a 0 p() = a 3 + a 2 + a + a 0 p (0) = a p i (0) p () = 3a 3 + 2a 2 + a p i (0) C folytonosság: 2 paraméter közös C 2 folytonosság: p i () = p i+ (0) p i () p i () P i+ (0) P i+ (0) B-spline Válasszunk olyan reprezentációt, amely C 2 folytonos, ha 3-t közösen birtokolnak Reprezentáció: kontrolpontok r i (t) = B 0 (t)r 0 + B (t)r + B 2 (t)r 2 + B 3 (t)r 3 r i+ (t) = B 0 (t)r + B (t)r 2 + B 2 (t)r 3 + B 3 (t)r 4 B-spline bázisfüggvények Cirkuszi elefántok + Járulékos szempont: Σ B i (t) = B 0 (t) = (-t) 3 /6 B (t) = (+3(-t)+3t(-t) 2 ) /6 B 3 (t) = t 3 /6 B 2 (t) = (+3t+3(-t)t 2 ) /6 0 B-spline görbeszegmens konvex burok tulajdonság 0 B 0 (t) = (-t) 3 /6 B (t) = (+3(-t)+3t(-t) 2 ) /6 B 3 (t) = t 3 /6 B 2 (t) = (+3t+3(-t)t 2 ) /6
A B-spline lokálisan vezérelheto NUBS: Non-Uniform B-spline B-spline minden szegmens hosszú paramétertartomány Akkor megy át a kontrol ponton, ha három egymás követo kontrolpont egymásra illeszkedik NUBS az i. szegmens t i -tol t i+ -ig. Egy kontrolpont többször is számíthat: A legalább 3-szoros pontokon a görbe átmegy NUBS rekurzív konstrukciója NUBS konstrukció t 0 t t 2 t 3 t 4 Cox-deBoor algoritmus NUBS program r[i]: n db. Vezérlopont t[i]: n+k db. csomópont Fokszám = k- Hasznos: t[k]-t[n+] B(i, k, t) { // 0/0 =. if(k == ) { if(t[i] <= t < t[i+]) return else return 0; else return ( ( t - t[i] ) * B(i, k-, t ) / ( t[i+k] - t[i] ) + (t[i+k+]-t) * B(i+, k-, t) / (t[i+k+] - t[i+]) ); NUBS(k, t) { r = 0; for(i = 0; i < N; i++) r += r[i] * B(i, k, t); return r; Végpontokon átmeno NUBS n=5 k=4 (harmadfokú) t = [0,0,0,0,,2,2,2,2] Tartomány: [0,2]
B-Spline mint NUBS Bézier görbe mint NUBS n=4 k=4 (harmadfokú) t = [-3,-2,-,0,,2,3,4] Tartomány: [0, ] n=4 k=4 (harmadfokú) t = [0,0,0,0,,,,] Tartomány: [0, ] NUBS rendszám Idáig: Nem racionális B-spline r 2 r 4 r r(t) B 3 (t) B (t) B 2 (t) B 4 (t) Idáig a súlyfüggvények: Σ B i (t) = Polinom! Súlypont: Σ (B i (t) r i ) r(t) = = Σ B i (t) r Σ i Bi (t) r 3 NURBS: Non-uniform Rational B-spline w=3 NURBS súly r 2 r 4 r r(t) w B (t) w 2 B 2 (t) w 3 B 3 (t) w 4 B 4 (t) Polinom tört! racionális Σ (w i B i (t) r i ) w r(t) = = Σ i B i (t) r Σ i wj B j (t) Σ w j B j (t) B i* (t) w= w=2 w= w= w= w=
Területek Határ + belso tartományok azonosítása Belso tartományok: ) 2) 3). belso pont Felületek Felület 3D pontok halmaza: koordinátáik kielégítenek egy egyenletet implicit: f(x, y, z) = 0 gömb: (x - x0) 2 + (y - y0) 2 + (z - z0) 2 - r 2 = 0 explicit: x = x(u,v), y = y(u,v), z = z(u,v), u,v [0,] gömb: x = x0 + r cos 2πu sin πv y = y0 + r sin 2πu sin πv z = z0 + r cos πv u,v [0,] Klasszikus felületek definíció = paraméterek megadása Kvadratikus felületek x T A x = 0 x T = [x, y, z, ] A koordináták legfeljebb másodfokon gömb, ellipszoid, sík, paraboloid, hiperboloid, hengerfelület,... Szabadformájú felületek: r(u,v) Definíció kontrolpontokkal r(u,v) = Σ Σ B i (u) B j (v) r i,j Ellipszoid Végtelen kúp x 2 + + y 2 z 2 -=0 x 2 y + 2 - z a 2 b 2 c 2 =0 2 a 2 b 2 Végtelen henger x 2 + y 2 - =0 a 2 b 2 r(u,v) = r v (u) = Σ B i (u) r i (v) r i (v) = Σ B j (v) r i,j Szabadformájú felületek 2D kontrolpont sereg: szorzatfelületek Vezérlopontok, súlyok módosítása Súlyfüggények: Interpoláció, Approximáció r(u,v) = Σ Σ B i,j (u,v) r i, j = Σ Σ B i (u) B j (v) r i, j
Vezérlopontcsoportok módosítása Szobrászkodás szabadformájú felületekkel Szobrászkodás szabadformájú felületekkel Felületmodellezés mint Poligonháló módosítás Felosztásos (subdivision) módszerek = /2 + /4 Σ Subdivision felületek (Catmull-Clark) Clark) = /4 Σ = /4 Σ + /4 Σ = /2 + /6 Σ + /6 Σ
Durva poligon modell Subdivision simítás: szint Subdivision simítás: 2. szint Ellenpéldák Testek Érvényes testek: reguláris halmaz nem lehetnek alacsony dimenziós elfajulásai minden határpont mellett van belso pont Garantáltan érvényes testet építo módszerek 2.5 dimenziós eljárások speciális felületi modellezés: B-rep Konstruktív tömörtest geometria 2.5 dimenziós módszerek Kihúzás (extrude) s(v): gerinc s(v)+b(u) Kihúzás: extrude Forgatás: rotate b(u): profil
Lapos kihúzás: r(u,v)= )=b(u)) +s(v) Csöves kihúzás s (v): s(v): gerinc r(u,v)=s(v)+ I 0 b x (u)+k 0 b z (u) I=k x s (v) K = s (v) x I k i b(u): profil Csöves kihúzás Poligon modellezés: téglatest Poligon modellezés:. extruding Poligon modellezés: 2. extruding
Poligon modellezés: 4. és 5. extruding Poligon modellezés: 6. extruding Subdivision simítás y Forgatás p x (u) x z x = p x (u) z = p z (u) x = p x (u) cos 2πv y = p x (u) sin 2πv z = p z (u) x Forgatás Felületmodellezok Test = határfelületek gyujteménye Topológiai ellenorzés (Euler tétel): csúcs + lap = él + 2
B-rep B-rep: Euler operátorok Felületi modellezo Elemi muveletek nem sérthetik a topológiát Euler operátorok A teljes topológiai információt tároljuk szárnyas él adatstruktúra MVE. V E E E Csinálj csúcsot és élt F MEF E F F Csinálj élt és lapot semmi MEVVF F Csinálj élt, két csúcsot és lapot V V2 E semmi Tetraéder Euler operátorokkal MEVVF MEF MVE Csúcs mozgatás Csúcs mozgatás. MEF.. MVE MEF Gyakorlati Euler operátorok Face extrude Face split Edge Collapse Vertexsplit CSG: konstruktív tömörtest geometria 3D ponthalmazok uniója, metszete is ponthalmaz CSG alapmuveletek Kizárás: reguláris halmazmuveletek Reguláris unió Reguláris különbség Reguláris interszekció
CSG modellezés Normál és ciklikus CSG \* * * Reprezentáció: bináris fa