Lovíme minotaury (2. část, ovládání)

Ostatní jazyky Petr Lite 3D grafika Lovíme minotaury (2. část, ovládání)

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

Ponořme se do světa našeho 3D bludiště. Vše, co je k tomu potřeba udělat, je upravit nastavení kamery. Vyberte si některé volné políčko a nastavte souřadnice kamery X a Z podle jeho souřadnic. Souřadnici Y nastavte na hodnotu 0.5 a případně ještě otočte kameru podle osy Y. Souřadnice kamery budeme často potřebovat a proto si je uchovejte do proměnných souřadnice X kamery a souřadnice Y kamery ve skupině ovládání, kterou si připravte v poli společných proměnných.

Program spusťe. Myslím, žebudete dojmem příjemně překvapeni.

Zkuste si trochu pohrát se souřadnicí Y. Všimněte si, jak výška nad zemí mění dojem rozměrů prostředí. Změníte-li výšku nad terénem na 0.1, získáte dojem, že jste malá myška v obrovské hale. Naopak výška 2 vytvoří dojem, že bludiště je domečkem pro Barbínky. Člověk si přináší sebou zkušenosti z reálného světa. Proto i měřítka objektů ve scéně musí přibližně odpovídat běžné výšce člověka.

Od dojmu velikosti prostředí se odvíjíi rychlost pohybu. Máte-li dojem, že se ve 3D pohybujete příliš pomalu, změníte dojem snížením výšky nad terénem. Pak vypadá prostředí větší a i rychlost pohybu vypadá větší.

Přidáme ovládání pohybu hráče. Nejdříve otáčení, to je nejjednodušší. Vytvořte si veskupině ovládání podskupinu konstanty a připravte si tam číselnou proměnnou rychlost otáčení. V inicializaci programu ji nastavte na hodnotu 5. Obsahy proměnných je možné nastavovat též přímo úpravou proměnné, ale pro větší názornost tutoriálů to budeme dělat raději příkazy během inicializace.

Do hlavní smyčky programu doplňte skupinu ovládání hráče. Nejdříve vybertekameru (ID=1) jako aktivní objekt. Kamera je totiž očima hráče, proto ji budeme ovládat. Při stisku klávesy vlevo změníme rotaci podle osy Y o připravenou konstantu rychlosti otáčení. Mohli bychom to udělat přímo přičtením/odečtením konstanty, stejně jako u tutoriálu se Zeměkoulí. Ale to má jednu nevýhodu - takové animace jsou silně závislé na rychlosti počítače. Proto máme k dispozici jeden prvek, uplynulý čas. Prvek navrací čas (v sekundách), který uběhl od doby posledního vykreslení snímku 3D grafiky. Přesněji, navrací čas, který uběhl mezi posledními dvěmi obsluhami čekání. Přidáme-li jako parametr prvku požadovanou rychlost, navrátí se uběhlý ča svynásobený touto rychlostí. Nezapomeňte, že počítáme s desetinnými čísly. Uplynulý čas se měří s přesností mikrosekund.

Obsluha otáčení vpravo je obdobná, pouze má opačné znaménko. Program spusťe a vyzkoušejte otáčení doleva a doprava.

Pohyb vpřed a vzad bude trochu složitější, vyžaduje již trochu matematiky. A také detekci kolizí. Nejdříve si připravte konstantu rychlost vpřed, kterou nastavíte v inicializaci na hodnotu 2. Podobně konstanta rychlost vzad, nastavte ji na hodnotu -1 (záporná hodnota, abychom hodnotu při pohybu nemuseli negovat). Zpravidla pohyb vzad bývá pomalejší než pohyb vpřed.

Pro pohyb vpřed a vzad použijeme společnou funkci, nazveme ji pohyb vpřed a vzad. Funkce bude později detekovat i kolizi sestěnami bludiště a s ostatními aktery hry. Bude mít jeden vstupní parametr, rychlost pohybu. Připravíme si v ní dvě místní proměnné, nová souřadnice X a nová souřadnice Z. Novou souřadnici X vypočteme jako násobek sinu aktuálního směru otočení Y s uběhlým časema rychlostí pohybu, výsledek přičteme k souřadnici X. Obdobně vypočteme novou souřadnici Z, jen použijeme cosinus a souřadnici Z. Vypočtené nové souřadnice nejdříve jen jednoduše uložte do proměnných souřadnice X a Z kamery, později doplníme detekci kolizí. Na závěr aktualizujte pozici kamery nastavením prvků posun ve směru X a posunve směru Z.

Program spusťte a vyzkoušejte pohyb vpřed i vzad při různých směrech natočení. Při špatném výpočtu by se vám mohlo stát, že se jedním směrem pohybujete správně, ale v jiném směru je pohyb opačný.

Teď už si můžeme naše 3D prostředí prohlédnout trochu důkladněji zevnitř. A jak vidíme, nezvolili jsme správné osvětlení. Strop je příliš přesvětlený a tmavé zdi příliš tmavé. Napravíme to přidáním prvku rozptýlené světlo ze skupiny grafika / 3Dgrafika / osvětlení a nastavením světle šedé barvy. Rozptýlené světlo je všudypřítomné osvětlení, nezávislé na zdroji světla. Implicitně je to šedá barva s jasem 0.25. Zvýšením jasu přisvětlíme tmavé zdi. Strop by byl i při tomto rozptýleném světle ještě tmavý, proto u něj ponecháme prvek svítivosti, ale snížíme trochu vyzařovaný jas. Výsledek vypadá už trochu líp.

Teď nás čeká detekce kolizí. Hráč samozřejmě nemůže procházet skrze zdi. Detekce kolizí bývá často slabým místem u mnoha her. Jednou z chyb bývá nedostatečná detekce, kdy hra testuje příští pozici pohybu pouze v přímém směru a tak neodhalí případ, kdy hráč prochází kolem rohu budovy a vidí dírou ve zdi dovnitř. Nebo se dokonce o roh zdi zasekne. Další hrubou chybou je případ nesouladu detekcí, kdy hra nechá hráče dostat se do místa, ze kterého se nemůže pohnout pryč. A posledním případem, který sice není přímo chybou, ale je pro hráče nepříjemný, je případ, kdy hráč prochází kolem zdi a o zeď se zarazí, musí couvnout a držet se od zdi dál. Správné chování je, aby hráč po překážkách sklouzával.

První funkcí, kterou budemek detekci kolizí potřebovat, je test políčka na jedné souřadnici. Funkce dostane na vstupu souřadnice X a Z a jejím úkolem je zjistit, jestli příslušnépolíčko na této pozici je průchozí. Příznak průchodnosti je navrácen na výstupu funkce. Kvůli správnému převodu na celá čísla i pro souřadnice menší než 0 je přičtena ještě korekce +1, která je po oříznutí desetinné části opět odečtena.

Z důvodu principu 3D grafiky se objekty vykreslují až od určité minimální vzdálenosti. Proto nemůžeme hráči povolit přiblížit se až tesně ke stěně, jinak by se ve stěně objevila díra a hráč by viděl srkze ni. Pro tento účel si připravíme další konstantu, odstup od zdi hráče. Její hodnotu nastavte v inicializaci na 0.3. Testy průchodnosti proto musíme dělat nepřímo testováním určité souřadnice, ale testováním souřadnic v určitém rozsahu.

Později budeme testovat i kolizi s ostatními aktery hry, proto si připravíme prázdnou funkci testkolize s aktery. Bude mít vstupní proměnné IDaktera dotazu, testovaná souřadnice X a testovaná souřadnice Z. Na výstupu bude navracet logický příznak souřadnice je průchodná. Zatím v obsahu funkce jen nastavíme návratovou hodnotu na ano.

Další funkcí bude test průchodnosti na jedné souřadnici. Funkce má podobný vstup a výstup jako předešlá funkce, opět souřadnice X a Z a příznak průchodnosti dané souřadnice. Funkci použijeme k testu průchodnosti i pro ostatní aktery hry (tj. i pro nepřátele) a proto přidáme další 2 vstupní proměnné, IDaktera a odstup od zdi. Pomocí předchozí funkce test políčka na jedné souřadnici budeme testovat průchodnost pozice ve 4 bodech, vzdálených od testované pozice o odstupod zdi.

Body jsou posunuty odtestované pozice v diagonálních směrech. Vzhledem k tomu, že stěny jsou vždy větší než šířka testované oblasti a jsou orientovány pravoúhle, jsou tímto testem zajištěny všechny případy přiblížení se ke zdi, včetně rohů. Kromě testů políček doplníme ještě test kolize sostatními aktery hry.

Vrátíme se opět k funkci pohyb vpřed a vzad. Nově vypočtené souřadnice jsme zatím jen uložili do aktuálních souřadnic. Oba příkazy nyní vezmeme a vložíme je do podmínky testující, zda je nově vypočtená souřadnice průchozí. Jako aktera přitom zvolíme kameru, tedy ID=1. Pokud není průchozí, otestujeme pozici s novou souřadnicí Z a starou souřadnicí X. V případě průchodnosti nastavíme novou souřadnici Z, souřadnici X necháme původní. Tím zajistíme sklouzávání po objektu vesměru Z. Obdobně zajistíme sklouzávání ve směru X.

Program opět vyzkoušejte. Zkuste si procházení bludištěm. Tentokrát byste se již neměli žádným způsobem dostat za stěny či do děr vestěnách a po stěnách byste měli plynule klouzat.

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


 

Stáhnout

Staženo 251x (761.62 kB)
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?
Celkem (1 hlasů) :
55555


 


Miniatura
Všechny články v sekci
3D grafika

 

 

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í!