01 March, 2025

Square Tile

Možností ako vygenerovať na počítači 3D povrchový pevninový terén je niekoľko. V čase, keď ešte neexistovali grafické knižnice s priamym prístupom ku grafickej karte, nebolo možné vykresľovať grafický obraz na monitore počítača v dostatočnej kvalite obrazu zodpovedajúcej realite sveta. Do veľkej miery sa používali výpočty klasickej matematiky z oblasti analytickej geometrie v rovine a priestore bez nadštandardných grafických možností a tiež fakt, že väčšina hier bola koncipovaná ako dvojrozmerná, vo forme 2D obrazu, aj keď 3D obraz bol až do konca 90.tych rokov koncipovaný síce vyzerajúci ako 3D obraz, ale v skutočnosti sa jednalo o 2D obraz s ilúziou 3D obrazu. Väčšinou sa používala priemetňa vo forme 3D izometrického pohľadu, namiesto perspektívneho zobrazenia v zmysle stredového premietania. Malo to svoje opodstatnenie, pretože vzhľadom na nižšie počítačové výkony sa nepredpokladala častá manipulácia s pohľadovými súradnicami, teda boli dlhú dobu statické a pohybovali sa objekty umiestnené v scéne. 

Jedným s prístupov bolo možné použiť z praktických dôvodov na vykreslenie terénu časť plochy vo forme štvorca. Iné prístupy zahŕňali vykreslenie terénu vo forme šesťuholníkov alebo iných matematických útvarov. V každom prípade štvorec sa javil ako efektívny spôsob vykreslenia plochy, pretože bol jednoduchý na obsluhu vykresľovacej slučky, kedy bolo intuitívne zrejmé, že sa bude štvorec generovať len v pravouhlých smeroch, čo dobre korešponduje s jednotlivými cyklami v slučkách.

Ukážka z 8-bitovej hry Highway Encounter z roku 1985


Éra 8-bitových počítačov poskytovala množstvo hier, ktoré vykazovali 2D obraz, ale mnohé z nich boli situované vo forme 3D scény, alebo sa takto aspoň javili. Jednou z takýchto hier bola aj hra Highway Encounter z roku 1985. Podobných hier s dlaždicovým štvorcovým typom terénu, pevniny nebolo veľké množstvo, ale veľa hier obsahovali izometrický pohľad.

Simulovať v dnešnej dobe pevninový terén vo forme štvorcových dlaždíc (square tile) v priamom tvare, nie je veľmi výhodné. Pre takto generovaný obraz bez použitia doplnkových grafických knižníc je nutné programovať riešenie viditeľnosti (v starých hrách sa používal dlhú dobu klasický tzv. maliarsky algoritmus), mapovanie obrázkov na štvorce bez podpory grafického urýchľovača, čo z praktického hľadiska bolo pre vtedajšiu dobu veľmi neefektívne a pomalé v zmysle vykreslenia scény, ak uvažujeme, že 1 sekunda obrazu pozostáva minimálne z 25 snímkov, aby bol zabezpečený plynulý pohyb obrazu. Aj z toho dôvodu sa grafické aplikácie, hry, neprogramovali v takomto grafickom rozpoložení.

Na druhej strane je to zaujímavá jednoduchá priamočiara technika vykresľovania obrazu, 3D scény vo forme dlaždicového terénu.

Za týmto účelom som použil cudzí zdrojový kód zo siete Github od mnohých autorov veľmi podobne vyzerajúceho zdrojového kódu, takže už prakticky nie je možné zistiť pôvodného autora, keďže každý autor si zdrojové kódy upravil na svoj obraz.

Moje úpravy existujúcich zdrojových kódov sa nachádzajú na tomto odkaze: https://github.com/mtt-git/square-tile

Je to zdrojový kód v jazyku C a grafickej knižnici SDL na vykreslenie štvorcových dlaždíc v 3D priestore vo forme terénu.

Konkrétne som upravil časť pre načítavanie celého riadku zo súboru do pamäte počítača. Táto činnosť bola realizovaná už pomerne archaickou funkciou getline() ešte z čias pôvodnej verzie jazyka ANSI C a ktorá už pre novšie prekladače nefunguje celkom správne, resp. je exkludovaná z pôvodnej verzie hlavičkového súboru stdio.h. Novšia funkcia je fgets(), ktorou som nahradil pôvodnú funkciu getline() a prispôsobil vstupné parametre a odstránil prebytočné uvoľňovanie bufferu a definovanie jeho ukazovateľa na NULL, pretože si to funkcia fgets() nevyžadovala v explicitnom tvare. Pre novšiu verziu grafickej knižnice SDL3 sa mi nepodarilo program skompilovať, pretože vykazoval niektoré nezrovnalosti v rámci nekonzistentných verzií niektorých volaných funkcií v programe, takže som musel ostať pri pôvodnej verzii SDL2. Tiež som upravil zadávanie externého súboru z parametra konzoly funkcie main() na explicitne zadanú pri načítavaní súboru.

Algoritmus štvorcových dlaždíc generuje úsečky (SDL funkcia SDL_RenderDrawLine()) z definovanej bodovej dvojrozmernej mriežky pozostávajúcej z bodov v súradniciach x, y, z, v Euklidovom trojrozmernom priestore. Dve súradnice v smere x a y sú apriori definované bez možnosti editácie, zmeny polohy súradníc. Tretia súradnica, z, je definovaná prostredníctvom externého súboru, ktorý pozostáva z čísel oddelených prázdnou medzerou. Každá uvedená číslica reprezentuje súradnicu z s uvedenou mocnosťou, výškou terénu (niekde sa uvádza pre tento systém názov tzv. height mapa, výšková mapa). Teda, jednotlivé riadky a stĺpce reprezentujú mriežku terénu, súradnice x a y a jednotlivé čísla reprezentujú výšku v smere osi súradnice z v danom umiestnení bodu v mriežke terénu. 

Z každého bodu so súradnicami x a y sa generuje úsečka, čiara z jedného bodu do každého ďalšieho bodu v kolmom, pravouhlom smere.

Terén s horizontálnou a vertikálnou časťou jedného políčka, gridu

Takýmto spôsobom vznikne štvorec v izometrickom zobrazení. Teda, generujú sa úsečky, čiary, tak, aby vznikla spojnica medzi každým číslom v kolmom, pravouhlom smere.

Terén s jedným políčkom, gridom

Analogickým spôsobom môžme vytvoriť terén s vyvýšenou plochou vo forme "kopca".

Terén s vyvýšenou časťou mriežky

Podobné terény sa vyskytovali v mnohých počítačových hrách 8-bitovej éry, ale aj v novších retro hrách. Hra Minecraft používa podobný systém generovania terénu, avšak na báze tzv. diamond square algoritmu, kedy sú jednotlivé vyvýšenia terénu koncipované v pravouhlom, kolnom smere, takže to vyzerá ako určité schody, proste diskrétne prechody.

SDL ako grafická knižnica nepodporuje priame vykresľovanie 3D objektov, napr. trojuholníka, polygónu, aj keď trojuholník sa ako matematický objekt nepovažuje za trojrozmerný objekt. Jedná sa o to, že takýto 3D objekt by mal byť definovaný v trojrozmernom euklidovskom priestore, teda každá zo súradníc, vrcholov z ktorých pozostáva objekt, by mala byť modifikovateľná v 3D priestore, v troch súradniciach, x, y a z. A toto priamo SDL knižnica nepodporuje, len v spojitosti s ďalšími dodatočnými knižnicami, avšak tie sú už na báze grafickej knižnice DirectX, takže sa už neoplatí používať SDL ako knižnicu, ktorá by mala mnohé procesy zjednodušovať.

Ono, trojuholník ako taký nie je problém a nemusel by figurovať pri samotnom vykresľovaní, ale problém je ten, že väčšina grafických kariet podporuje práve vykresľovanie pomocou trojuholníkov, kedy sa rapídne zvyšuje výkon grafickej aplikácie. Principiálne je možné aj na štvorcové elementy generovať textúry, obrázky a kedysi v začiatkoch vývoja hier a grafických aplikácií sa to takto programovalo.

Takže dôvod prečo sa zaoberať metodológiou tvorby trojuholníkov je ten, že tzv. priemyselné grafické štandardy DirectX a OpenGL používajú práve tento typ trojuholníkového vykresľovania. Aj keď si človek dokáže sám naprogramovať veľa obslúžnych funkcií ohľadne grafického vykresľovania bez použitia DirectX alebo OpenGL, nedokáže priamo naprogramovať prístup k hardwaru grafickej karty. Čiastočne to je možné naprogramovať, ale je to zložité programovanie a niektoré fundamenty sú na báze "know how", ktoré nie je možné naimplementovať v domácich podmienkach. Takže v princípe nie je možné naprogramovať nový DirectX/OpenGL.
Share:

0 comments:

Post a Comment