Grafikus szoftver alrendszer, OpenGL alapok

Slides:



Advertisements
Hasonló előadás
OpenGL 2. gyakorlat Hapák József
Advertisements

L ÁTHATÓSÁG MEGHATÁROZÁSA tavaszi félév.
Számítógép grafika.
Piacképes programozói tudás a középiskolában
Számítógépes geometriai leíró nyelvek
Grafika. 2 Mértékek és koordináta rendszer Használjuk a RGB és QBColor függvényeket a színekhez Grafika létrehozása Load/change picture futási időben.
Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke A programozás alapjai 1. (VIEEA100) 9. előadás.
2D képszintézis Szirmay-Kalos László.
2D grafikus rendszerek Szirmay-Kalos László. 2D grafikus editor: GUI, use-case, dinamikus modell L L L R LD LU MouseLDown első pont MouseLDown második...
Inkrementális 3D képszintézis
Geometriai modellezés
2D grafikus rendszerek Szirmay-Kalos László.
OpenGL Szirmay-Kalos László In theory, there is no difference
2D képszintézis Szirmay-Kalos László. Számítógépes grafika feladata képszintézis Virtuális világ modell modellezés Metafórák: 2D rajzolás világ = sík.
Geometriai modellezés
Számítógépes grafika Szirmay-Kalos László
Számítógépes grafika Szirmay-Kalos László
Virtuális világ tárolása Szirmay-Kalos László. Belső világ tárolása l Geometria: pontok koordinátái l Topológia: élek-pontok; lapok-pontok;... l hierarchia:
Bevezetés.  A számítógépes grafika inkrementális képszintézis algoritmusának hardver realizációja  Teljesítménykövetelmények:  Animáció: néhány nsec.
GPGPU labor I. OpenGL, Cg.
Számítógépes Grafika 6. gyakorlat Programtervező informatikus (esti)‏ 2009/2010 őszi félév.
6. előadás (2005. április 5.) Struktúrák Úniók Új adattípus definíálása Dinamikus memória foglalás 1.
7. előadás (2005. április 12.) Láncolt lista File kezelés 1.
4. előadás (2005. március 8.) Pointerek Pointer aritmetika
GRAFIKUS PRIMITÍVEK KITÖLTÉSE
Grafika a programban Készítette: Pető László. Bevezetés Valójában nem a célobjektumra rajzolunk, hanem annak festővászon területére (canvas). Csak olyan.
Számítógépes grafika, PPKE-ITK, Benedek Csaba, D képszintézis 4. előadás.
Számítógépes grafika, PPKE-ITK, Benedek Csaba, 2010 Geometriai modellezés 2. előadás.
Textúrák, világmodellek
A számítógépes grafika céljai és feladatai
Grafikus szoftver alrendszer, OpenGL alapok
A számítógépes grafika céljai és feladatai
Számítógépes grafika OpenGL 1. gyakorlat.
Számítógépes Grafika 1. gyakorlat Programtervező informatikus (esti)‏ 2009/2010 őszi félév.
2D képszintézis és textúrák
PHP I. Alapok. Mi a PHP? PHP Hypertext Preprocessor Szkriptnyelv –Egyszerű, gyors fejlesztés –Nincs fordítás (csak értelmező) Alkalmazási lehetőségek:
Számítógépes grafika 3. gyakorlat.
Bevezetés: a Számítógépi grafika tárgya (Szemelvények: amit tudni illik)
Számítógépes Grafika 1-2. gyakorlat Programtervező informatikus (esti)‏ 2011/2012 őszi félév.
Számítógépes Grafika Megvilágítás Programtervező informatikus (esti)‏
2008/2009 tavasz Klár Gergely  Gyakorlatok időpontjai: ◦ Szerda 10:05–11:35 ◦ Csütörtök 10:00+ε –11:30+ε  Gyakvez: ◦ Klár Gergely ◦
Turbo Pascal 11..
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Web: Magasszintű Programozási Nyelvek I. Eszterházy.
Grafikus alaphardver Szirmay-Kalos László. Jelfeldolgozási megközelítés modellezés modell képszintézis Digitális kép megjelenítés Analog Digitál Képinformáció.
2D képszintézis Szirmay-Kalos László.
Számítógépes grafika Bevezetés
Rendering pipeline Ogre3D
2D grafikus rendszerek Szirmay-Kalos László.
Web-grafika II (SVG) 1. gyakorlat
Komoróczy Tamás 1 Java programozási nyelv A nyelv alapjai.
2. gyakorlat DirectX 2007/2008 tavasz Klár Gergely
Grafikai lehetőségek WPF-ben Egyszerű grafika (Shape-ek)
Geometriai transzformációk
Bevezetés - Vonalak. Koordinátarendszer Windows form x y Az y lefelé nő Transzformáció a hagyományosra x Eltolás y Ellentett és eltolás.
Számítógépes grafika, PPKE-ITK, Benedek Csaba, 2010 Geometriai modellezés 2. előadás.
Számítógépes grafika I. AUTOCAD alapok
CUDA C/C++ programozás CUDA C bevezetés A segédanyag készítése a TÁMOP A/ Nemzeti Kiválóság Program című kiemelt projekt keretében.
A számítógépes grafika alapjai, PPKE-ITK, Benedek Csaba, 2010 Tanagyag forrás © Szirmay-Kalos László, BME A számítógépes grafika céljai és feladatai 1.
Képek, képfeldolgozás Szirmay-Kalos László.
Grafikus szoftver Szirmay-Kalos László. Interaktív programok felépítése input csővezeték output csővezeték.
Számítógépes grafika, PPKE-ITK, Benedek Csaba, 2010 Grafikus szoftver alrendszer, OpenGL alapok 1. előadás (2.rész)
1 OpenGL grafikus rendszer Dr. Nehéz Károly egyetemi adjunktus Miskolci Egyetem Alkalmazott Informatikai Tanszék.
Grafikus hardver/szoftver alapok Szirmay-Kalos László.
3D grafika összefoglalás
Vizualizáció és képszintézis
OpenGL IV.
Neumann János Informatikai Kar
Görbék, felületek.
Bevezetés Tematika Számonkérés Irodalom
Előadás másolata:

Grafikus szoftver alrendszer, OpenGL alapok 1. előadás Számítógépes grafika, PPKE-ITK, Benedek Csaba, 2012

Bemutatkozás Tárgyfelelős oktató: A tárgy honlapja: Dr. Benedek Csaba (jelenleg @ ) bcsaba@sztaki.hu http://web.eee.sztaki.hu/~bcsaba Közreműködik: Börcs Attila A tárgy honlapja: http://grafika.itk.ppke.hu/

A tárgy oktatásának menete Össz: 1 óra előadás, 2 óra laborgyakorlat felváltva, kéthetes periódusokkal Számonkérés: minden laborfeladat személyes bemutatása szóbeli vizsga Segédanyagok: Kötelező olvasmány: Szirmay-Kalos László: Számítógépes Grafika (elektronikus) Ajánlott olvasmányok: Szirmay-Kalos László, Antal György,Csonka Ferenc: Háromdimenziós grafika, animáció és játékfejlesztés OpenGL ‘Red Book’

Kitekintő MTA SZTAKI Elosztott Események Elemzése Kutatócsoport http://web.eee.sztaki.hu/ Önálló labor, TDK témák képfeldolgozás + grafika témákban…

Meghirdetett témák/1 3D virtuális városrekonstrukció légi LIDAR pontfelhőkből www.maps.nokia.com

Légi LIDAR adatok Légi fotó LIDAR intenzitáskép 3D LIDAR pontfelhő Lézer visszaverődések száma (növényzet)

Eddigi eredmények: automatikus épület-rekonstrukció légi LIDAR pontfelhőkből 1) Talaj síkjának detektálása 4) Épület tető-rekonstrukció és oldalfalal generálás Hangsúlyozd hogy saját eredmények! 2) Növényzet és ritka térrészek detektálása 3) Tetőszegmensek detektálása

Virtuális városrekonstrukció Kontakt: Benedek Csaba, e-mail: bcsaba@sztaki.hu

Meghirdetett témák/2 Objektumfelismerés és rekonstrukció autós LIDAR pontfelhő-sorozatokon Hardver: Velodyne HDL-64E Lidar Kimenet: pontfelhő szekvencia nagyobb kültéri színterekről

Kezdeti eredmények: objektum szeparálás Benedek Csaba, e-mail: bcsaba@sztaki.hu Szirányi Tamás, e-mail: sziranyi@sztaki.hu

További témák: képfeldolgozás, mintafelismerés…

Interaktív program struktúra egér alkalmazás megjelenítő billentyűzet botkormány

Programvezérelt vs eseményvezérelt programozás

Interaktív program struktúra

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

Grafikus hardver illesztése, programozása Grafikus könyvtárak A grafikus hardver szolgáltatásait ezen keresztül lehet elérni Hierarchikus rétegek, szabványosított interfészek Fő irányelvek: eszközfüggetlenség rajzolási állapot 2-D példák: Ablak, menü, egér: Win32 API Rajzolás: Ms-Windows GDI, GDI+, DirectDraw 3-D példák: OpenGL (platformfüggetlen), DirectX (csak MS-Windows)

OpenGL Értelmező szótár: Szül: 1992 Silicon Graphics (SG), GL néven Open = hardver és szoftver platform független GL = Graphics Language Szül: 1992 Silicon Graphics (SG), GL néven OpenGL: közös specifikáció SG, IBM, Intel, MS stb Elérhetőség: Futtatható verzió Windows operációs rendszer része Ingyenes fejlesztői verzió Végfelhasználói verzió: videokártya gyártók illesztő programjaiban implementált Szintaxis: gl{FunctionName}, pl glClearColor()

GLU (OpenGL Utilities) OpenGL-hez kapcsolódó szabványos kiegészítő csomag Pl: hasznos programozást könnyítő rutinok transzformációs mátrixok beállítására, felületek teszcellációjára Szintaxis: glu{FunctionName}, pl gluPerspective()

DirectX OpenGL alternatívája Számítógépes játékok többsége ezt használja a színtér megjelenítésére Csak Windows platformon használható, Windows XP-től kezdve az operációs rendszer szerves része C++, C#, VB stb támogatja az API szintű programozását

OpenGL vs DirectX Összehasonlítás: állandó vitaforrás Tények: Melyik a gyorsabb - ez sokszor a gyártók által implementált illesztő programtól függ. Melyik az egyszerűbben kezelhető – felhasználó és alkalmazás függő Tények: OpenGL platformfüggetlen, DirectX nem Számítógépes játékok 90%-a DirectX-t használ DOOM III-at OpenGL-ben írták 

Mit NE várjunk el az OpenGL-től? Az OpenGL NEM geometriai modellező rendszer bemeneti eszközkezelő, ablakozó interaktív rajzoló vagy grafikus rendszer Viszont IGEN alkalmas különböző modellező, rajzoló rendszerek grafikai igényeinek a kielégítésére Geometriai modellező rendszer (nincsenek objektumok megadására, manipulálására vonatkozó parancsok

Alkalmazás: OpenGL „csak” megjelenítést támogat, kell hozzá ablakozó, eseménykezelő rendszer Az OpenGL platformfüggetlen, de az alkalmazás ettől még nem! egér alkalmazás megjelenítő billentyűzet botkormány Ablakozás: „operációs rendszer” pl Ms-Windows vagy XWindow 3-D grafikus ábrázolás: OpenGL Eseménykezelés: „operációs rendszer” pl Ms-Windows vagy XWindow

Ablakkezelés Windows-ban (részlet) //------------------------------------------------------------------- void InitWindowClass( HANDLE hInstance, HANDLE hPrevInstance ) { WNDCLASS wndclass; strcpy(szClassName, "grafika"); if ( !hPrevInstance ) { wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; // ablakkezel˝o f¨uggv´eny wndclass.hInstance = hInstance; // program azonos´ıt´o wndclass.hIcon = LoadIcon( hInstance, IDI_APPLICATION ); wndclass.hCursor = LoadCursor( NULL, IDC_ARROW ); wndclass.hbrBackground = GetStockObject( WHITE_BRUSH ); wndclass.lpszMenuName = "windowsmenu"; // men¨un´ev az er˝oforr´as f´ajlban wndclass.lpszClassName = szClassName; // oszt´alyn´ev wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; if ( !RegisterClass( &wndclass ) ) exit( -1 ); } void InitWindow( HANDLE hInstance, int nCmdShow ) { HWND hwnd = CreateWindow( szClassName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL ); if ( ! hwnd ) exit( -1 ); ShowWindow(hwnd, nCmdShow ); // ablak megjelen´ıt´ese UpdateWindow( hwnd ); // ´erv´enytelen´ıt´es // egy Windows program itt indul int PASCAL WinMain( HANDLE hInstance, HANDLE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow ) { InitWindowClass(hInstance, hPrevInstance); InitWindow( hInstance, nCmdShow ); AppStart( ); return 0;

GLUT= OpenGL Utility Toolkit platformfüggetlen eseménykezelés és ablakozás  egyszerű inteface  használja az MS-Windows vagy XWindow rutinokat, de erről az alkalmazás nem kell, hogy tudjon  csak kis méretű, egyszerű programok megírására alkalmas  Laboron ezt fogjuk használni!

Input/Output kezelés OpenGL OpenGL Alkalmazás Alkalmazás MS-Window XWindow OpenGL DirectX Alkalmazás Alkalmazás MS-Window MS-Window v. XWindow GLUT

GLUT jellemzői egyszerre több ablak callback függvény alapú eseménykezelés időzítő (timer) üresjárat (idle) kezelés számos előre definiált tömör és drótváz test (pl teáskanna = glutWireTeapot() parancs) egyszerű menük

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

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

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

OpenGL szintaxis glVertex3dv( … ) gl könyvtár része 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

Veremkezelés Állapotváltozók („rajzolási állapot” elv) tárolása veremben glPushAttrib(): kurrens állapotváltozók elmentése az aktuális veremben glPopAttrib(): a verem tetején lévő változók visszatöltése

OpenGL: GLUT inicializálás #include <GL/gl.h> #include <GL/glu.h> #include <GL/glut.h> // 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); gluOrtho2D(0., 100., 0., 100.); // fő hurok glutMainLoop(); } OpenGL: GLUT inicializálás KeyPress WM_KEYDOWN Expose WM_PAINT (200,200) window (100,100) viewport (0,0) (0,0)

GLUT: eseménykezelés main( int argc, char *argv[] ) { … glutKeyboardFunc( Keyboard ); glutDisplayFunc( ReDraw ); glutMouseFunc( MousePress ); glutMotionFunc( MouseMotion ); …… } void Keyboard(unsigned char key, int x, int y) { if (key == ‘d’) myPressedKey_d(x, y); void ReDraw( ) { glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); myRender( ); void MousePress( int button, int state, int x, int y ) { if (button == GLUT_LEFT && state == GLUT_DOWN) myMouseLD(x, y); void MouseMotion( int x, int y ) { myMouseMov(x, y);

Vetítés (párhuzamos) Koordinátarendzser definíciója: void gluOrtho2D(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top); Koordinátarendzser definíciója: left, right: bal- és jobboldali vágási sík (az ablak pixel koordinátáiban, ami a bal felső sarokhoz viszonyít) bottom, top: alsó és felső vágási sík 100 window gluOrtho2D(.0,200.0,100.0,.0) 200

Rajzolás az OpenGL-ben ablak törlése geometriai objektumok rajzolása raszteres objektumok rajzolása

Ablak törlése void glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); háttérszín beállítása színkomponensek: [0 1] intervallumon belül void glClear(GLbitfield mask); GL_COLOR_BUFFER_BIT színpuffer GL_DEPTH_BUFFER_BIT mélységpuffer (lásd később...) GL_ACCUM_BUFFER_BIT gyűjtőpuffer (lk...) GL_STENCIL_BUFFER_BIT stencilpuffer (lk...)

A rajzolás befejezéséne kikényszerítése Teljes megjelenítési lánc: a rajzolási parancs és az objektum megjelenés között a kirajzolás késhet... void glFlush() kikényszeríti a korábban kiadott OpenGL parancsok azonnali végrehajtását

Geometriai alapelemek megadása Csúcspont = vertex void glVertex[234]{sifd}(TYPE coords); void glVertex[234]{sifd}v(const TYPE* coords); Példák: glVertex2s(2, 3); glVertex3d(0.0, 0.0, 3.1415926535898); glVertex4f(2.3, 1.0, -2.2, 2.0); GLdouble dvect[3] = {5.0, 9.0, 1992.0}; glVertex3dv(dvect); glBegin() és glEnd() között kell kiadni

Normálvektor void glNormal3{bsidf}(TYPE nx, TYPE ny, TYPE nz); void glNormal3{bsidf}v(const TYPE *v); Adott (3D) pontban megjelenítendő felület normálvektora Árnyalási, megvilágítási feladatokhoz szükséges Felületek közelítése poligonokkal: csúcsponthoz a pontban találkozó lapok normálisának átlagát rendeljük – így az élek nem fognak látszani

Geometriai alapelemek Csúcspontok -> pont, szakasz, poligon Téglalap: külön függvény (mert gyalkori) void glRect{sifd}(TYPE x1, TYPE y1, TYPE x2, TYPE y2); void glRect{sifd}v(const TYPE *v1, const TYPE *v2);

Geometriai alapelemek Poligon: zárt törött vonallal határolt KONVEX terület csak egyszerű (nem lyukas) alakzatok mindig síkbeli tetszőleges felület = háromszögek egyesítése Nem egyszerű poligon helyett általában a konvex burok jelenik meg:

Geometriai alapelemek felsorolása Geometriai elemek felsorolása: glBegin() és glEnd() parancsok között void glBegin(GLenum mode); void glEnd(void); „mode” adja meg az alapelem típusát, pl háromszög rajzolás példa: glBegin(GL_TRIANGLES); glVertex2d(10.0, 10.0); glVertex2d(20.0, 100.0); glVertex2d(90.0, 30.0); glEnd( );

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

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( ); window (100,100) (0,0) viewport (200,200) (0,0)

Primitívek rajzolása A glBegin() és glEnd() között kiadható még: szín glColor*() normális: glNormal*() textúra: glTexCoord*() lásd később... stb

Geometriai alapelemek megjelenését befolyásoló tényezők void glPointSize(GLfloat size); pontot reprezentáló pixeltömb mérete void glLineWidth(GLfloat width); szakasz szélessége

Szaggatott szakaszok Szaggatottság be-kikapcsolása glEnable(GL_LINE_STIPPLE); glDisable(GL_LINE_STIPPLE); void glLineStipple(GLint factor, GLushort pattern); szaggatottság egységének (factor) és mintájának (pattern) beállítása factor: minta nagyítása

Szín megadása void glColor3{bsifdu}(TYPE r, TYPE g, TYPE b) void glColor3{bsifdu} (TYPE r, TYPE g, TYPE b, TYPE a) void glColor{3,4} {bsifdu}(const TYPE *v)

Árnyalás void glShadeModel(GLenum mode); mode GL_FLAT: a teljes objektumot egy meghatározott csúcspont színével színezi ki. A kiválasztott csúcspont objektumtípusonként változik, pl törött vonal esetén a végpont, GL_POLYGON esetén az első csúcspont GL_SMOOTH a csúcspontok színéből lineárisan interpolálja a belső pontok színét

Gouroud árnyalás a szine: c1 c3 alapján b szine c2 c3 alapján p szine a b alapján

Flat vs. smooth árnyalás

Egyéb alapvető GLUT funciók: Mintaobjektumok rajzolása teszteléshez: void glutSolidTeapot(GLdouble size); void glutWireTeapot(GLdouble size);

Mintaobjektumok rajzolása teszteléshez void glutSolidCube(GLdouble size); void glutWireCube(GLdouble size); void glutSolidIcosahedron(void); void glutWireIcosahedron(void); void glutSolidTetrahedron(void); void glutWireTetrahedron(void); Stb…

Egyéb alapvető GLUT funciók: Menükezelés int glutCreateMenu(void (*func)(int value)); Létrehoz egy új menüt (vagy almenüt) Callback függvényt regisztrál a menühöz Visszatérési érték: egyedi azonosító A program aktuális menüjének az új menüt állítja void glutAddMenuEntry(char *name, int value); Új menübejegyzést ad az aktuális menühöz. Ha majd ráklikkelünk a bejegyzésre az aktuális menü Callback-je „value” paraméterrel hívódik meg Látjuk: callback bemeneti paramétere int

Menükezelés void glutAddSubMenu(char *name, int submenuID); Almenüt ad az aktuális menühöz. Az almenüt korábban létre kellet hozni, és az azonosítóját eltárolni void glutAttachMenu(int button); Az aktuális menüt a „button” egérgombhoz rendeli, azaz azzal lehet majd előhívni

Minta: menürendszer létrehozása int submenu=glutCreateMenu(MenuFunc); glutAddMenuEntry("ElsoFunkcio",0); glutAddMenuEntry("MasodikFunkcio",1); glutAddMenuEntry("HarmadikFunkcio",2); glutAddMenuEntry("NegyedikFuncio",3); glutCreateMenu(MenuFunc); glutAddSubMenu("Type",submenu); glutAddMenuEntry("Exit",4); glutAddMenuEntry("About",5); glutAttachMenu(GLUT_RIGHT_BUTTON);

Minta: menücallback implementációja void MenuFunc(int menuItemIndex) { switch(menuItemIndex) { case 0: … ; break; case 1: … ; break; case 2: … ; break; case 3: … ; break; case 4: exit(0); case 5: MessageBox(NULL,"Hello Glut","About",MB_OK); break; } glutPostRedisplay();

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

2D grafikus editor: GUI, use-case, dinamikus modell LD L LU L R MouseLDown első pont MouseLDown második ... MouseLDown n. MouseRDown utolsó MouseLDown pick? MouseMove mozgat MouseLUp letesz

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

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

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 }

OpenGL LineList 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( ); }