Metody 3D grafiky (4. část, kamera)

Ostatní jazyky Petr Lite 3D grafika Metody 3D grafiky (4. část, kamera)

... pokračování z minulé lekce

V závislosti na typu programu můžeme volit různé způsoby pohledu na scénu. Zde si rozebereme několik typických případů kamer.

1. Pohled 1. osoby

Při pohledu 1. osoby je kamera nastavena tak, aby svět viděla očima postavy hráče. U postavy mravence je animace kamery jednoduchá - stačí neustále kameru nastavovat stejně jako souřadnici a směr otočení postavy hráče. Musíme přitom zajistit, aby kamera byla neustále nad terénem v takové výšce, jak to odpovídá postavě hráče (přesněji výšce očí hráče).

S výškou pohledu nad terénem je spojen ještě efekt dojmu rozměru prostoru (už jsme se o tom zmínili v lekcích k bludišti 3D). Čím je pozorovací výška vyšší, tím se okolní prostor zdá menší. Naopak obrovských rozměrů docílíme tím, že výšku pohledu položíme velmi nízko. Je to dáno zkušenostmi hráče z reálného světa. Rozměry prostředí hodnotí podle výšky svého obvyklého pohledu v reálném světě, proto by měla výška pohledu odpovídat obvyklé výšce průměrného člověka. Například zvolíme-li takové měřítko světa, kdy vzdálenost 1 jednotka odpovídá rozměru 1 metr a podle toho budeme budovat i rozměry objektů (například stromek vysoký 3 jednotky, tj. 3 metry), pak by výška pohledu měla být kolem 1,7. Vyskytují se dokonce i hry, kde hráč může nastavit svou výšku v reálném světě a podle toho program přizpůsobí výšku pohledu, aby hráč viděl měřítko 3D světa ve správných proporcích tak, jak je zvyklý z reálného světa.

Menší komplikace nás čekají v případě auta a letadla. V tom případě musí kamera sledovat nejen pozici, otočení a výšku dopravního prostředku, ale také jeho naklánění ve směrech X a Z. Abychom mohli přenášet na kameru i rotace naklánění postavy, musíme v těchto případech upravovat i pořadí rotací prováděných s kamerou.

2. Odstřelovač

Odstřelovač je zvláštní modifikací pohledu 1. osoby. Vychází ze základního nastavení kamery 1. osoby s tím rozdílem, že přes obrazovku položí masku zaměřovacího kříže, čímž jednak zúží pohled hráče a jednak mu umožní přesně zaměřit cíl. Promítací rovinu od pozorovatele oddálí a tím zvětší měřítko zobrazení (=zoom). Hráč může posouváním vzdálenosti promítací roviny klávesami Home a End měnit zvětšení pohledu, scénu si přibližuje a oddaluje.

Krátké zastavení nad použitím slov odstřelovač a ostřelovač. Slovo ostřelovat znamená, že nějaký objekt kropíme palbou, tedy neustále ostřelujeme. Zpravidla je to dlouhá akce a často bez valného výsledku. Zatímco pokud něco odstřelíme, zpravidla to zprovodíme ze světa. Může to být například odstřel budovy, což je jednorázová akce. Proto je správný překlad slova sniper jako odstřelovač, protože jeho úkolem je někoho jednorázově zprovodit ze světa, tedy odstřelit, pokud možno jednou správně mířenou ranou. Nemá za úkol kropit nepřítele opakovanou palbou. Naopak, označíme-li odstřelovače slovem ostřelovač, může se urazit, protože ho označujeme za neúspěšného kropiče.

3. Pohled 3. osoby

Při pohledu 3. osoby pozorujeme postavu hráče z pohledu jakoby nezúčastněné osoby, koukající se na scénu přes hráčovo rameno. Při nastavení kamery použijeme souřadnici hráče se směrem otočení a kameru posuneme o určitý úsek dozadu za něj. Výšku nad terénem zpravidla nastavujeme o kousek výše než je postava hráče, protože jinak by nám postava překážela ve výhledu. V tomto módu kamera nesleduje naklánění postavy hráče.

V módu 3. osoby se mohou vyskytnout některá úskalí. Menším úskalím je zneužívání módu hráčem, který si natáčením může zajistit vidění za roh, aniž je viděn jinými protihráči. Větším úskalím je, že se kamera za hráčem dostává do míst, kam se nemá dostávat - pod úroveň terénu, za budovy, či postavu ztrácíme z dohledu překrytím jiným objektem. Rozsáhlejší hry to řeší tak, že překrývající objekty (stromy) zprůhlední, aby byla postava hráče neustále viditelná. Má-li se kamera dostat za úroveň terénu, posune se do bezpečné oblasti. Tato opatření jsou již příliš náročná a tak se obvykle spokojíme s kompromisy - například pod terén podložíme velkou plochu s barvou terénu, aby podhled pod terénem nebyl tak výrazný, a překryv velkými objekty řešíme programově - objeví-li se kamera na zakázaném místě, snížíme vzdálenost kamery k hráči nebo kameru zvedneme.

4. Plovoucí kamera

Plovoucí kamera vychází z pohledu 3. osoby. Pohled 3. osoby je vhodný pro rychlé akce, ale v pomalejším módu může působit zmatení pohledu, kamera se chová příliš chaoticky a hráč může ztrácet přehled o hře. Pro účely pomalejších her je vhodnější plovoucí kamera, která také sleduje hráče z pohledu 3. osoby, ale s určitým zpožděním. Kamera se jakoby táhne za hráčem a snaží se neustále dostat na pozici odpovídající 3. osobě. To je vhodné například při ovládání auta, protože namísto neustále se zmítajícího okolního světa pozorujeme jak se auto natáčí a zrychluje, čímž získáme přesnější cit pro jeho chování a lépe se přitom orientujeme v prostředí.

Přechod z kamery pro 3. osobu na plovoucí kameru je poměrně jednoduchý. Namísto toho, abychom přímo nastavovali souřadnice kamery, uložíme si údaje do proměnných jako požadovaný koncový stav. Poté měníme vlastnosti kamery tak, že k aktuálnímu stavu přičítáme rozdíl mezi požadovaným a souřasným stavem vynásobený konstantou rychlosti reakce kamery a uplynulým časem. Díky tomu se kamera chová tak, že při velkém rozdílu vlastností se na cílovou pozici přesouvá nejdříve rychle, ale jakmile pozici již téměř dosahuje, rychlost přesunu klesá.

Trochu náročnější je dotahování rotace podle osy Y. Úhel otočení je cyklický, s hodnotami 0 až 360°, proto nemůžeme zjistit rozdíl otočení jen jako jednoduchý rozdíl směrů. Po odečtení aktuálního a koncového stavu musíme rozdíl nejdříve normalizovat - posunout úhel do rozmezí hodnot -180° až +180° (přičtením či odečtením 360°). Teprve až pak můžeme směr dokorigovávat postupným přičítáním rozdílu.

5. Rámová kamera

Rámová kamera je pohled na scénu shora (přesněji trochu zešikma) tak, aby postavu hráče udržovala v určitých mezích, v pohledovém rámu. Ve středu pohledu je určitá oblast, ve které se postava může pohybovat volně. Překročí-li určité hranice, kamera se začne posouvat spolu s postavou.

Mód je vhodný obzvláště v kombinaci s ovládáním myší, kdy hráč klikáním do terénu určuje postavě, kam se má přesunout. Volná oblast ve středu rámu zajišťuje, aby se kamera zbytečně neposouvala při jakémkoliv pohybu postavy hráče, což přispívá k udržení přehledu o scéně. Na druhou stranu je třeba ponechat přiměřeně široké okraje rámu, aby hráč viděl dostatečně daleko před postavu a nevystavoval se tak nějakému nebezpečí útoku nepřátel. Nejlépe umožňuje-li program i během hry měnit měřítko zobrazení a s ním i šířku okrajů rámu (zpravidla při změně měřítka zůstane velikost volné oblasti nezměněná a mění se jen okraje).

Rámová kamera se zpravidla nenatáčí do různých směrů, ale sleduje scénu vždy jen z jednoho směru. Hráči to pomáhá v orientaci ve scéně, kdy ví kterým směrem se co nachází a kterým směrem se pohybuje. Pokud program s tímto konstantím směrem počítá, nemusí to znamenat pro hráče žádné omezení, protože nevhodné kombinace pohledů se dají ošetřit už v době návrhu scény nebo později programově - například aby se hráč nedostal do skrytého místa za budovu kde by se mohl ztratit.

Sklon kamery v tomto módu bývá poměrně svislý, kdy není příliš velký rozdíl měřítka v přední a zadní části pohledu. Proto stačí sledovat pozici hráče jen jako obdélníkovou, s daným rozptylem ve směru X a Z. Dostane-li se postava mimo dané rozmezí hranic, souřadnice kamery se zkorigují tak, aby se postava objevila opět v povolených mezích.

6. Automatická kamera

Automatická kamera představuje soustavu statických kamer rozmístěných po ploše terénu, které se automaticky přepínají podle pozice hráče. Tento mód je vhodný například u závodů aut, kdy nahrazuje sledování závodu pevnými kamerami rozmístěnými podél trati.

Přestože se to může zpočátku tak zdát, ve skutečnosti nevytváříme více objektů kamer. Objekt kamery může být vždy jen jeden. Jediné, co pro více kamer potřebujeme, je seznam souřadnic X a Z statických kamer. Seznam sestavíme z prvku plochy, který jsme použili ke generování terénu z plochy. Pomocí přepínače 1 si na mapě vyznačíme místa, kde se budou kamery nacházet. Při startu programu mapu projdeme a kde najdeme příznak kamery, souřadnice kamery si uložíme do seznamu statických kamer.

Během obsluhy automatických kamer neustále opakovaně procházíme seznam kamer a vyhledáváme kameru, která je postavě hráče nejblíže. Přitom přidáváme určitý bonus kameře, která je zrovna aktivní. To je z toho důvodu, aby se nám nepřepínala kamera při opakovaném přecházení přes určitou hranici mezi kamerami. Přepnutí kamer je pro hráče matoucí a proto je třeba je minimalizovat a přepínat jen v případě nutnosti. Proto je vhodné udržet aktuální kameru pokud možno déle.

Po nalezení nejbližší kamery nastavíme souřadnice objektu kamery na souřadnice nalezené statické kamery. Výšku kamery nastavíme podle výšky terénu v místě kamery.

Kamera musí samozřejmě postavu hráče sledovat, tj, automaticky se za ní otáčet. Úhel natočení kamery podle osy Y zjistíme z rozdílů souřadnic postavy hráče a kamery. Využijeme k tomu prvek úhel bodu, s malou korekcí, protože je orientovaný jinak než směr otáčení ve 3D.

Pří výpočtu sklonu kamery podle osy X (tj. úhel a na předešlém obrázku) známe absolutní výšku kamery y, výšku postavy hráče nad terénem h (pro letadlo si výšku uchováváme z obsluhy animace letadla, pro ostatní uvažujeme 0) a výšku terénu v místě postavy hráče t. Z rozdílu výšek určime výšku kamery nad rovinou hráče c. Z rozdílů souřadnic postavy hráče a kamery vypočteme vzdálenost postavy od kamery d, můžeme k tomu využít funkci vzdálenost bodu. Úhel sklonu a potom určíme ze vzniklého pravoúhlého trojúhelníku pomocí funkce úhel bodu.

7. Statická kamera

Statická kamera je pouze zjednodušeným případem automatických kamer. Jedná se o jedinou statickou kameru umístěnou ve středu scény, která sleduje postavu hráče podobně jako automatické kamery. Zjednodušením je to, že nemusíme procházet seznam kamer a vyhledávat nejbližší kameru, jinak je obsluha pohledu kamery stejná.

8. Přehledová kamera

Posledním typem kamery je přehledová kamera. Je to celkový pohled na scénu shora, jako na jednu velkou mapu. Obsluha kamery je jednoduchá, potřebujeme ji pouze umístit do správné pozice a nastavit jí vhodné měřítko zvětšení pohledu.

U přehledové kamery musíme zajistit viditelnost celého terénu, aby nám části terénu nezmizely například kvůli omezení vzdálenosti dohledu nebo kvůli zakrytí mlhou. Proto pro tyto účely mlhu vypínáme (stejně jako oblohu) a vzdálenost dohledu máme přednastavenou dostatečně velikou. Objekty ve scéně by měly umět řešit snižování viditelnosti se vzdálenosti - například aby při přehledovém módu úplně zmizely, jinak bude renderování pohledu příliš časově náročné.

U přehledové kamery nepotřebujeme nutně vidět přímo postavu hráče, ale potřebujeme vidět, kde se hráč nachází. To zajistíme indikátorem. V našem progamu používáme čtvercovou plochu o dostatečné velikosti, která je umístěná kousek nad hráčem a průběžně jeho pozici sleduje (na snímku je to červený puntík vlevo nahoře).

.... pokračování příště


 

Stáhnout

Staženo 177x (6.09 MB)
Aplikace je včetně zdrojových kódů v jazyce Petr Lite (jsou obsaženy v EXE souboru, který lze v programu přímo otevřít)

 

  Aktivity (1)

Článek pro vás napsal Panda38
Avatar
Programátor C++, WinAPI, ASM.

Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!


 


Miniatura
Všechny články v sekci
3D grafika
Miniatura
Následující článek
Metody 3D grafiky (5. část, obloha)

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!