Róth Gergő. roth@dcs.uni-pannon.hu



Hasonló dokumentumok
Róth Gergő.

A játékfejlesztés több területből áll. A kódolás csupán egy része a munkáknak.

Róth Gergő.

OpenGL és a mátrixok

Grafikus csővezeték és az OpenGL függvénykönyvtár

1. Bevezetés 1. Köszönetnyilvánítás A számítógépes játékfejlesztésről 3

Tanács Attila. Képfeldolgozás és Számítógépes Grafika Tanszék Szegedi Tudományegyetem

Transzformációk. Grafikus játékok fejlesztése Szécsi László t05-transform

Számítógépes grafika

Plakátok, részecskerendszerek. Szécsi László

Grafikus csővezeték 1 / 44

Thermo1 Graph. Felhasználói segédlet

Transzformációk. Szécsi László

Bevezetés a programozásba II 1. gyakorlat. A grafikus könyvtár használata, alakzatok rajzolása

Objektum orientáltság alapjai A Java nyelv Fordítás - futtatás

3D koordináta-rendszerek

Láthatósági kérdések

1. Bevezetés szeptember 9. BME Fizika Intézet. Szám. szim. labor ea. Tőke Csaba. Tudnivalók. feladat. Tematika. Moodle Házi feladatok

x = cos αx sin αy y = sin αx + cos αy 2. Mi a X/Y/Z tengely körüli forgatás transzformációs mátrixa 3D-ben?

Mobil Informatikai Rendszerek

Szoftver labor III. Tematika. Gyakorlatok. Dr. Csébfalvi Balázs

3D-s technológiák a játékfejlesztésben UDK bevezetés

Space Invaders Dokumenta cio

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

Mesh generálás. IványiPéter

Mintavételes szabályozás mikrovezérlő segítségével

Mechatronika segédlet 3. gyakorlat

3. Osztályok II. Programozás II

Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 22./0. 3D grafika programozása OpenGL támogatással Transzformációk

A MATLAB alapjai. Kezdő lépések. Változók. Aktuális mappa Parancs ablak. Előzmények. Részei. Atomerőművek üzemtana

Országos Területrendezési Terv térképi mel ékleteinek WMS szolgáltatással történő elérése, Quantum GIS program alkalmazásával Útmutató 2010.

Mobil Informatikai Rendszerek

Operációs rendszerek. 9. gyakorlat. Reguláris kifejezések - alapok, BASH UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

Operációs rendszerek. 9. gyakorlat. BASH recap, reguláris kifejezések UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

GPU Lab. 14. fejezet. OpenCL textúra használat. Grafikus Processzorok Tudományos Célú Programozása. Berényi Dániel Nagy-Egri Máté Ferenc

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe

3. modul - Szövegszerkesztés

2D képszintézis. Szirmay-Kalos László

Bevezetés a CGI-be. 1. Történelem

Vizuális, eseményvezérelt programozás XI.

A WORDPRESS TESTRESZABÁSA (MEGJELENÉS MENÜ ELEMEI)

OOP. Alapelvek Elek Tibor

Digitális aláíró program telepítése az ERA rendszeren

Baran Ágnes. Gyakorlat Függvények, Matlab alapok

QGIS tanfolyam (ver.2.0)

Textúrák. Szécsi László

Bevezetés a programozásba Előadás: Fordítási egység

OPENCV TELEPÍTÉSE SZÁMÍTÓGÉPES LÁTÁS ÉS KÉPFELDOLGOZÁS. Tanács Attila Képfeldolgozás és Számítógépes Grafika Tanszék Szegedi Tudományegyetem

Adatszerkezetek Tömb, sor, verem. Dr. Iványi Péter

A MIMIO interaktív tábla használata. Dr. Boda István DRHE,

Lakóház tervezés ADT 3.3-al. Segédlet

Navigációs GPS adatok kezelése QGIS programmal (1.4 verzió) Összeállította dr. Siki Zoltán

Algoritmusok raszteres grafikához

Videókártya - CUDA kompatibilitás: CUDA weboldal: Példaterületek:

A számítógépek felépítése. A számítógép felépítése

OpenGL Compute Shader-ek. Valasek Gábor

A Vonallánc készlet parancsai lehetővé teszik vonalláncok és sokszögek rajzolását.

VII. Appletek, grafika

Tartalom Képernyő részei... 2

I. VEKTOROK, MÁTRIXOK

Osztályok. 4. gyakorlat

GráfRajz fejlesztői dokumentáció

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

A szerzõrõl... xi Bevezetés... xiii

Új prezentáció létrehozása az alapértelmezés szerinti sablon alapján.

BME MOGI Gépészeti informatika 18. Grafika, fájlkezelés gyakorló óra. 1. feladat Készítsen alkalmazást az = +

Raszter georeferálás QGIS-ben Összeállította: dr. Siki Zoltán verzióra aktualizálta: Jáky András

Programozási nyelvek Java

Iman 3.0 szoftverdokumentáció

FELHASZNÁLÓI KÉZIKÖNYV

Máté: Számítógépes grafika alapjai

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Feladatok. Tervek alapján látvány terv készítése. Irodai munka Test modellezés. Létező objektum számítógépes modelljének elkészítése

Multimédiás adatbázisok

BME MOGI Gépészeti informatika 15.

OpenCL alapú eszközök verifikációja és validációja a gyakorlatban

2. modul - Operációs rendszerek

VARIO Face 2.0 Felhasználói kézikönyv

KIRA. KIRA rendszer. Telepítési útmutató v1

openbve objektumkészítés Leírás az objektumkészítéshez használható parancsokról

Képszerkesztés. Letölthető mintafeladatok gyakorláshoz: Minta teszt 1 Minta teszt 2. A modul célja

Tartalomjegyzék. Előszó... 10

1.1. A forrásprogramok felépítése Nevek és kulcsszavak Alapvető típusok. C programozás 3

Számítógépes Grafika SZIE YMÉK

1. Mátrixösszeadás és skalárral szorzás

Mrend X Extra 3.0 b. - menetrendszerkesztő program leírása -

Árnyalás, env mapping. Szécsi László 3D Grafikus Rendszerek 3. labor

Android alapok. Android játékfejlesztés

JavaScript Web AppBuilder használata

8. gyakorlat Pointerek, dinamikus memóriakezelés

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 6.ELŐADÁS. Fájlkezelés PHP-ben

Felhasználói kézikönyv - Android kliens

1. DVNAV letöltése és telepítése

SysCVideo: fiktív grafikus kártya SystemC modulként, SDL alapú megjelenítéssel

Importálás. más típusú (pl:.imp,.xml,.xkr,.xcz) állomány beimportálása a nyomtatványkitöltő programba

C programozási nyelv Pointerek, tömbök, pointer aritmetika

Flynn féle osztályozás Single Isntruction Multiple Instruction Single Data SISD SIMD Multiple Data MISD MIMD

Ablak és ablakműveletek

Programozási nyelvek JAVA EA+GY 1. gyakolat

Szoftvertechnológia alapjai Java előadások

Átírás:

Róth Gergő roth@dcs.uni-pannon.hu 1

Oktatók Smidla József (smidla@dcs.uni-pannon.hu) Róth Gergő (roth@dcs.uni-pannon.hu) Bejárás nem kötelező Tárgy adatai Gyakorlati Nem kötelező Szabadon választható Neptun kód - VEMISVSA32J Tananyag (példakódok, dokumentációk, stb.) smidla.mik.uni-pannon.hu/jatek oktatas.mik.uni-pannon.hu Aláírás feltétel Rövid (15 perces) ZH a szorgalmi időszak végén Jegy kialakítása Beadandó feladat készítése csapatban Vizsgán történő bemutatás Ajánlott irodalom Jason Gregory: Game Engine Architecture Szirmay-Kalos László: Háromdimenziós grafika, animáció és játékfejlesztés ( Sünis könyv ) Nyisztor Károly: Grafika és játékprogramozás DirectX-szel Nyisztor Károly: Shaderprogramozás - Grafika és játékfejlesztés DirectX-szel Varga Márton: 3D grafika - Modellezés és megjelenítés 2

Ha hibát találtok az előadás fóliáiban a dokumentációkban a példa forráskódokban... jelezzétek írásban vagy szóban. Igyekszünk kijavítani mindent. 3

Bevezetés C / C++ kód fordítása Grafikus felületek programozásának alapjai OpenGL grafikus könyvtár Transzformációk (eltolás, átméretezés, forgatás) Transzformációk OpenGL-lel Blender Irrlicht Engine UDK bevezető Kismet, animációk Unreal Script nyelvi elemei Fejlesztés Unreal Scriptben 4

5

A játékfejlesztés több területből áll. A kódolás csupán egy része a munkáknak. Példák az elvégzendő feladatokra: Tervezés Kódolás Modellezés Textúrázás Pályaszerkesztés Animálás... Többnyire minden terület tovább bontható további részterületekre. 6

Az elvégzendő feladatokat eszközök segítik. Ezen eszközök két kategóriába sorolhatóak: Runtime Olyan eszközök, melyek futási időben kerülnek felhasználásra. Offline Olyan eszközök, melyek a játék futása során nem kerülnek felhasználásra. 7

3D Studio Max Maya Blender (ingyenesen használható bármilyen célra) 8

Photoshop Gimp (ingyenesen használható bármilyen célra) 9

Unreal Development Kit (UDK) Valve Hammer Editor Might & Magic: Heroes VI 10

Shader szerkesztő szoftverek Zeneszerkesztő szoftverek Pl.: Audacity (ingyenes) Material szerkesztő szoftverek Többnyire tartalmazzák a modellező, vagy pályaszerkesztő szoftverek Részecskerendszer szerkesztő szoftverek... 11

Nyersanyag (asset, resource) importálása (exportálása) a játékba (játékból) 3D modell Textúra Zene Pálya Részecskerendszer Material Shader Animáció... 12

Matematikai könyvtár Hálózati kommunikáció kezelés (TCP, UDP, stb.) Fizika Ütközésdetektálás Részecskerendszer Mechanika Statika Hanglejátszás Rajzoló rutinok Animációlejátszás... 13

14

15

inicializálás() A függvény célja, hogy betöltse az alkalmazás futtatásához szükséges nyersanyagokat, valamint, hogy inicializálja a megfelelő változókat, alrendszereket. inicializálás(); while (játékfut()) { eseménykezelés(); animálás(); fizikaszámolás(); rajzolás(); } felszabadítás(); A fő ciklusban végrehajtott függvények listája nem teljes. Több funkció is elképzelhető. 16

eseménykezelés() A függvény kezeli le a játékos interakcióit. Egér Billentyűzet Joystick stb. inicializálás(); while (játékfut()) { eseménykezelés(); animálás(); fizikaszámolás(); rajzolás(); } felszabadítás(); A fő ciklusban végrehajtott függvények listája nem teljes. Több funkció is elképzelhető. 17

animálás() A függvény meghatározza az animált objektumok következő állapotát. inicializálás(); while (játékfut()) { eseménykezelés(); animálás(); fizikaszámolás(); rajzolás(); } felszabadítás(); A fő ciklusban végrehajtott függvények listája nem teljes. Több funkció is elképzelhető. 18

fizikaszámolás() A függvény számolja a betöltött világ fizikáját. Szabadesés Csúszás stb. inicializálás(); while (játékfut()) { eseménykezelés(); animálás(); fizikaszámolás(); rajzolás(); } felszabadítás(); A fő ciklusban végrehajtott függvények listája nem teljes. Több funkció is elképzelhető. 19

rajzolás() A függvény rajzolja ki a betöltött világot a képernyőre. inicializálás(); while (játékfut()) { eseménykezelés(); animálás(); fizikaszámolás(); rajzolás(); } felszabadítás(); A fő ciklusban végrehajtott függvények listája nem teljes. Több funkció is elképzelhető. 20

felszabadítás() Az init() ellentéte. Felszabadítja a lefoglalt erőforrásokat. inicializálás(); while (játékfut()) { eseménykezelés(); animálás(); fizikaszámolás(); rajzolás(); } felszabadítás(); A fő ciklusban végrehajtott függvények listája nem teljes. Több funkció is elképzelhető. 21

Játéklogika Ha a játékos guggol, akkor lassabban megy Ha a játékos eléri a fát, akkor új pálya betöltése Ha a játékos meghal, akkor a legutóbbi mentés betöltése Játékmotor Megjelenítés Matematika Nyersanyag kezelés Hang kezelés Az ábrán szereplő komponensektől eltérőek is szerepelhetnek a tényleges játékban. 22

23

main.c component0.c component1.c Compiler Compiler Compiler main.o component0.o component1.o Linker a.out / a.exe 24

component0.c component1.c Compiler Compiler component0.o component1.o Archiver libownlib.a / OWNLIB.lib 25

main.c Compiler main.o libownlib.a / OWNLIB.lib Linker a.out / a.exe 26

Könyvtár készítése paranccsorból gcc c component0.c gcc c component1.c ar crv libownlib.a component0.o component1.o gcc main.c Lpath-to-lib -lownlib Könyvtár készítése QtCreatorrel.pro fájlban TEMPLATE = app helyett TEMPLATE = lib Alapértelmezetten dinamikus könyvtárat készít (Windows (.dll), Linux (.so)) Statikus könyvtár készítése (libx.a) CONFIG += staticlib 27

28

Az egyetemen oktatott verzió C++03 ISO által 2003-ban elfogadott Újabb verzió C++11 ISO által 2011-ben elfogadott (teljesen kompatibilis fordító csak később jelent meg hozzá) Újítások listája megtalálható a wikipedia C++11 oldalán Használata gcc-vel gcc std=c++11 Használata QtCreator-rel.pro fileban QMAKE_CXXFLAGS += -std=c++11 29

Osztálydeklarációkban változók inicializálása Példa class ClassName { int i = 5; double d = 5.3; float f = 5.3; }; auto kulcsszó átértelmezése Változó deklarációja, melynek a típusát a fordító fogja meghatározni Példa auto i = 5; // i típusa int auto d = 5.3; // d típusa double auto f = 5.3f; // f típusa double nullptr kulcsszó bevezetése NULL és 0 helyett használható Példa int *array = nullptr; 30

31

Include #include <vector> Példány deklarálása std::vector<típus> array; Példa std::vector<int> array; Példány deklarálása inicializációval együtt std::vector<típus> array = {item0, item1,...}; Példa std::vector<int> array = {2, 3, 5, 7, 11,...}; Elem hozzáadása a tömbhöz array.push_back(item); Példa array.push_back(13); 32

Tömb méretének lekérdezése array.size(); Ciklus, ami végigmegy a tömb minden elemén for (auto it = array.begin(); it!= array.end(); ++i) Ekkor a tömb aktuális eleme: *it for (unsigned int i = 0; i < array.size(); ++i) // lassabb megoldás Ekkor a tömb aktuális eleme: array[i] Tömb memóriacímének a lekérése A memóriacímtől kezdve az adatok szekvenciálisan helyezkednek el. &array[0] array.data() 33

34

Include #include <map> Példány deklarálása map::map<kulcs_típus, adat_típus> container; Példa std::map<std::string, int> array; Elem hivatkozása (ha az elem létezett, akkor visszatér az értékével, ha nem, akkor létrehoz egy új érték típust) container[key]; container[key] = item; Példa container[ kulcs ]; container[ kulcs ] = 15; A tároló méretének lekérdezése container.size(); Ciklus, ami végigmegy a tároló minden elemén for (auto it = container.begin(); it!= container.end(); ++i) Ekkor a tároló aktuális kulcsa: it->first értéke: it->second 35

36

/*! \brief Rövid leírás. * És annak folytatása. * * Hosszú leírás. */ class OsztályNév... 37

/*! \brief Rövid leírás. * És annak folytatása. * * Hosszú leírás. * * \param arg0 Az adott paraméterhez tartozó leírás. * \param arg1 Az adott paraméterhez tartozó leírás. * * \return A visszatérési értékhez tartozó leírás. */ int foobar(char arg0, float arg1); 38

Letöltése: http://www.stack.nl/~dimitri/doxygen/download.html Windows operácios rendszerre a "Sources and Binaries" részben, a "A binary distribution for Windows." felirat alatt. Ott a doxygen- VERSION-setup.exe melletti ftp, vagy http linkre kattintással. A telepítés után a program parancssorból használható. Használata Parancssorban (cmd, vagy terminal) a forrásfájlok mappájába kell menni Ha nem létezik a doxygen.conf file az adott mappában, akkor ki kell adni a doxygen -g doxygen.conf parancsot, majd meg kell szerkeszteni a doxygen.conf filet LANGUAGE parametert kell átírni Hungarian-re PROJECT_NAME feliratot a kívánt projektnévre EXTRACT_PRIVATE paramétert YES-re Ha mar létezik a doxygen.conf file, akkor ki kell adni a doxygen doxygen.conf parancsot. Ez elkészit egy html, valamint egy latex mappát. A html mappában található egy index.html fájl. Ezt megnyitva érhető el az elkészített dokumentáció. 39

40

Különböző módokban különböző memóriacímek írásával Módok váltása megszakítások segítségével (interrupt) 0xA000 memóriacím Képernyő pixelek színének állítása 0xB000 memóriacím Monokróm szöveg írása 0xB800 memóriacím Színes szöveg írása 41

Különböző platformokon különböző natív megoldások Windows: WinAPI Linux: X server... Léteznek különböző platform független könyvtárak A könyvtárak az adott platform natív megoldásait használják. glut OpenGL Utility Toolkit (C nyelv, elavult) SDL Simple Directmedia Library (C nyelv) Qt Cute (C++ nyelv, nagyon összetett) Nem összetévesztendő: Qt (könyvtár)!= QtCreator (IDE) 42

Egyszerűen használható Eseményvezérelt Támogatott operációs rendszerek Windows Linux Android Példa forráskód és dokumentáció SDL2-window SDL2-loop 43

44

Mi az az OpenGL? Open Graphics Library (nyílt forráskódú grafikus könyvtár) API (Application Programming Interface) Bárki írhat mögé implementációt Egy olyan könyvtár, ami segít a videokártya lehetőségeit kihasználni úgy, hogy ne kelljen a különböző grafikus kártyákra különböző programot írni. 45

FFP Fixed Function Pipeline Az OpenGL működését csak és kizárólag állapotok állításával lehet elérni GLSL OpenGL Shading Language Az OpenGL működését a GLSL programnyelvvel és állapotok állításával is befolyásolni lehet 46

Komponensek [0, 1] intervallumon 0 a komponens nem szerepel a színben 1 a komponens teljes értékkel szerepel a színben RGB színkomponensek Red (piros) Green (zöld) Blue (kék) RGBA színkomponensek Red (piros) Green (zöld) Blue (kék) Alpha (átlátszóság) Főbb színek (0, 0, 0) fekete (1, 1, 1) fehér (1, 0, 0) piros (0, 1, 0) zöld (0, 0, 1) kék 47

Grafikai glitchek kiküszöbölése Az OpenGL a háttér pufferbe rajzol Monitor az előtér pufferből olvas Rajzolás után a puffer felcserélése 48

A képernyő a beállított téglalapba rajzol glviewport(x, y, szélesség, magasság) Az argumentumok pixelekben értendőek Alapértelmezett koordinátarendszer Első bal alsó sarok (-1, -1, 1) Hátsó jobb felső sarok (1, 1, -1) glclearcolor(r, g, b, a) Alapértelmezett: (1, 1, 1, 1) Beállítja a képernyő törlőszínét glcleardepth(v) Alapértelmezett: (1) Beállítja a képernyő mélységértékének a törlőszínét glclear(buffer0 buffer1...) A különböző bufferek a következők lehetnek GL_COLOR_BUFFER_BIT Beállítja a képernyő összes pixelének a színét a beállított színre GL_DEPTH_BUFFER_BIT Beállítja a képernyő összes pixelének a mélységértékét a beállított értékre 49

Alapértelmezetten minden új rajzolt pixel felülírja a már meglévőket A képernyő összes pixeléhez mélységérték rendelése [0, 1] intervallumon 0 közel 1 távol Mélységteszt Csak akkor írja felül az új pixel a régit, ha megfelel az elvárásoknak (közelebb van) Mélységteszt engedélyezése glenable(gl_depth_test) 50

Csúcsadatokat tartalmazó memória megadása glvertexpointer(..) glcolorpointer(..) gltexcoordpointer(..) glnormalpointer(..) x y z r g b x y z r g b x y z r g b Pozíció Szín Pozíció Szín Pozíció Szín Csúcs 0 Csúcs 1 Csúcs 2 51

Csúcsadatok felhasználásnak az engedélyezése glenableclientstate(gl_vertex_array) glenableclientstate(gl_color_array) glenableclientstate(gl_texture_coord_array) glenableclientstate(gl_normal_array) 52

Rajzolás gldrawarrays(..) Rajzolható primitívek 53

Csúcsadatok felhasználásnak a letiltása gldisableclientstate(gl_vertex_array) gldisableclientstate(gl_color_array) gldisableclientstate(gl_texture_coord_array) gldisableclientstate(gl_normal_array) Példa forráskód és dokumentáció SDL2-OpenGL SDL2-OpenGL-simple-draw SDL2-OpenGL-color-draw 54

Textúra koordináták A képhez képest relatív koordináták Szokásos (x, y) helyett (u, v), vagy (s, t) 55

Inicializálás lépésben Textúra azonosító deklarálása GLuint texture; Textúra azonosító generálása glgentextures(1, &texture); A textúra azonosító a függvény hívása után már csak 2D-s textúrával használható glbindtexture(gl_texture_2d, texture); A nyers képpontok betöltése a videokártya memóriába glteximage2d( GL_TEXTURE_2D, 0, belső adatformátum, // GL_RGB, GL_RGBA, GL_BGR, stb. szélesség, magasság, 0, nyers képpont adatformátuma, // GL_RGB, GL_RGBA, GL_BGR, stb. GL_UNSIGNED_BYTE, nyers képpont első elemére mutató tömb); 56

Rajzolás lépésben 2D textúrázás engedélyezése glenable(gl_texture_2d); Rajzolni kívánt textúra meghatározása glbindtexture(gl_texture_2d, texture); Példa forráskód és dokumentáció SDL2-OpenGL-texture-draw 57

58

Rajzoláskor a videokártya minden csúcson végrehajt valamilyen transzformációt. Mire jó? Ugyanaz az objektum kirajzolható több helyre méretben Szemszögből A transzformációk nem a CPU-n, hanem a sokmagos GPUn hajtódnak végre, ezáltal gyorsabb (párhuzamos végrehajtás) Projekció 2D / 3D grafikában minden transzformáció egy mátrixműveletnek felel meg. 59

v 2 v 1 t t V 2 v 0 t V 1 V 0 60

V 2 v 2 V 0 V 1 v 1 v 0 61

V 1 V 2 V 2 V 1 V 0 V 0 62

Mátrix szorzása skalárral Mátrixok összeadása Csak ugyanolyan méretű mátrixot tudunk összeadni 63

Mátrix szorzása mátrixszal N x M méretű mátrixot csak M x P méretűvel lehet beszorozni Az eredmény N x P méretű mátrix A művelet nem kommutatív: A * B!= B * A A művelet asszociatív: A * (B * C) = (A * B) * C 64

N dimenziós koordinátát N x N méretű négyzetes mátrixszal is lehet transzformálni (Lineáris algebra). A transzformációs mátrix sorai az új koordinátarendszer tengelyei a régi koordinátarendszerben. a 0 a 1 a 3 a 4 a 6 a 7 a 2 a 5 a 8 v x v y v z = a 0 vx + a 3 vy + a 6 vz a 1 vx + a 4 vy + a 7 vz a 2 vx + a 5 vy + a 8 vz 65

Egységmátrix (identity matrix) 1 0 0 1 v x v y = v x v y 1 0 0 0 1 0 0 0 1 v x v y v z = v x v y v z 66

Eltolás (translation) Összeadás t x t y + v x v y = t x + v x t y + vy t x t y tz + v x v y v z = t x + vx t y + vy t z + vz 67

Átméretezés az origo középpontjából (scale) Szorzás s x 0 0 s y v x v y = s x v x s y vy s x 0 0 0 s y 0 0 0 s z v x v y v z = s x vx s y vy s z vz 68

Forgatás 2 dimenzióban az origó körül (rotate) Szorzás cos α sin α sin α cos α Forgatás 3 dimenzióban az origó körül (rotate) ll 1 cos α + cos α ml 1 cos α n sin α nl (1 cos α) + m sin α lm(1 cos α) + n sin α mm(1 cos α) + cos α nm(1 cos α) l sin α ln (1 cos α) m sin α mn(1 cos α) + l sin α nn(1 cos α) + cos α 69

CPU M transzformációs mátrix kiszámolása egy objektumra R forgatás (rotate) S átméretezés (scale) M = R * S * R * R GPU Minden csúcs beszorzása a transzformációs mátrixszal Párhuzamos végrehajtás (Single Instruction Multiple Data) M * v = R * S * R * R * v = R * (S * (R * (R * v))) Probléma Szorzás Eltolás művelete? Összeadás 70

A koordináták újabb komponenssel egészülnek ki Homogén koordináta: w 2D: (x, y) -> (w * x, w * y, w) 3D: (x, y, z) -> (w * x, w * y, w * z, w) w értéke általában 1 2D: (x, y) -> (x, y, 1) 3D: (x, y, z) -> (x, y, z, 1) 71

2D 1 0 t x 0 1 t y 0 0 1 v x v y 1 = t x + v x t y + vy 1 3D 1 0 0 1 0 0 0 0 0 t x 0 1 t y t z 0 1 v x v y v z 1 = t x + vx t y + vy t z + vz 1 72

0 3x3 transzformációs mátrix 0 0 0 0 0 1 v x v y v z 1 73

A segítségével különböző mesterséges, vagy élethű transzformációkat tudunk végrehajtani Ortografikus (merőleges) vetítés A távoli és a közeli dolgok ugyanakkorák Perspektivikus vetítés A párhuzamos élek a végtelenben összetartanak A távoli dolgok kisebbnek látszanak, mint a közeliek Homogénkoordináta bevezetésével lehetséges 74

75

OpenGL modelljében a csúcs tényleges pozíciója a képernyőn P * M * v P = projekciós mátrix M = modellnézeti mátrix V = csúcs Ehhez beépített mátrixokat használ GL_PROJECTION GL_MODELVIEW 76

Aktuális mátrix kiválasztása glmatrixmode(mátrix); Mátrix lehet GL_MODELVIEW GL_PROJECTION... Egységmátrix betöltése az aktuális mátrixba glloadidentity(); Aktuális mátrix utószorzása eltolás mátrixszal gltranslatef(x, y, z); Aktuális mátrix utószorzása átméretezés mátrixszal glscalef(x, y, z); 77

Aktuális mátrix utószorzása forgatási mátrixszal glrotatef(szög fokban, tengely x, tengely y, tengely z); Aktuális mátrix felülírása saját mátrixszal glloadmatrixf(saját mátrix mutatója); Aktuális mátrix utószorzása saját mátrixszal glmultmatrixf(saját mátrix mutatója); Aktuális mátrix verembe helyezése glpushmatrix(); Aktuális mátrix feltöltése a veremből glpopmatrix(); 78

Saját mátrix definiálása GLfloat m[16]; m[0] m[1] m[2] m[3] m[4] m[5] m[6] m[7] m[8] m[9] m[10] m[11] m[12] m[13] m[14] m[15] 79

Csonkagúla meghatározása glfrustum(..) OpenGL Utility Library gluperspective() A függvény a glfrustum(..) függvényt használja a megfelelő paraméterekkel. Használatához #include <GL/glu.h> Windows gcc lglu32... LIBS += -lglu32 Linux gcc lglu... LIBS += -lglu 80

81

Ugyanannak a 3D modellnek a kirajzolása...több helyre...több méretben...több irányból A modellt csak egyszer szükséges betölteni A különböző rajzolási transzformációknak elég csak egyegy mátrixot létrehozni 3D modell 3D transzformációs modell 3D transzformációs modell 3D transzformációs modell 82

Ellentétes transzformációk ha hátrafele akarunk mozdulni a kamerával, akkor a transzformációs mátrixnak el kell tolnia az objektumokat előre ha jobbra fordulunk a kamerával, akkor az objektumokat balra kell forgatni a kamera pozíciója körül... 83

Kamera mátrix betöltése M-be M elmentése M utószorzása az objektum transzformációjával Objektum kirajzolása M visszaállítása M elmentése M utószorzása az objektum transzformációjával Objektum kirajzolása M visszaállítása 84

glmatrixmode(gl_modelview); glloadmatrixf(camera_matrix); glpushmatrix(); glmulmatrixf(object_matrix_0); object.draw(); glpopmatrix(); glpushmatrix(); glmulmatrixf(object_matrix_1); object.draw(); glpopmatrix(); 85

86

Olyan doboz, mely magába foglalja az objektumot A doboz élei egymásra merőlegesek Axis Aligned Bounding Box A doboz minden éle a Descartes-koordinátarendszer valamelyik tengelyével párhuzamos Non Axis Aligned Bounding Box A doboz élei nem feltétlenül párhuzamos a Descartes-koordinátarendszer valamelyik tengelyével 87

Min(A,C) A C B Max(B,D) D A két objektum (AB és CD) ütközik (fedi egymást), ha Max(B,D) - Min(A,C) <= (B - C) + (D C) Vagyis, ha a mindkét objektumot befoglaló egyenes kisebb, mint a két egyenes külön-külön. 88

89

del, majd enter kijelölt objektum törlése tab váltás az aktuális és a szerkesztés mód között space felugró parancsablak Csak szerkesztés módban Subdivide Csak objektum módban Add Cube / Monkey / UV Sphere / Cylinder / Torus stb. Minden módban Shade Smooth Shade Flat a minden objektum / csúcs / lap kijelölése n jobb oldali transzformációs panel megjelenítése / eltüntetése egér jobb klikk egér alatt levő objektum kijelölése (shift nyomvatartásával több objektum is kijelölhető) középső egérgomb + egér mozgatása kamera forgatása egér görgő kamera közelítés / távolítása shift + középső egérgomb + egér mozgatása kamera mozgatása a síkjában 90

File / Export / Wavefron (.obj) Bal alul Export obj lenyíló menüben különböző beállítási lehetőségek (a lényegesek felsorolva) Animation Az animáció összes kockáját lementi külön obj fájlokba. Selection only Csak az éppen kijelölés alatt álló objektumot menti el. Write normals Elmenti a csúcsok normálvektorait. Include Uvs Elmenti a csúcsok textúrakoordinátáit. 91

92

Szöveges (olvasható) formátum Definíciókból áll Fontosabb definíciók mtllib anyagtulajdonságokat tartalmazó fájl megadása o új objektum definiálása a megadott névvel Csúcsadatok Három különálló tömb épül fel belőlük. A formátum a tömböt a lapok meghatározásánál használja fel. Az obj formátum szerint a tömb indexelése 1-től kezdődik. v csúcs pozíciójának a megadása vn csúcs normálkoordinátáinak a megadása vt csúcs textúra koordinátáinak a megadása usemtl anyag használata f új lap definiálása Bővebb információ http://en.wikipedia.org/wiki/wavefront_.obj_file 93

f után akármennyi szóköz nélküli karakterlánc lehet a sor végéig Ezen karakterláncokból 4 féle van d 0 d 0 /d 1 d 0 //d 2 d 0 /d 1 /d 2 d 0 csúcs pozíciójának az indexe d 1 csúcs textúra koordinátáinak az indexe d 2 csúcs normálvektorának az indexe Fontos: a tömb indexelése az obj formátum szerint 1-dől kezdődik. Új lap meghatározására példa Háromszög f 1 2 3 f 1//2 3//4 5//6 Négyszög f 1 2 3 4 94

Hasonló az obj-hez Fontosabb definíciók newmtl új anyag létrehozása Kd anyag RGB színkomponenseinek a meghatározása (diffúz) d, vagy Tr anyag átlátszóságának a meghatározása map_kd anyag színének a meghatározása képből Példa forráskód és dokumentáció SDL2-simple-engine 95

96

Saját példakódok és dokumentáció Irrlicht-loop Irrlicht-string Irrlicht-mesh-draw Irrlicht-event-receiver Irrlicht-mesh-collision Irrlicht-fps-camera Hivatalos példakódok http://irrlicht.sourceforge.net/tutorials/ 97

98

Fények matematikája Fények kezelése OpenGL FFP segítségével Animációk részletesen Ütközésdetektálás részletesen Mesterséges intelligencia (AI) Útvonalkeresés Shaderprogramozás (GLSL) Létező játékmotorok részletes ismertetése 99