7. prosince 2017 20:02

Sixteenia #2 - První kostka

Asi je vám jasné, že jakmile jsem přišel ze školy na kolej, tak ten den jsem si už na školu ani nevzpomněl - na to, že mi zbývají pouze dva měsíce na dokončení a odevzdání bakalářky, u které jsem začal pociťovat, že nestíhám, jsem si ani nevzpomněl. Ihned po příchodu na pokoj jsem si stáhnul MonoGame a začal experimentovat.

Na přednášce nám ukázali, jak vykreslit 3D model, což mi v tuto chvíli bylo k ničemu, protože nejdřív je potřeba naprogramovat vykreslení krajiny a až po tom do ní umísťovat modely. A jelikož v mém případě je krajina poskládána pouze z kostek, musel bych vytvořit model kostky a ten pak vykreslovat na milion způsobů. Sice jsem toho moc o programování 3D her nevěděl, ale cítil jsem, že tímto způsobem to nebude dobrý nápad. Nehleďe na fakt, že jsem neuměl se žádným programem pro modelování, takže jsem si tu kostku nemohl ani vyrobit.

Ty kostky (respektive jejich stěny) je potřeba počítat za běhu. A tak jsem si na internetu našel ukázku, jak vykreslit čtverec - respektive dva pravoúhlé trojúhelníky, ze kterých se ten čtverec složí. Ukázka byla jednoduchá, takže nebyl problém ji rozběhnout. Kód byl také jednoduchý, takže nebylo příliš obtížné pochopit, co který řádek dělá. Oproti např. tomu, když jsem zkoušel podobnou ukázku v OpenGL, byl kód této ukázky MonoGame podstatně jednodušší a tímpádem nebyl na první pohled tak odstrašující, jako OpenGL.

Nejsložitější věcí v této ukázce byly transformace - to, co se vykresluje, se musí transformovat tak, aby to bylo před kamerou (na monitoru). K tomu jsou potřeba dvě transformace: transformace pohledu (view), která celou scénu transformuje tak, že kamera se bude nacházet na počátku souřadnic a vše před kamerou bude mít souřadnici Z zápornou (osa Z je kolmá na obrazovku směrem ven). Druhá transformace je projekční, která zpravidla transformuje scénu na perspektivní zobrazení - to znamená, že vzdálenější objekty budou menší, než blízké. Možná to takto vysvětlené zní složitě, ale mně to bylo vcelku jasné, protože jsme se to rok dříve učili ve škole a ještě jsem si to matně pamatoval. Navíc pro vytvoření těchto transformací má MonoGame patřičné metody, které stačí zavolat s požadovanými parametry, takže veškerá matematika za tím schovaná byla přede mnou v tuto chvíli skrytá.

Aplikace, která udělá jen to, že vykreslí čtverec před kamerou, ještě moc 3D nevypadá, a tak jsem si naprogramoval jednoduchý pohyb po scéně (přičítání vektoru o určitém směru podle klávesy k pozici kamery) a otáčení kamery (rotační transformace směrového vektoru kamery). U výpočtů s vektory a transformacemi jsem opět nemusel příliš přemýšlet nad matematikou, protože tyto operace už MonoGame obsahuje - i když ani tak by se o žádnou složitou matematiku nejednalo, pouze sčítání, násobení a goniometrické funkce. Když už jsem měl toto hotové a mohl se po scéně pohybovat kolem svého zatím pouze bílého čtverce, už bylo jasné, že se ten čtverec nachází ve 3D prostoru a já si byl jistý, že jsem právě vytvořil svojí první 3D aplikaci.

Měl jsem bílý čtverec, ok. Pak jsem si řekl, že bych na něj chtěl nanést texturu, a tak jsem pokračoval v googlení. Funkce pro načtení textury už MonoGame obsahuje, takže tento problém představoval přidání asi dvou řádků. Navíc je ještě potřeba definovat u každého vrcholu trojúhelníku další dvě souřadnice UV, které představují pozici na textuře - což je logické, GPU musí někde vzít informaci, kterou část obdelníkového obrázku má zobrazit na trojúhelník. Tyto dvě věci jsem do programu přidal a aplikace poslušně vykreslila můj čtverec s texturou. Měl jsem radost z toho, jak je to s MonoGame jednoduché. Pro zajímavost: moje první textura byla fotka naší kočky z doby, kdy ještě byla kotě.

Ok, měl jsem čtverec. Další mou výzvou byla kostka. K tomu už jsem nemusel nic googlit, protože šlo o pouhé nacvakání dalších souřadnic.

Když jsem to měl hotové a radoval jsem se z toho, jak to funguje, uvědomil jsem si vážnou věc. Já už vím, jak vykreslit 3D kostku i s texturou a k tomu ještě kolem ní "chodit" pomocí klávesnice. A to znamená, že už umím základ pro vykreslení světa v Sixteenii! V tuto chvíli mi přišlo až směšné, jak jednoduché toho bylo dosáhnout po mých marných pokusech s OpenGL.

Abych si byl opravdu jistý, tak jsem si narychlo nakreslit texturu bloku hlíny s trávou a hodil ji na moji kostku. Takto vypadala moje umělecké dílo v zápalu nadšení:

Textura

Moje nadšení se asi mohlo rovnat zhruba tomu, jako když nějaký náš prapředek vynalezl kolo, jen v mém případě to byla kostka. S vědomím, že už umím kostku, jsem šel v klidu spát a snil jsem o tom, jak naprogramuju Sixteenii. To jsem ještě netušil, kolik dalších problémů je potřeba vyřešit, abych tu Sixteenii mohl naprogramovat. Stejně jako kolo nestačí k tomu, abychom mohli vyrobit auto, tak kostka nestačí k tomu, abychom mohli naprogramovat celou hru.

A co bylo nejhorší - vůbec jsem si neuvědomoval, že mi na dveře klepe deadline bakalářky.

Hodnocení

Celkové hodnocení
3 hlasy
Vaše hodnocení
Vyberte počet hvězdiček

Komentáře

Jméno:
Předmět:
Komentář:
  :):-|:P:D;):(8)[evil][arrow][idea][?][!]
Kontrola:
Žádné komentáře.
© 2011 - 2024 SuperMartas a Tomáš Hypeš