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

Hasonló dokumentumok
Róth Gergő.

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.

OpenGL és a mátrixok

Számítógépes grafika

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

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

PovRay. Oktatási segédlet

Készítette:

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

Szegedi Tudományegyetem Informatikai Tanszékcsoport SZAKDOLGOZAT. Vadász László

3. Gyakorlat Ismerkedés a Java nyelvvel

SZAKKÉPZÉSI KERETTANTERV a(z) MULTIMÉDIA-ALMAZÁSFEJLESZTŐ SZAKKÉPESÍTÉS-RÁÉPÜLÉSHEZ

14.2. OpenGL 3D: Mozgás a modellben

Cross platform játékmotor + szerkesztő Támogatott platformok

Internet-hőmérő alapkészlet

eseményvezérelt megoldások Vizuális programozás 5. előadás

Számítógépes grafika

DocBook útmutató. Jeszenszky Péter Debreceni Egyetem, Informatikai Kar

2. Gyakorlat Khoros Cantata

Webes alkalmazások fejlesztése 8. előadás. Webszolgáltatások megvalósítása (ASP.NET WebAPI)

1. Mit tárol a memória? 1 pont. 2. Miért kell rendszerlemezzel rendelkeznünk? 1 pont Karikázza be a helyes válasz betűjelét

Adatbázisok I Adatmodellek komponensei. Adatbázis modellek típusai. Adatbázisrendszer-specifikus tervezés

Adatmodellek komponensei

Egységes és objektumközpontú adatbázis-kezelés (2. rész)

Mobil készülékek programozása

Grafika programozása

Budapesti Műszaki- és Gazdaságtudományi Egyetem Villamosmérnöki és Informatikai Kar MIT. Nagyteljesítményű mikrovezérlők tantárgy [vimim342]

Az Oracle rendszer komponensei

Számítógépes grafika

GQ-3x és GQ-4x USB univerzális programozó Kézikönyv

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

Előzmények

NeoCMS tartalommenedzselő szoftver leírása

Eseményvezérelt alkalmazások fejlesztése II 12. előadás. Objektumrelációs adatkezelés (ADO.NET) Giachetta Roberto

Főbb jellemzők INTELLIO VIDEO SYSTEM 2 ADATLAP

.NET Microsoft.Net Framework

CorelCAD 2015 Megjelenítés

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

15. Programok fordítása és végrehajtása

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

Infokommunikációs alkalmazásfejlesztő. Informatikai alkalmazásfejlesztő

Grafikus felületek a programozó szempontjából grafikus elemek absztrakt reprezentációja az egyes elemek tulajdonságait leíró adatstruktúrák.

RIA Rich Internet Application

Tanulási segédlet 4. osztály

strings.xml res/values/strings.xml fájlban hozzuk létre a hiányzó string adatforrásainkat A jelenlegi helyett ez álljon: <resources> <string

Fejlesztői szemmel at K

A MATLAB programozása. Féléves házifeladat. RGBdialog

GPGPU alapok. GPGPU alapok Grafikus kártyák evolúciója GPU programozás sajátosságai

OSZTOTT 2D RASZTERIZÁCIÓS MODELL TÖBBMAGOS PROCESSZOROK SZÁMÁRA

A TechSon Prémium kategóriás DVR-ek beállítása távoli betekintéshez

ScopeImage 9.0. Kamera és képfeldolgozó szoftver. Felhasználói kézikönyv

Grafikus csővezeték 1 / 44

FELÜLET...13 PROJEKTTERV...14

C vagy C++? Programozási Nyelvek és Fordítóprogramok Tanszék. Pataki Norbert. Programozási Nyelvek I.

Diplomamunka. Miskolci Egyetem. GPGPU technológia kriptográfiai alkalmazása. Készítette: Csikó Richárd VIJFZK mérnök informatikus

8. osztály. Felhasznált tankönyv: Pedellus Tankönyvkiadó, Debrecen, 2009; 2009

Hardver modellezés SystemC-vel és SDL grafikus könyvtárral Visual Stúdió alatt

117. AA Megoldó Alfréd AA 117.

DB2 Connect: DB2 Connect kiszolgálók telepítése és konfigurálása

ELŐADÁS SZÁMÍTÓGÉP MŰKÖDÉSE FIZIKA ÉS INFORMATIKA

Minden jog fenntartva, beleértve bárminemű sokszorosítás, másolás és közlés jogát is.

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

GPGPU. GPU-k felépítése. Valasek Gábor

Informatika. Magyar-angol két tanítási nyelvű osztály tanterve. 9. évfolyam

PHP II. WEB technológiák. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) PHP II / 19

Fejezetek a számítógépi grafikából

Operációs rendszerek. A Windows NT felépítése

Spectra Precision GNSS eszközök

libgdx Android Studio alatt

Corel PHOTO-PAINT X5 Maszkolástól nyomtatásig

Programozás 5. Dr. Iványi Péter

AlphaRex 3 digitális programkapcsoló

A Blender használata (8. rész) Az animációkészítés alapjai

SZABADKAI MŰSZAKI SZAKFŐISKOLA. PREZENTÁCIÓ E-mobil tantárgyból Jquery Mobil Keretrendszer SZABADKA, 2015.

Óravázlat. az ECDL oktatócsomaghoz. 5. modul. Adatbáziskezelés. Krea Kft Budapest, Szőlő u 21. Tel/fax: / krea@krea.

OpenGL Compute Shader-ek. Valasek Gábor

Szoftverprototípus készítése. Szoftverprototípus készítése. Szoftverprototípus készítése

A PHP nyelv alapjai. Web-Sky Consulting Kft Tóth Imre 2009

GPGPU-k és programozásuk Dezső, Sima Sándor, Szénási

A SZOFTVERTECHNOLÓGIA ALAPJAI

Nyíregyházi Egyetem Matematika és Informatika Intézete. Fájl rendszer

IBM Data Server ügyfelek telepítése

GÁZTURBINA-OPERÁTOROK TOVÁBBKÉPZÉSÉRE SZOLGÁLÓ SZIMULÁTOR FEJLESZTÉSE

Point of View Android 2.3 Tablet Kézikönyv PlayTab 2 / ProTab 2

Bevezetés a programozásba 2

OpenCL - The open standard for parallel programming of heterogeneous systems

Közbeszerzési Értesítő száma: 2015/108

C programnyelv 1. Kedves Kollegina, Kolléga!

Informatika szintmérő-érettségi tételek február

Minden jog fenntartva, beleértve bárminemű sokszorosítás, másolás és közlés jogát is.

Matematikai alapok. Dr. Iványi Péter

MATEMATIKA TAGOZAT 5-8. BEVEZETŐ. 5. évfolyam

1. Az informatikai eszközök használata

Számítógép labor V. Egyszer Web szerver. Dokumentáció. Készítette: Ács Gergely (K4C03M)

MC3 motorvezérlő nagy távcsőmechanikákhoz

edia 2.2 Kézikönyv feladatfelvitelhez Diagnosztikus mérések fejlesztése Készítette: Molnár Gyöngyvér Papp Zoltán Makay Géza Ancsin Gábor

Robotszerkezetek animációja

Információ-architektúra

A Surfer for Windows használata (8. verzió)

Á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

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 87

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. 88

89

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 90

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 91

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-obj-load 92

93

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/ 94

95

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 96