Geometriai modellezés Szirmay-Kalos László
Számítógépes grafika elemei modellezés számok Virtuális világ modell képszintézis
Modellezés feladatai Geometria megadása Transzformációk (mozgatás) 2D: pont, görbe, terület, fraktálok (D2) 3D: pont, görbe, felület, test, fraktálok (D3) Transzformációk (mozgatás) Referencia helyzetből a világkoordináta rendszerben az aktuális helyzetbe (animáció, kényelmes definíció) Színek, felületi optikai tulajdonságok
Pontok megadása Mindent számmal! Koordináta rendszer Koordináták megadása Yh y r 1 f w Xh x 1 1 Descartes eltolás szemléletes! Polár elforgatás Baricentrikus Homogén vetítés
Görbék = pontok halmaza Koordinátáik kielégítenek egy egyenletet (nem egyértelmű): implicit: f(x, y) = 0 f(r) = 0 Kör: (x–x0)2 + (y–y0)2 –R2 = 0 |r – r0 |2 – R2 = 0 paraméteres: x = x(t), y = y(t) r = r(t) Kör: t [0,1] x(t) = x0 + R cos 2t r = r0 + R(cos 2t, sin 2t) y(t) = y0 + R sin 2t
2D egyenes r = r0 + v t, t [-∞,∞] x = x0 + vx t y = y0 + vy t paraméteres r = r0 + v t, t [-∞,∞] x = x0 + vx t y = y0 + vy t n normálvektor v irányvektor y r0 implicit r n(r – r0) = 0 nx (x – x0) + ny (y – y0) = 0 ax + by + c = 0 (x, y, 1) (a, b, c) = 0 x
3D egyenes r = r0 + v t, t [-∞,∞] x = x0 + vx t y = y0 + vy t v irányvektor paraméteres z r = r0 + v t, t [-∞,∞] x = x0 + vx t y = y0 + vy t z = z0 + vz t r0 r y x Általában 3D görbék: x = x(t), y = y(t), z=z(t)
Szabadformájú görbék Definíció vezérlőpontokkal Polinom: x(t) = S ai ti, y(t) = S bi ti A polinomegyütthatók származtatása: Interpoláció Approximáció
Lagrange interpoláció rn Lagrange interpoláció r(t) ? t1 t2 tn Vezérlőpontok: r1, r2, r3,..., rn Keressük azt az r(t) = S [ai, bi ] ti-t amelyre r(t1) = r1, r(t2) = r2, … , r(tn) = rn, Megoldás: r(t) = S Li(t) ri r(tk) = rk P j i (t-tj) 1 ha i=k Li(t) = Li(tk) = P j i (ti-tj) 0 egyébként
Lagrange interpoláció bázisfüggvényei 1 1 0.33 0.67 P j i (t-tj) r(t) = S Li(t) ri Li(t) = P j i (ti-tj)
Görbeszerkesztés Lagrange interpolációval
Bezier approximáció Keresett görbe: r(t) = S Bi(t) ri Bi(t): ne okozzon indokolatlan hullámokat Konvex burok tulajdonság Bi(t) 0, Bi(t) = 1 r2 r1 r3 r(t) r0 B2(t) B3(t) B1(t) B0(t)
( ) Bernstein polinomok 1n = (t+(1-t))n =S t i (1-t)n-i n i Bi(t) Bi(t) 0, Bi(t) = 1 teljesül
Bezier approximáció bázisfüggvényei 1 n = 3 1 r(t) = S Bi(t) ri ( ) n Bi(t) = t i (1-t)n-i i
BezierCurve class BezierCurve { Vector * p; int np; float B(int i, float t) { float choose = 1; for(int j = 1; j <= i; j++) choose *= (float)(np-j+1)/j; return choose * pow(t, i) * pow(1-t, np-i); } public: BezierCurve(int n) { np = n; p = new Vector[np+1];} Vector r(float t) { Vector rr(0, 0); for(int i = 0; i <= np; i++) rr += p[i] * B(i,t); 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 G0 G1 C0: r1(tveg) = r2(tkezd) C1: r1‘ (tveg) = r2‘ (tkezd) C2: r1‘‘ (tveg) = r2‘‘ (tkezd) G0 = C0 C1 G1
Spline Spline: C2 folytonos összetett görbe Harmadfokú spline B-spline
Harmadfokú spline ri’(1) ri (1) ri+1’(0) ri’(0) ri+1 (0) ri (0) r(t) = a3t3 + a2t2 + a1t + a0 Szemléletes reprezentáció: r(0) = a0 r(1) = a3+a2+a1+a0 r’(0) = a1 r’(1) = 3a3+2a2+a1 a0 = r(0) a1 = r’(0) a2 =3r(1)-r’(1)-2r’(0)-3r(0) a3 = r’(1)-2r(1)+r’(0)+2r(0) Interpoláció: r(0) és r(1) a vezérlőpontok C1 folytonosság: 2 paraméter közös
Harmadfokú spline C2 folytonosság Követelmény: ri’’(1) = ri+1’’(0) Második derivált: r’’(0) = 2a2 = 6r(1)-2r’(1)-4r’(0)-6r(0) r’’(1) = 6a3 + 2a2 = 6r(0)+2r’(0)-6r(1)+4r’(1) C2 folytonosság az ismeretlen közös első derivált kiszámításával
B-spline Válasszunk olyan reprezentációt, amely C2 folytonos, ha 3-t közösen birtokolnak Reprezentáció: vezérlőpontok ri(t) = B0(t)r0 + B1(t)r1 + B2(t)r2 + B3(t)r3 ri+1(t) = B0(t)r1 + B1(t)r2 + B2(t)r3 + B3(t)r4 r2 r3 r1 Bi(t) = 1 r0 r4
B-spline bázisfüggvények Cirkuszi elefántok + Járulékos szempont: Bi(t) = 1 B1(t) = (1+3(1-t)+3t(1-t)2) /6 B0(t) = (1-t)3 /6 B2(t) = (1+3t+3(1-t)t2) /6 B3(t) = t3 /6 1 1
B-spline görbeszegmens 1 konvex burok tulajdonság 1 B1(t) = (1+3(1-t)+3t(1-t)2) /6 B0(t) = (1-t)3 /6 B2(t) = (1+3t+3(1-t)t2) /6 B3(t) = t3 /6
A B-spline lokálisan vezérelhető
NUBS: Non-Uniform B-spline minden szegmens 1 hosszú paramétertartomány Akkor megy át a kontrol ponton, ha három egymást követő kontrolpont egymásra illeszkedik NUBS az i. szegmens ti -től ti+1 -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 Cox-deBoor algoritmus
NUBS konstrukció
NUBS program S Bi(t) ri r[i]: n db. Vezérlőpont t[i]: n+k db. csomópont Fokszám = k-1 Hasznos: t[k-1]…t[n] B(i, k, t) { // 0/0 = 1. if (k == 1) { if (t[i] <= t < t[i+1]) return 1; else return 0; } else return ( B(i, k-1, t ) * ( t – t[i] ) / ( t[i+k-1] – t[i] ) + B(i+1, k-1, t) * ( t[i+k] – t ) / ( t[i+k] – t[i+1] ) ); } NUBS(k, t) { Vector r(0, 0); for(i = 0; i < n; i++) r += r[i] * B(i, k, t); return r; S Bi(t) ri
Végpontokon átmenő NUBS k=4 (harmadfokú) t = [0,0,0,0,1,2,2,2,2] Tartomány: [0,2]
B-Spline mint NUBS n=4 k=4 (harmadfokú) t = [-3,-2,-1,0,1,2,3,4] Tartomány: [0, 1]
Bézier görbe mint NUBS n=4 k=4 (harmadfokú) t = [0,0,0,0,1,1,1,1] Tartomány: [0, 1]
NUBS rendszám
Idáig: Nem racionális B-spline r(t) r1 B3(t) B4(t) B2(t) B1(t) Idáig a súlyfüggvények: S Bi(t) = 1 Súlypont: Polinom! S (Bi(t) ri ) r(t) = = S Bi(t) ri S Bi(t)
NURBS: Non-uniform Rational B-spline r(t) r1 w3B3(t) w4B4(t) w2B2(t) w1B1(t) Polinom tört! racionális S (wiBi(t) ri) wiBi(t) r(t) = = S ri S wjBj(t) S wjBj(t) Bi*(t)
NURBS súly w=3 w=2 w=1 w=1 w=1 w=1 w=1
Animációs harmadfokú spline ri(t) = ai t3 + bi t2 + cit 1 + di ri(ti) = ri, ri(ti+1) = ri+1 ri’(ti) = vi ri’(ti+1) = vi+1 vi vi+1 Ismeretlen vi -k meghatározása: C2 folytonosság követelményéből: spline ri’’(ti+1)= ri+1’’(ti+1) + sebesség a kezdő és végpontban ri+1 r1 rn r0 ri t0 t1 ti ti+1 tn
Kochanek-Bartels (Catmull-Rom) „spline” = -1 ri+1 = 0 Catmull-Rom = 1 ri-1 rn vi r0 ri (1-) tenzió paraméter t0 ti-1 ti ti+1 tn ri+1 - ri ri - ri-1 1 2 vi = + =0.9 =0.1 ti+1 - ti ti - ti-1 =0.5 (1-)
Görbék G0/C0 Cn Cn C2 C1 Inter-polációs Lokális Vez. Konvex burok Folyt. Animáció Törött vonal Lagrange Bézier Harmadrendű spline Catmull-Rom B-spline NUBS/NURBS G0/C0 Cn Cn C2 C1 C2 Ck
Területek Határ + belső tartományok azonosítása Belső tartományok:
Felületek Felület 3D pontok halmaza: Klasszikus felületek 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 - R2 = 0 paraméteres: x = x(u,v), y = y(u,v), z = z(u,v), u,v [0,1] gömb: x = x0 + R cos 2u sin v y = y0 + R sin 2u sin v z = z0 + R cos v u,v [0,1] Klasszikus felületek definíció = paraméterek megadása
Sík r = r0+ua+vb n(r – r0) = 0 n normálvektor a paraméteres z r0 r = r0+ua+vb r b y implicit x n(r – r0) = 0 nx (x – x0) + ny (y – y0) + nz (z – z0) = 0 ax + by + cz + d = 0 (x, y, z, 1) (a, b, c, d) = 0
Kvadratikus felületek xT A x = 0 xT = [x, y, z, 1] A koordináták legfeljebb másodfokon gömb, ellipszoid, sík, paraboloid, hiperboloid, hengerfelület,... Ellipszoid x2 y2 z2 Végtelen kúp x2 y2 Végtelen henger x2 y2 + + -1=0 + - z2 =0 + - 1 =0 a2 b2 c2 a2 b2 a2 b2
Szabadformájú felületek: r(u,v) Definíció kontrolpontokkal r(u,v) = rv(u) = S Bi (u) ri (v) ri (v) = S Bj(v) ri,j r(u,v) = S S Bi (u) Bj(v) ri,j
Szabadformájú felületek 2D kontrolpont sereg: szorzatfelületek r(u,v) = S S Bi,j (u,v) ri, j = S S Bi(u) Bj(v) ri, j Súlyfüggények: Interpoláció, Approximáció
Vezérlőpontok, súlyok módosítása
Vezérlőpontcsoportok 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 = 1/2 + 1/4
Subdivision felületek (Catmull-Clark) = 1/4 = 1/2 i = 1/v2 +2/v2 +(v-3)/v i = 1/4 + 1/2 i
Durva poligon modell
Subdivision simítás: 1 szint
Subdivision simítás: 2. szint
Testek Ellenpéldák Érvényes testek: reguláris halmaz nem lehetnek alacsony dimenziós elfajulásai minden határpont környezetében van belső pont Garantáltan érvényes testet építő 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 Forgatás: rotate
Felületmodellezők Test = határfelületek gyűjteménye Topológiai ellenőrzés (Euler tétel): csúcs + lap = él + 2
B-rep: Euler operátorok
Implementáció él Pont=p_él +(x,y,z) lap=p_él class BRepCore { “Winged-Edge data-structure” protected: void MEVVF(…); void MVE(float t, Edge& e); void MEF(Vertex& v1,Vertex& v2); public: void Move(Vertex& v, Vector p); }; class BRep : public BRepCore { void FaceExtrude( ); void FaceSplit( ); void EdgeCollapse( ); void VertexSplit( ); … él Pont=p_él +(x,y,z) lap=p_él
Gyakorlati Euler operátorok Face extrude Face split Edge Collapse Vertex split
Poligon modellezés: téglatest
Poligon modellezés: 1. extruding
Poligon modellezés: 2. extruding
Poligon modellezés: 4. és 5. extruding
Poligon modellezés: 6. extruding
Subdivision simítás
Poligon modellezés