Görbék, felületek
Miről lesz szó? Geometriai modellezés alapjai Bezieer görbék, felületek Evaluátorok, Nurbs felületek Példák
Görbék definiálása Megadás képlet segítségével: Megadott szabályszerűség követése, (analitikus) Megadás kontrollpontok segítségével: Megadott pontokon való áthaladás, (interpolációs) Megadott pontok közelítése (approximációs)
Szabadformájú görbék å Polinomok: A polinomegyütthatóknak (a,b) nincs szemléletes tartalma, ezért a modellezés során használatuk kényelmetlen. ] 1 , [ ) ( Î = å t b y a x n i
Interpolációs módszerek Lineáris interpoláció: a kontrollpontokat egyenesek kötik össze. Három ponton körív, négy ponton pedig harmadfokú görbe vezethető át. Lagrange francia matematikus interpolációs polinomokat alkalmazott. Tegyük fel, hogy a a megadott vezérlőpontok sorozata: r1,r2,r3,… rn. Keressük azt a minimális fokszámú L(t) polinomot, amely t1-nél r1, t2-nél r2, tn-nél rn értéket vesz fel. å - = 1 ] , [ ) ( n i j t b a r
å Õ Az egyenletrendszert megoldjuk [ai,bi]-re. Megoldás: A Lagrange interpoláció hátrányai: A görbe hajlamos az oszcillációra Nem alakítható lokálisan . ) ( ahol , 1 Õ å ¹ = - i j n t L r
Bézier-approximáció å A görbe nem megy át minden kontrollponton A kontrollpontok által meghatározott konvex burkon belül marad. A súlyfüggvény B(t) és a görbe C(t): . ) ( , 1 )) i n m P t B C å = - ÷ ø ö ç è æ + Berstein polinom
Evaluátorok az OpenGL-ben )] , ( ) [ )], v u Z Y X S C = C – curve, S – surface, u,v - paraméterek Görbe esetén – glEvalCoord1D() Felület esetén – glEvalCoord2D()
void glEvalCoord1{fd}{v}(TYPE u); void glMap1{fd}(GLenum target, TYPE u1, TYPE u2, GLint stride, GLint order, const TYPE *points); 1 dimenziós evaluátor létrehozása target: beállítja, hogy mit reprezentálnak a kontrollpontok. (a táblázat a következő fólián) u1, u2: az u változó tartománya stride: a kontrollpontok közötti eltolásérték. order: a kontrollpontok száma points: a kontrollpontok tömbje Több evaluátor is használható egyszerre: pl: GL_MAP1_VERTEX_3 és GL_MAP1_COLOR_4 esetén pozíció és szín generálható. De vertex evaluátor egyszerre csak 1 lehet! void glEvalCoord1{fd}{v}(TYPE u); argumentumként megadott u helyen generálja a görbe 1 pontját
x,y,z vertex koordináták GL_MAP1_VERTEX_4 x,y,z,w vertex koordináták paraméter jelentés GL_MAP1_VERTEX_3 x,y,z vertex koordináták GL_MAP1_VERTEX_4 x,y,z,w vertex koordináták GL_MAP1_INDEX color index GL_MAP1_COLOR_4 RGBA GL_MAP1_NORMAL normális koordináták GL_MAP1_TEXTURE_COORD_1 s textúra koordináták GL_MAP1_TEXTURE_COORD_2 s,t textúra koordináták GL_MAP1_TEXTURE_COORD_3 s,t,r textúra koordináták GL_MAP1_TEXTURE_COORD_4 s,t,r,w textúra koordináták
Példa bezcurve/bezcurve.cpp
Példa Próbáljuk ki GL_POINTS-t a GL_LINE_STRIP helyett. A kontrollpontokat módosítsuk, és figyeljük meg a változást. Egyenközű koordinátaértékek létrehozása: a display() görbekirajzolást töröljük, majd helyére a következő két sort szúrjuk be: glMapGrid1f(30, 0.0, 1.0); glEvalMesh1(GL_LINE, 0.0, 30.0);
Egyenlő felosztás glMapGrid1{fd}(GLint n, TYPE u1, TYPE u2); glEvalMesh1(GLenum mode, GLint p1, GLint p2); mode: GL_LINE, GL_POINT A hatás ekvivalens a következő kódrészlettel: glBegin(GL_POINTS); // vagy glBegin(GL_LINE_STRIP); for( i = p1; i <= p2; i++) { glEvalCoord(u1 + i * (u2-u1) / n); } glEnd();
Kétdimenziós evaluátorok å = n i m j ij P v B u S ) ( , Pij : a kontrollpontok száma m*n Bi : a Bernstein polinomok, ugyanaz mint 1D esetben Pij reprezentálhat vertexeket, normálisokat, színeket, textúra koordinátákat az 1D esthez hasonlóan. A felületek megadása a következőképpen történik: 1: evaluátorok definiálása: glMap2*() – vel. 2: glEnable() - típus beállítása (vertex, color, textura, stb..) 3: kirajzolás: glEvalCoord2*() –vel, vagy glMapGrid2() és glEvalMesh2() - vel.
void glMap2{fd}(GLenum target, TYPE u1, TYPE u2, GLint ustride, GLint uorder, TYPE v1, TYPE v2, GLint vstride, GLint vorder, TYPE *points); target paraméter ugyanaz mint 1D esetben. u1, u2, v1, v2: u,v minimum-maximum lehetséges értékei. ustride, vstride: kiválasz egy részhalmazt a kontrollpontokból. Például: float pontok[100][100][3]; akkor egy 4x4-es részhalmaz beállításához a [20][30]-tól kezdve: ustride=100*3; vstride= 3, point = &pontok[20][30][0]
glEvalCoord2{fd}{v}(TYPE u, TYPE v); GL_MAP2_VERTEX_3, GL_MAP2_VERTEX_4 – esetén a normálvektorokat analitikusan számítja a rendszer. glEnable(GL_AUTO_NORMAL) segítségével a kiszámolt normálisok alkalmazhatóak. glDisable(GL_AUTO_NORMAL) esetén az éppen beállított normálvektor érvényesül.
Példa: Bézier-felület bezsurf.cpp
Feladatok Jelenítsük meg a felület kontrollpontjait. Alkalmazzuk a glEvalMesh2(GL_LINE,…); beállítást. Tegyük automatikusan forgóvá a felületet.
Egyenközű koordináta értékek glMapGrid2{fd}(GLint nu, TYPE u1, TYPE u2, GLint nv, TYPE v1, TPYE v2); glEvalMesh2(GLenum mode, GLint p1, GLint p2, GLint q1, GLint q2); A beállítások ekvivalensek a következő kódrészlettel: (GL_FILL mód esetén): for(i = nu1; i< nu2; i++) { /* GL_FILL mód glBegin(GL_QUAD_STRIP); for( j = nv1; j <= nv2; j++) { glEvalCoord(u1 + i * (u2-u1) / nu, v1+j * (v2-v1) / nv); glEvalCoord(u1 + (i+1) * (u2-u1) / nu, v1+j * (v2-v1) / nv); glEnd(); }
Automatikus textúra koordináta generálás texturesurf.cpp
Feladat a textúrát töltsük be fájlból (bmp) a régi forráslisták felhasználásával!
Példa editgrid.cpp