Už podruhé zdravím všechny ty z vás, kdož jste se nezalekli tvrdého boje s pixely a s krysami v rukou čekáte na další porci pokecu o grafice. Dnes se vrhneme na grafiku třídimenzionální a na základní problémy s tím související. Minule jsem mluvil o úplných základech techniky práce v grafickém programu a nakousnul jsem něco málo o stínování. Budu předpokládat, že tyhle věci už máte zažité a pár obrázků odzkoušených, takže se po hlavě vrhneme na to nejsložitější - trojrozměrnou grafiku. Jak jistě sami uznáte, vytvořit 2D text v jedné barvě a 3D reálný dům v plném světle bude něco trochu jiného. Proto jsem tady, abych vám v praktických věcech poradil, jak na to. Nejprve si musíme shrnout nejdůležitější zákonitosti reálného trojrozměrného prostoru, které budete muset chtě nechtě vzít za své, jinak byste veškeré své úsilí předem zničili. Takže:
1) Pro 3D prostor se v celém světě používá soustava souřadnic o osách x,y,z v uspořádání, jaké ukazuje obr.1. Středem 3D prostoru je průsečík os. Důležitý pojem je "kamera" - tj. bod v prostoru, ze kterého se díváte na určitý objekt.
2) veškeré linie obrazu vodorovné s osou "z" se sbíhají v jednom bodě v nekonečnu (tomu se říká "perspektiva"). Tzn. že čím více budete nějaký objekt posunovat ve směru osy "z" směrem od vás, tím bude tento objekt menší. U os "x" a "y" je jejich chování mnohem složitější. Představte si čtverec umístěný v prostoru rovnoběžně s osou "y" a kolmý na osu "z" (obr.2). Takto bude čtverec vypadat, pokud byste se na něj ve skutečnosti dívali z hodně velké dálky. Pokud by byla kamera umístěna v bezprostřední blízkosti tohoto čtverce, začne perspektiva deformovat obě osy "x" a "y" podle toho, kde přesně se bude kamera nacházet. Vysvětlím prakticky:
Nejprve umístíme kameru v malé vzdálenosti od čtverce, a to přímo na osu "z". Pokud byste se ve skutečnosti z takovéhoto místa podívali na čtverec, budete jej vidět přesně jako na OBR.3 - linie rovnoběžné s osou "x" budou mít tvar elipsy a budou tím víc zaoblené, čím větší bude jejich vzdálenost od osy "x" a čím blíže bude kamera středu soustavy souřadnic. Stejně se budou chovat linie rovnoběžné s osou "y". Ještě složitější to bude v případě, že se kamera nebude nacházet přímo na ose "z", ale někde mimo ní v prostoru. Tam si už perspektiva a její zalomení dělá s tvary objektů doslova co chce. Musíte totiž brát v potaz zakřivění linií souběžných se všemi třemi osami souřadnic a jejich průniky. Pokud budete potřebovat nakreslit reálně se chovající diagonálu se souřadnicemi (1,0,1) a (0,1,0), pak to přesně provést prakticky není možné bez doplňkových výpočtů. U trojrozměrné grafiky na počítači se používá zjednodušeného modelu, kdy se předpokládá, že se linie nekřiví podle elipsy, ale osy "x" a "y" se chovají stejně jako "z", tzn. linie souběžné s osami "x" a "y" se scházejí v nekonečnu ve směru těchto os. Příklad je uveden na obr.4 - takto bude ve zjednodušené podobě vypadat v 3D prostoru kvádr. Tvar není úplně přesně odpovídající skutečnosti, protože jednotlivé tři body, v nichž se křivky sbíhají tady není možné nakreslit v nekonečnu. Berte to pouze jako ilustraci.
3) světlo a jeho zákonistosti. Před konečným návrhem 3D objektu v prostoru si nejprve vždy zvolte zdroj světla. Doporučuji pomyslnou "lampu" umístit tak, aby na objekt svítila šikmo zepředu (tedy zprava nebo zleva). Tak dosáhne objekt správné plastičnosti. Zákonitosti jsou následující:
nejsvětlejší část objektu je ta, jejíž plocha svírá se zdrojem světla pravý úhel (tzn. že na něj padá světlo přímo), čím víc se bude úhel osvětlení lišit od pravého úhlu, tím bude ta která plocha objektu tmavší. Praktická ukázka osvětlení objektu je na obr.5 (všimněte si tvaru křivek v reálné perspektivě)
4) pohyb v perspektivě. Tady pozor! Pokud budete chtít animovat pohyb objektu v prostoru, musíte si uvědomit, že v každém okamžiku pohybu objektu se neustále mění perspektiva, zakřivení a směr jednotlivých linií objektu. Nejlépe je nejprve vykreslit objekt v počátečním stavu a potom ve stavu dokončení pohybu - teprve pak rozkreslujte objekt v jednotlivých fázích animace.
Doufám, že se vám z toho všeho ještě netočí hlava - pokud ano, tak na chvíli zapomeňte na nějakou prostorovou grafiku a jděte se na chvíli projít. Mno a jestli ještě něco vydržíte,tak se podíváme na to úplně nejsložitější, s čím se setkáte - kreslení různě zaoblených (tedy nelineárních a nerovinných) objektů. Zákonitosti jsou prakticky stejné (jak u vlastního tvaru, tak i osvětlení), ale chce to dlouhodobý cvik. Nakreslit lidskou tvář tak jak by měla vypadat, je podle mě to absolutně nejsložitější a technicky nejnáročnější. Pokud s grafikou teprve začínáte, zkuste napřed jednoduché prostorové objekty, jako krychle, koule, nejrůznější prohnuté roviny, jejich kombinace apod. Pak přistupte ke komplexnějším tvarům, jako stůl, židle, jednoduchý dům apod. Až tohle všechno technicky zvládnete, můžete zkusit složitější tvary...
A teď zase pár rad pro praktické kreslení (všeobecně): už jednou jsem si posteskl nad velikostí barevné palety u Atari ST. Proto znovu radím - ať už kreslíte cokoliv, snažte se to dělat v co nejméně barvách, ať vám jich zbyde dostatek na stínování. Obrázek může mít sice deset různých barev, ale pokud nebude kvalitně stínovaný, vždycky bude vypadat, jakoby ho kreslilo malé dítě. Ještě horší je situace, pokud budete nuceni kreslit grafiku do dema nebo hry. Tam NIKDY nebudete mít k dispozici všech 16 barev. Kodeři jsou totiž divná zvířátka a velice často spoustu barev rezervují pro svoje vlastní skopičiny, a na ty jim nesmíte sáhnout. Pro příklad uvedu malý citát podmínek, které mi dal Intuition/CZEX při přípravě jednoho screenu pro doposud nevydané megademo FallingUp: "Chci po tobě dvě loga, která budou najednou na obrazovce, jedno u horního okraje, jedno u dolního, každé jinak barevné. Pozadí musí být černé a nepoužívej barvy 1-6, protože je potřebuju na rolující texty a 3D efekty...". To znamená, že mi pro volné použití zůstalo 10 barev, přičemž jedna z nich musí být černá. A to ještě zdaleka není nejhorší případ - jednou mi Intuition dovolil použít 3, slovy "tři" barvy + čtvrtou jako pozadí. No a s tím pak dělejte nějaká kouzla... V takovém případě se teprve ukáže, kdo umí a kdo zase ne. Pokud už budete donuceni použít víc barev, pak zvolte následující taktiku: Budete například muset mít na obrazovce najednou obrázek v následujících pěti barvách
- bílá, červená, žlutá, zelená a modrá. Jako první si namíchejte nejsvětlejší odstíny těchto barev, jaké budete potřebovat a potom ke každé z nich ještě dva tmavší odstíny co nejblíže sobě (takže například k bílé barvě ještě namícháte světle šedou a tmavěji šedou). Nejsvětlejším odstínem vždy nakreslete základní barevný tvar a ty dva tmavší odstíny používejte na stínování a antialiasing. Pokud tohle dostanete tzv. "pod kůži", tak dokážete nakreslit obrázky hýřící barvami a přesto dobře stínované. Celkem dobře je tato technika použitá např. u her Dungeon Master a Chaos Strikes Back - je v nich relativně hodně barev, ale přitom přijatelně stínovaných.
A teď je ten správný čas na to, abych vám představil další velice odporně a nevyslovitelně znějící slovo - tím je "dithering", jehož doménou jsou slabší třídy počítačů, jako naše Atari ST nebo Amiga 500. Jde o další kouzlo, kterým dostanete z počítače více barev, než je obvyklé. Dithering je česky možné volně přeložit jako "vytečkovávání". Tento postup využívá toho efektu, že kombinací dvou barev lze získat barvu třetí. Ale jak to provést? Jednoduše - víte, jak vypadá šachové pole? Samozřejmě - pravidelně se v něm střídají čtverce černé a bílé barvy. Kdybyste se na šachovnici podívali z hodně velké dálky (tak, abyste nerozeznali jednotlivé čtverce), bude vám šachovnice připadat, jako by celá měla šedou barvu. A jsme u jádra foxteriera - dithering je přesně o tomhle - dvě barvy zkombinujete tak, že je budete nanášet pixel po pixelu jako šachovnici. Schválně zkuste myší na tmavém pozadí nanášet jednotlivé pixely bílé barvy do tvaru šachovnice. Potom odstupte od obrazovky a šachovnice se změní v jednolitý čtverec šedé barvy. Pro dithering se ovšem takto kontrastní odstíny nepoužívají, protože při pohledu z blízka (nebo při pohledu na monitor) by pak kresby vypadaly velice křečovitě. Dithering používejte při míchání odstínů jedné barvy, například při smíchání RGB 555 a RGB 444 dostanete šedý odstín přesně mezi těmito dvěma odstíny (takový RGB 4.5,4.5,4.5). Pokud si zvolíte slušné odstíny barev v paletě, můžete tak nakonec na obrazovce vytvořit dvakrát i třikrát víc barev, než kolik vám nabídne skromná paleta. A s tím už se dá něco podniknou, no ne? Dithering chce ale čas a zkušenosti. Vaše první výtvory s dithringem budou vypadat odpudivě, placatě a vůbec všelijak, jenom ne tak, jak jste si to představovali. Bude vám chvíli trvat, než zjistíte, které barvy a odstíny míchat můžete a které už zase ne a co všechno si dithering nechá líbit, aby obrázek při jeho použití neztrácel reálnost. To všechno chce hlavně praxi. Takže zkoušejte, malujte, ditherujte, antialiasujte, pixelujte a pošlete nám své výtvory do Narsilu. Ty nejlepší z nich se pak objeví v dalším čísle v dalším pokračování tohoto seriálu o grafice. Takže neváhejte a posílejte své výtvory na disketě na adresu NARSILu. Každému z vás, kdo se odhodlá a aněco pro nás nakreslí, ode mě dostane nějaké překvápko. Samozřejmě se může ozvat každý, kdo má nějaký problém ohledně grafiky a neví si s ním rady. Všem se pokusím pomoci a osobně odpovědět.
Příště se - kromě jiného - podíváme na: raytracing (co to vlastně je, jak to funguje a k čemu je to dobré), jak počítačem zobrazit 3D grafiku pomocí výpočtů, jak tvořit animace a pod. Ale to všechno až příště, do té doby na počtenou se loučí
Trauma/CZEX