Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

2D grafikus rendszerek Szirmay-Kalos László. 2D grafikus rendszerek (funkcionális modell) Kép frissités rasztertár Pixel műveletek Raszteri- záció Vágás.

Hasonló előadás


Az előadások a következő témára: "2D grafikus rendszerek Szirmay-Kalos László. 2D grafikus rendszerek (funkcionális modell) Kép frissités rasztertár Pixel műveletek Raszteri- záció Vágás."— Előadás másolata:

1 2D grafikus rendszerek Szirmay-Kalos László

2 2D grafikus rendszerek (funkcionális modell) Kép frissités rasztertár Pixel műveletek Raszteri- záció Vágás Világ- képtér Modellezési transzf. Világ- lokális mod. Képtér- világ Eszköz- képtér Virtuális világ T V -1 T M -1 TVTV TMTM Kurzor (xp, yp) Kimeneti csővezeték Bemeneti csővezeték Eszköz koord. (xe, ye) kamera

3 2D grafikus editor: GUI, use-case, dinamikus modell L L L R LD LU MouseLDown első pont MouseLDown második... MouseLDown n. MouseRDown utolsó MouseLDownpick? MouseMovemozgat MouseLUpletesz

4 Osztálydiagram Window state MouseLD() MouseLU() MouseMov() PutPixel() Scene actobj actprim InputPipe() Pick() Render() Camera ClipWindow() ViewTransform() VirtualWorld AddObject() GetObject() Object transform AddPrimitive() GetPrimitive() Primitive color AddPoint() Vectorize() Point x,y Polyline Vectorize() Curve Interpolate() Vectorize() Polygon Vectorize() Bezier Interpolate() B-Spline Interpolate() RenderPrimitive Transform() Clip() Draw() PointList Clip() Draw() LineList Clip() Draw() Polygon Clip() Draw()

5 Kimeneti csővezeték: Render Scene :: Render ( ) { Transform Tv = camera.ViewTransform( ); for each object obj { // prioritás Transform Tm = obj -> Transform( ); Transform Tc = Tm * Tv; for each primitive p of object obj { // prioritás RenderPrimitive * rp = p -> Vectorize( ); rp -> Transform( Tc ); if ( rp -> Clip( camera.ClipWindow ) ) rp -> Draw( ); }

6 Vektorizáció class Curve : Primitive { virtual Point Interpolate( double tt ) = 0; RenderPrimitive Vectorize( ) { LineList linelist = new LineList(); for(int i = 0; i <= NVECTOR; i++) { double t = (double)i / NVECTOR; linelist -> AddPoint( Interpolate( t ) ); } return linelist; } };

7 Bezier görbe interpoláció class Bezier : Curve { Point Interpolate( double tt ) { Point rr(0, 0); for(int i = 0; i < npoints; i++) { double Bi = 1.0; for(int j = 1; j <= i; j++) Bi *= tt * (npoints-j)/j; for( ; j < npoints; j++) Bi *= (1-tt); rr += points[i] * Bi; } return rr; } }; B i (t) = t i ( 1-t) n-i ( )( ) n i r(t) =  B i (t) r i

8 RenderPrimitive class RenderPrimitive { Point * points; Colorcolor; void Transform( Transform T ) { for each point i do points[i].Transform( T ); } virtual Bool Clip( Rect cliprect ) = 0; virtual void Draw( ) = 0; }; class Line : public RenderPrimitive { Line( Point p1, Point p2 ) { points = new Point[2]; points[0] = p1; points[1] = p2; } Bool Clip( Rect cliprect ) { Cohen-Sutherland vágás } void Draw( ) { Szakaszrajzoló algoritmus: PutPixel(X, Y, color) } };

9 Bemeneti csővezeték: pontok beépítése a virtuális világba Scene :: InputPipeline( X, Y ) { Object * obj = world.Object( actobject ); Transform Tm = obj -> Transform( ); Transform Tv = camera.ViewTransform( ); Transfrom Tci = (Tm * Tv).Invert( ); Point p = Point(X, Y).Transform( Tci ); world.Object( actobject ) -> Primitive( actprim ) -> AddPoint(p); } Window :: MouseLDown( X, Y ) {... ha az állapot szerint a pontot be kell építeni scene.InputPipeline( X, Y );.... }

10 Primitív (objektum) kiválasztása Scene :: Pick( X, Y ) { Rect pickw( X-5, Y-5, X+5, Y+5 ); fordown each object obj { // vissza prioritás Transform Tm = obj -> Transform( ); Transform Tv = camera.ViewTransform( ); Transform Tc = Tm * Tv; fordown each primitive p of object obj { RenderPrimitive * rp = p -> Vectorize( ); rp -> Transform( Tc ); if ( rp -> Clip( pickw ) ) { actobj = obj; actprim = p; return actobj; } } Window :: MouseLDown( X, Y ) {... ha az állapot szerint kiválasztás: scene.Pick( X, Y ); }

11 Input/Output kezelés Operating system Windows GLUT main DisplayFunc KeyboadFunc IdleFunc OpenGL grafikus hardver applikáció init. callback regisztráció callback-ek SpecialFunc Reshape MousePress MouseMotion

12 GLUT-OpenGL l OpenGL: –kimeneti csővezeték l tesszelláció (GLU), l transzformáció, l vágás, pick! l raszterizáció l GLUT –Op. Rendszer, Ablakozó rendszer illesztés l ablak létrehozás l bemeneti események elkapása

13 OpenGL szintaxis glVertex3dv( … ) Paraméterszám 2 - (x, y) 3 - (x, y, z), (R, G, B) 4 - (x, y, z, h) (R, G, B, A) Adattípus b - byte ub - unsigned byte s - short i - int f - float d - double Vektor vagy skalár v - vektor - skalár gl könyvtár része

14 glX, wglglu Ablakozó – OpenGL – alkalmazás elhelyezkedése hw applikáció gl GLUT X v. MS-Win Ablak-kezelés widgetek Ablakozó- gl híd Utility-k, tesszellátorok Window menedzsment

15 OpenGL: GLUT inicializálás #include #include // download!!! main( int argc, char *argv[] ) { glutInitWindowSize(200, 200); glutInitWindowPosition(100, 100); glutInit(&argc, argv); glutInitDisplayMode( GLUT_RGB ); glutCreateWindow("Sample Window"); // callback függvények glutKeyboardFunc( Keyboard ); glutDisplayFunc( ReDraw ); // transzformáció glViewport(0, 0, 200, 200); glMatrixMode(GL_MODELVIEW); glLoadIdentity( ); glMatrixMode(GL_PROJECTION); glLoadIdentity( ); gluOrtho2D(0., 100., 0., 100.); // fő hurok glutMainLoop(); } windowviewport (0,0) (100,100) (0,0) (200,200) KeyPress WM_KEYDOWN Expose WM_PAINT

16 Eseménykezelés és rajzolás void ReDraw( ) { glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT); } void Keyboard(unsigned char key, int x, int y) { if (key == ‘d’) { glColor3d( 0.0, 1.0, 0.0 ); glBegin(GL_TRIANGLES); glVertex2d(10.0, 10.0); glVertex2d(20.0, 100.0); glVertex2d(90.0, 30.0); glEnd( ); glFlush( ); } (100,100) (0,0) (200,200) (0,0) window viewport

17 2D grafikus editor L L L R MouseLDown első pont MouseLDown második... MouseLDown n. MouseRDown utolsó

18 Glut/OpenGL program architektúra transzform vágás raszterizáció Raszter műveletek Color buffer: RGB API Operating system Windows GLUT main Redraw MousePress MouseMotion

19 Osztálydiagram Window state MouseLD() MouseLU() MouseMov() PutPixel() Scene actobj actprim InputPipe() Pick() Render() Camera ClipWindow() ViewTransform() window viewport VirtualWorld AddObject() GetObject() Object transform AddPrimitive() GetPrimitive() Primitive color AddPoint() Vectorize() Point x,y Polyline Vectorize() Curve Interpolate() Vectorize() Polygon Vectorize() Bezier Interpolate() B-Spline Interpolate() RenderPrimitive Transform() Clip() Draw() PointList Clip() Draw() LineList Clip() Draw() Polygon Clip() Draw()

20 GLUT: inicializálás main(argc, argv) { glutInitWindowSize(200, 200); glutInitWindowPosition(100, 100); glutInit(&argc, argv); glutInitDisplayMode( GLUT_RGB ); glutCreateWindow("2D graphics editor"); glutMouseFunc(MousePress); // callback glutMotionFunc(MouseMotion); glutDisplayFunc(ReDraw); glutMainLoop(); // fő hurok }

21 GLUT: eseménykezelés void ReDraw( ) { glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); window.scene.Render( ); } void MousePress( int button, int state, int x, int y ) { if (button == GLUT_LEFT && state == GLUT_DOWN) window.MouseLD(x, y); … } void MouseMotion( int x, int y ) { window.MouseMov(x, y); }

22 OpenGL Render Scene :: Render ( ) { glViewport(camera.viewport.Left(), camera.viewport.Bottom(), camera.viewport.Width(), camera.window.Height()); glMatrixMode( GL_PROJECTION ); glLoadIdentity(); gluOrtho2D(camera.window.Left(), camera.window.Right(), camera.window.Bottom(), camera.window.Top()); glMatrixMode( GL_MODELVIEW ); for each object obj { glLoadIdentity(); glMulMatrix( obj -> Transform( ) ); // 4x4 matrix for each primitive p of object obj { RenderPrimitive * rp = p -> Vectorize( ); rp -> Draw( ); // átadjuk az OpenGL-nek }

23 OpenGL LineList class LineList : public RenderPrimitive { void Draw( ) { glColor3d( color.R, color.G, color.B ); glBegin( GL_LINE_STRIP ); for( i = 0; i < npoints; i++ ) glVertex2d(points[i].x, points[i].y); glEnd( ); glFlush( ); } };

24 OpenGL: primitívek GL_POINTS GL_LINES GL_LINE_STRIP GL_LINE_LOOP GL_POLYGON GL_TRIANGLE_STRIP GL_TRIANGLES GL_TRIANGLE_FAN GL_QUADS GL_QUAD_STRIP

25 Első kisfeladat l Írjon görbesimító programot C++-ban OpenGL és GLUT felhasználásával. Az windows ablak háttérszíne kék, felbontását szabadon megválaszthatják. l A program egy "pontok.txt" nevű ascii fájlt olvas be, amelynek első sorában egy int van (a pontok száma), amit ennyi sor követ, minden sorban két float számmal, amelyek a pontok x,y világkoordinátáit tartalmazzák. A program ezen csúcspontokra egy zárt töröttvonalat illeszt és egy (0,0),(100,100) sarokpontokkal definiált ablakú kamerával lefényképezi, az eredményt a képernyő windows ablakában megjeleníti. A zárt töröttvonalat fehér színnel kell felrajzolni. l Ha a felhasználó a bal egér gombbal ráklikkel a zárt töröttvonal által határolt területre, a program Catmull-Clark algoritmussal simít egyet a töröttvonalon. Jobb egérklikk pedig csökkenti a simítás mértékét. A maximális simítás mértéke legalább 3, azon túl korlátozható. A zárt töröttvonal által határolt terület pontjai azok, amelyekhez a végtelenből érkezve páratlanször lépjük át a töröttvonalat. A programot egyetlen C++ fájlban kell megírni, amit az exe-vel egyetemben címre kell elküldeni október 26-ig


Letölteni ppt "2D grafikus rendszerek Szirmay-Kalos László. 2D grafikus rendszerek (funkcionális modell) Kép frissités rasztertár Pixel műveletek Raszteri- záció Vágás."

Hasonló előadás


Google Hirdetések