V minulých FLOPech jsme se zabývali problematikou zobrazování prostorových obrázků. Chtěl bych se k tomuto tématu vrátit, i když poněkud z jiného úhlu.
Nepůjde mi nyní ani tak o to, aby byl na monitoru vidět 3D obraz, půjde mi hlavně o to, jak zobrazit 3D objekty, jak je "rozplácnout" na dvojrozměrném monitoru.
Jde o "objev" zvaný perspektiva. O co jde? Všichni jste se s ní setkali. Jde o věrohodné zobrazení skutečnosti. Představte si, že se někam postavíte a na něco se podíváte: potom si před sebe dáte skleněnou desku (nebo malířské plátno) a viděnou skutečnost přesně obtáhnete. Kdykoliv se na tento obraz poté podíváte - uvidíte obraz skutečnosti z původního místa. Nejtypičtějším příkladem perspektivního zobrazení je obyčejná fotografie.
Co to má ale společného s počítačovou grafikou? Jistě znáte hry typu EIDOLON na ATARI, či hry WOLF, DOOM, DESCENT či HERETIC na PC. V těchto hrách se pohybujete jakoby reálným prostředím, popsaným prostorovými souřadnicemi. Nyní půjde o to, jak přepočítat dané trojrozměrné souřadnice na dvojrozměrné - pro povrch obrazovky, které bude sloužit jako "okno do světa". Rychlost našeho počítače (navíc v BASICu či TBASICu) rozhodně nestačí na animace typu DOOM. Půjde tu o vypočítání statického obrazu.
Hlavním tématem je tedy to, jak promítnout prostorový objekt, popsaný třemi souřadnicemi x, y a z (respektive objekt tvořený více body o více trojicích souřadnic) na rovinu. Zavrhněme hned z počátku všechny pravoúhlé a jiné průměty a věnujme se rovnou perspektivnímu zobrazení.
Dosti však teorie, popíšu vám nyní krátké (T)BASIC prográmky STEREO?.BAS. Pokusím se nezabíhat příliš do matematických složitostí. Abyste mohli postup využívat, je pro Vás důležitější přesně pochopit CO chci udělat než JAK to udělám.
Nejdříve si musíme definovat podmínky. Představte si nějaký 3D souřadný systém, tři osy x, y a z tak, že:
V tomto souřadném systému si v libovolných jednotkách zvolíme několik bodů o souřadnicích x, y a z (viz 10 bodů v posledních DATA řádcích na konci obou programů).
Nyní si musíme ještě zvolit odkud se na objekt budeme dívat. Oko má v tomto případě 6 stupňů volnosti, což znamená, že jeho polohu a směr pohledu můžeme popsat 6 čísly. První tři jsou normální souřadnice pozorovatele, další tři jsou nejlépe tři úhly otočení pozorovatele okolo tří os.
Tady ovšem nastává potíž. Záleží totiž na tom, v jakém pořadí budeme okolo os otáčet. Otočení např. o 10 stupňů okolo x, o 20 stupňů okolo y a o 30 stupňů okolo z není totéž jako otočení o 20 stupňů okolo y, o 30 stupňů okolo z a o 10 stupňů okolo x!!
Zvolme si tedy například:
Základní pohled bude od +x k -x, +y bude vpravo, -y vlevo, +z nahoře a -z dole.
Dále si zvolme otáčení nejdříve okolo osy z (otáčení hlavou doleva a doprava - vrtění hlavou "NE") o úhel fi tak, že otočení doprava odpovídá kladné výchylce.
Potom budeme otáčet okolo osy y (kývání hlavou "ANO") o úhel ro tak, že kladná výchylka bude dolů.
Nakonec otočíme hlavu okolo x (položení hlavy na levé či pravé rameno) o úhel psi tak, že kladná výchylka bude na pravé rameno.
JENŽE ouha. Vy otočíte hlavu o úhel fi okolo z; třeba otočíte hlavu doprava o 30 stupňů. Dále můžete pokračovat dvojím způsobem:
Totéž samozřejmě při otáčení okolo x.
Oba systémy mají své výhody a nevýhody. První systém zřejmě používá virtuální realita (i o ní byl již ve FLOPu článek), kdy snímáme ABSOLUTNÍ souřadnice pozorovatele v prostoru (STEREO1.BAS).
Druhý systém je možná poněkud logičtější a více se blíží původnímu zadání otáčení hlavy nejprve doleva - doprava, nahoru - dolů a na levé - pravé rameno. Předpokládám, že druhý systém vám bude asi užitečnější (STEREO2.BAS).
Oba programy mají podobnou strukturu. Nejdříve se z DATA řádků načte počet zobrazovaných bodů, dále souřadnice pozorovatele XP, YP, ZP, FI, RO, PSI a zvětšení K. To je definováno jako konečná vzdálenost Vašeho oka od obrazovky a je udávána v pixelech (bodech) obrazovky v gr. 8 (obrazovka má rozměry 320x192 bodů). Následuje dimenzace polí X(), Y(), Z() pro "POCET" bodů a rezervace XF() a YF() pro jejich výsledné "obrazovkové" souřadnice a načtení prostorových souřadnic.
Tím máme definované počáteční podmínky. U varianty 1 máme možnost pro nejkomplikovanější výpočet (otočení) předpočítat si koeficienty matice A11..A33, u verze 2 si alespoň předpočítáme siny a cosiny úhlů
!!! Těmto operacím NEMUSÍTE bezpodmínečně rozumět, popisuji je tu jen velmi stručně pro úplnost. Pokud někoho zajímá matematický postup, jak dojít k v programech uvedeným vztahům, ať se na mě obrátí.
Vlastní přepočet se děje v cyklu FOR I=1 TO POCET ... NEXT I
Nejprve se vypočítají pro každý bod souřadnice XT, YT a ZT - souřadný systém se "posune" tak, aby bylo oko v počátku.
Dále se u varianty 1 vypočítají pomocí tří rovnic a koeficientů A11..A33 souřadnice X, Y a Z - souřadný systém se otočí okolo tří os tak, že se díváme ve směru osy X... tak jak je definována standartní situace.
U varianty 2 tento krok musíme dělat natřikrát za pomoci proměnných XX1, YY1, ZZ1, XX2, YY2 a ZZ2. Výsledkem jsou opět souřadnice X, Y a Z za standartních podmínek.
Na závěr se ještě pomocí podobnosti trojúhelníků konečně promítnou standardizované souřadnice na monitor (XF(I), YF(I)). Ty se ještě pro kontrolu vypíší na obrazovce.
To je celé. Další část programu od řádku 380, resp. 400 je jen krátká ukázka, jak dané body vykreslit (po stisku klávesy START). Na tomto místě může být Váš (rozsáhlý) program, jak a kde předpočítané souřadnice zobrazit.
Teď trochu fantazie: Dovedu si na tomto místě představit např. program který zajistí výpočet DVOU obrázků, jeden každý pro jedno oko a zobrazit je současně, buď každý na svou polovinu obrazovky či zobrazit je červeně a modře "přes sebe" tak aby při pohledu přes barevné brýle vznikl opravdu skutečný vjem prostorového obrázku. Možná že se k tomuto tématu ještě někdy dostanu.
Shrnutí:
V zadaném souřadném systému:
Do DATA řádků zadáte počet bodů, souřadnice XP, YP, ZP, dále úhly (ve stupních) FI, RO a PSI (definované podle dané varianty) a nakonec vzdálenost oka od obrazovky v pixelech.
Dále už jen zadáte trojice souřadnic zvolených bodů.
Po proběhnutí cyklu najdete v polích XF a YF vypočítány přímo obrazovkové souřadnice (pro PLOT a DRAWTO).
Nyní si pomocí vlastního programu vlastním způsobem (nahrazením části programu or řádku 380, resp 400) vykreslíte obrázek na monitoru. Je ale nutné ošetřit velikosti souřadnic XF(I) a YF(I), aby měly reálnou hodnotu a nechtěly být vykreslovány mimo monitor.