World of Tanks II

Je podzim a píše se rok 2021, právě jsme skončili jeden z nejsložitějších projektů, na kterém jsme dosud pracovali. Tomáš nás již delší dobu strašil další nadcházející hrou, nechtějíce prozradit, oč jde. Brzy jsme se dozvěděli, že půjde o 3D hru. Když vezmete v potaz, že jsme zatím programovali jen jednoduché, graficky nenáročné hry v úplně jiné dimenzi, byl to pro nás trochu šok. Naštěstí jsme začali jednoduše několika čarami v nové grafické knihovně OpenGL. Náš cíl byla 3D tanková multiplayer hra, inspirovaná starou arkádovkou BZFlag.

Nestává se úplně každý rok, aby měl člověk na kroužku partu, se kterou se dá pustit i do tak náročného projektu. Ale tahle pětice se začala trhat ze řetězu už během svého druhého roku programování. Paradoxně tomu možná napomohla i ta pandemie, kdy kroužek chodil za dětmi domů a jim se nechtělo končit, takže programovali dlouho do večera.

Jednou dokonce (naštěstí druhý den byl nějaký svátek) mě Maty mučil svými otázkami až do čtvrt na dvanáct do noci, ale to byl opravdu extrém, většinou trápí své učitele přes den ve škole, když spěchají na další hodinu. Nedávno dokonce přiměl pana učitele Schovánka (díky, máte můj nekonečný obdiv!), aby mu hodinu po vyučování soukromě vysvětloval nějakou pokročilejší matematiku a jeho otázky typu „jak se numericky integruje na kulové ploše“ poletují po Voděradské někde mezi kabinetem matematiky a fyziky do teď.

Když se řekne 3D

Jak začít? Konsultoval jsem to se svým bývalým studentem, abych učil OpenGL dostatečně moderně. Kryštof mi připravil kostru a poradil i některé dobré zdroje informací. Za námět jsme zvolili hru s nepříliš komplikovanými objekty. Vlastně jsme ji skoro celou složili z kvádrů, aby i fyzika byla snadná a zbyly nám síly na různé grafické vychytávky a samotný herní princip.

V našem kroužku ovšem nepoužíváme hotový 3D engine, naopak jsme si vymysleli svůj vlastní, abychom se naučili přemýšlet o objektovém programování. Třeba takový tank s otáčející se věžičkou je krásný příklad na práci se stromovou strukturou, což každý informatik ocení. Je to sice těžší způsob, na začátku dá hodně práce, ale stojí za to! A dneska už přidáváme hlavně herní funkce a program skoro každou hodinu umí něco nového.

Programování grafických karet

Moderní grafické karty obsahují čip, který umí rychle počítat výpočty potřebné k zobrazení trojrozměrné grafiky. Na rozdíl od mikroprocesoru v počítači, kde náš program běží v jeden okamžik jednou, grafická karta obsahuje obrovské množství malých procesůrků, které pracují najednou, jakoby stovky malířů malovali na jedno plátno ve stejný okamžik.

Tyhle procesůrky se programují v jazyku, který velice připomíná naše Céčko. Jen je trochu víc zaměřený na matematiku a postupně se učíme nové a nové triky, třeba jak vypočítat úhel, pod kterým dopadá osvětlení a jak změní barvu objektu.

GLSL shader pro nasvícenou texturu

Propojování oborů

Úplné základy trojrozměrné grafiky nejsou zase tak složité, třeba zjistíme, že projekce na obrazovku je ve své podstatě jen o podobnosti trojúhelníků, o které jsme se učili ve škole, stačí si to dobře nakreslit:

3D souřadnice a projekce do obrazovky

„Ale počkat počkat,“ povídá Pavel, „proč mě nutíš vymýšlet vzorečky, to musí OpenGL umět rovnou samo!“ a zůstal na kroužku o hodinu déle, než všichni ostatní, jenom aby to zkusil.

OpenGL bylo těžké téma a vyžadovalo nakreslit velké množství hodně barevných tabulí, ale mám radost, když pak se nám podaří najít průsečíky s tím, co dělají (nebo budou dělat) děti ve škole, aby měly pocit, že jim školní znalosti k něčemu jsou a že se propojují s tím, co pak děláme při programování.

OpenGL všechny tabule

Na co se můžete těšit příští rok?

Protože se jedná o velký projekt, naprogramoval jsem si ho také, abych si předem vyzkoušel, co a jak nejlépe a nejjednodušeji udělat, aby to bylo dobře stravitelné i pro studenty na vyšším gymplu. Těšte se na hrbolaté textury, vlající vlajky, svítící náboje nebo zrcadlově lesklá jezírka. A samozřejmě také propojíme několik hráčů po síti ;-)