Róth Gergő
[email protected]
1
Oktatók
Bejárás nem kötelező
◦ Smidla József (
[email protected]) ◦ Róth Gergő (
[email protected])
Tárgy adatai ◦ ◦ ◦ ◦
Gyakorlati Nem kötelező Szabadon választható Neptun kód - VEMISVSA32J
Tananyag (példakódok, dokumentációk, stb.)
Aláírás feltétel
Jegy kialakítása
Ajánlott irodalom
◦ smidla.mik.uni-pannon.hu/jatek ◦ oktatas.mik.uni-pannon.hu
◦ Rövid (15 perces) ZH a szorgalmi időszak végén ◦ Beadandó feladat készítése csapatban ◦ Vizsgán történő bemutatás ◦ 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
Játékmotor
Ha a játékos guggol, akkor lassabban megy
Megjelenítés
Ha a játékos eléri a fát, akkor új pálya betöltése
Matematika
Ha a játékos meghal, akkor a legutóbbi mentés betöltése
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
Használata gcc-vel
Használata QtCreator-rel
◦ 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 ◦ gcc –std=c++11
◦ .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
nullptr kulcsszó bevezeté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 ◦ NULL és 0 helyett használható ◦ Példa int *array = nullptr;
30
31
Include
Példány deklarálása
◦ #include
◦ std::vector array; ◦ Példa std::vector array;
Példány deklarálása inicializációval együtt ◦ std::vector array = {item0, item1, ...}; ◦ Példa std::vector 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
Példány deklarálása
◦ #include <map>
◦ map::map 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
Ciklus, ami végigmegy a tároló minden elemén
◦ container.size();
◦ 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 doxygenVERSION-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
RGB színkomponensek
RGBA színkomponensek
◦ 0 – a komponens nem szerepel a színben ◦ 1 – a komponens teljes értékkel szerepel a színben ◦ Red (piros) ◦ Green (zöld) ◦ Blue (kék)
◦ ◦ ◦ ◦
Red (piros) Green (zöld) Blue (kék) Alpha (átlátszóság)
◦ ◦ ◦ ◦ ◦
(0, (1, (1, (0, (0,
Főbb színek 0, 1, 0, 1, 0,
0) 1) 0) 0) 1)
– – – – –
fekete fehér piros zöld 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 ◦
◦
(-1, -1, 1)
(1, 1, -1)
Hátsó jobb felső sarok
Alapértelmezett: (1, 1, 1, 1) Beállítja a képernyő törlőszínét
glClearDepth(v) ◦
Első bal alsó sarok
glClearColor(r, g, b, a) ◦
Az argumentumok pixelekben értendőek
Alapértelmezett koordinátarendszer ◦
glViewport(x, y, szélesség, magasság)
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
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
Beállítja a képernyő összes pixelének a színét a beállított színre
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 ◦ ◦ ◦ ◦
x
glVertexPointer(..) glColorPointer(..) glTexCoordPointer(..) glNormalPointer(..)
y
z
r
Pozíció Csúcs 0
g Szín
b
x
y
z
r
Pozíció Csúcs 1
g Szín
b
x
y
z
r
Pozíció
g
b
Szín
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
v2 v1
t V2’ t V1’
v0
t
V0’
60
V2’
V1’
v2
V0’ v1
v0
61
V1’
V2
V2’
V1
V0’
V0
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. 𝑎0 ∗ 𝑣𝑥 + 𝑎3 ∗ 𝑣𝑦 + 𝑎6 ∗ 𝑣𝑧 𝑎0 𝑎3 𝑎6 𝑣𝑥 𝑎1 𝑎4 𝑎7 ∗ 𝑣𝑦 = 𝑎1 ∗ 𝑣𝑥 + 𝑎4 ∗ 𝑣𝑦 + 𝑎7 ∗ 𝑣𝑧 𝑎2 ∗ 𝑣𝑥 + 𝑎5 ∗ 𝑣𝑦 + 𝑎8 ∗ 𝑣𝑧 𝑎2 𝑎5 𝑎8 𝑣𝑧 65
Egységmátrix (identity matrix) 1 0
𝑣𝑥 𝑣𝑥 0 ∗ 𝑣 = 𝑣 1 𝑦 𝑦
1 0 0
0 1 0
𝑣𝑥 𝑣𝑥 0 0 ∗ 𝑣𝑦 = 𝑣𝑦 𝑣𝑧 𝑣𝑧 1
66
Eltolás (translation) ◦ Összeadás
𝑣𝑥 𝑡𝑥 + 𝑣𝑥 𝑡𝑥 + 𝑣 = 𝑡 + 𝑣𝑦 𝑡𝑦 𝑦 𝑦 𝑣𝑥 𝑡𝑥 + 𝑣𝑥 𝑡𝑥 𝑡𝑦 + 𝑣𝑦 = 𝑡𝑦 + 𝑣𝑦 𝑣𝑧 𝑡𝑧 + 𝑣𝑧 𝑡𝑧
67
Átméretezés az origo középpontjából (scale) ◦ Szorzás
𝑠𝑥 0
𝑠𝑥 ∗ 𝑣𝑥 𝑣𝑥 0 ∗ 𝑣 = 𝑠 ∗ 𝑣𝑦 𝑠𝑦 𝑦 𝑦
𝑠𝑥 0 0
0 𝑠𝑦 0
𝑣𝑥 𝑠𝑥 ∗ 𝑣𝑥 0 0 ∗ 𝑣𝑦 = 𝑠𝑦 ∗ 𝑣𝑦 𝑣𝑧 𝑠𝑧 ∗ 𝑣𝑧 𝑠𝑧
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) 𝑙𝑙 1 − cos α + cos α 𝑚𝑙 1 − cos α − 𝑛 sin α 𝑙𝑚(1 − cos α) + 𝑛 sin α 𝑚𝑚(1 − cos α) + cos α ln(1 − cos α) − 𝑚 sin α 𝑚𝑛(1 − cos α) + 𝑙 sin α
𝑛𝑙 (1 − cos α) + 𝑚 sin α 𝑛𝑚(1 − cos α) − 𝑙 sin α 𝑛𝑛(1 − cos α) + cos α
69
CPU
GPU
Probléma
◦ 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
◦ 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))) ◦ 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 0
0 1 0
𝑣𝑥 𝑡𝑥 + 𝑣𝑥 𝑡𝑥 𝑡𝑦 ∗ 𝑣𝑦 = 𝑡𝑦 + 𝑣𝑦 1 1 1
3D 1 0 0 0
0 1 0 0
𝑣𝑥 𝑡𝑥 + 𝑣𝑥 0 𝑡𝑥 𝑣𝑦 𝑡 + 𝑣𝑦 0 𝑡𝑦 ∗ = 𝑦 𝑣𝑧 𝑡𝑧 + 𝑣𝑧 1 𝑡𝑧 1 1 0 1 72
3𝑥3 𝑡𝑟𝑎𝑛𝑠𝑧𝑓𝑜𝑟𝑚á𝑐𝑖ó𝑠 𝑚á𝑡𝑟𝑖𝑥 0
0
0
𝑣𝑥 0 0 ∗ 𝑣𝑦 𝑣𝑧 0 1 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];
𝑚[0] 𝑚[1] 𝑚[2] 𝑚[3]
𝑚[4] 𝑚[5] 𝑚[6] 𝑚[7]
𝑚[8] 𝑚[12] 𝑚[9] 𝑚[13] 𝑚[10] 𝑚[14] 𝑚[11] 𝑚[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 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)
Max(B,D) D
C A
B
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
Add Cube / Monkey / UV Sphere / Cylinder / Torus stb.
Shade Smooth Shade Flat
◦ Csak objektum módban ◦ Minden módban
”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 ◦ ◦ ◦ ◦
d0 d0/d1 d0//d2 d0/d1/d2
d0 – csúcs pozíciójának az indexe d1 – csúcs textúra koordinátáinak az indexe d2 – 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
f123 f 1//2 3//4 5//6
f1234
◦ Négyszög
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