IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

Metódy 3D grafiky (3. časť, ovládanie)

... pokračovanie z minulej lekcie

V ďalšej lekcii si rozoberieme možnosti ovládania postavy v hre. Použijeme k tomu postavičku mravca, ktorú sme získali z hry Kóta 236. Nebudeme sa zaoberať jej animáciou, len jednoducho použijeme ukazovatele súradníc postavy X a Z, smer otočenie okolo osi Y a prípadne ešte sklon pohľade okolo osi X.

1. Základné ovládanie

Pri základnom ovládaní postavou len otáčame do strán šípkami vľavo a vpravo, šípkami vpred a vzad sa pohybujeme. Pri otáčaní len jednoducho pripočítajú alebo odpočítajú od uhla otočenia okolo osi Y konštantu (rýchlosť otáčania) vynásobenú uplynulým časom. Prvok uplynulý čas meria čas od minulého priechodu hlavnej slučkou (presnejšie čas medzi dvoma naposledy vyrenderované snímky). Násobením rýchlosti uplynulým časom zaistíme, že program pobeží vždy rovnakou rýchlosťou nezávisle na tom, ako je rýchly počítač a obsluha vykresľovanie grafiky.

Pri pohybe vpred a vzad vychádzame z nákresu podľa nasledujúceho obrázku. Jedná sa o pohľad na terén zhora. Smer otočenie okolo osi Y znamená otočenie okolo zvislej osi v smere hodinových ručičiek, pričom nulový smer je v smere kladnej osi Z. Požadovanú vzdialenosť jedného úseku kroku vypočítame vynásobením uplynulého času konštantou rýchlosti pohybu. Zmenu súradnice X potom zistíme vynásobením úseku kroku funkcií sin uhla otočenia. Zmenu súradnice Z zistíme vynásobením úseku kroku funkcií cos uhla otočenia.

3D grafika

Pre pohyb vpred i vzad môžeme s výhodou použiť jedinú funkciu (parametrom bude rýchlosť pohybu), ktorú budeme využívať aj u ostatných spôsobov ovládania. Okrem posunu súradníc môže funkcie riešiť i detekciu kolízie a prehrávanie zvuku chôdze.

3D grafika

2. skĺzavaniu

Ovládanie sa sklouzáváním je rozšírením predošlého základného ovládania o detekciu sklonu. Sklon terénu spôsobuje, že sa postava pohybuje do kopca ťažko (pomalšie) az kopca ľahšie (zrýchli), prípadne do väčších svahov sa vôbec nedostane. Tým môžeme pomerne prirodzene riešiť hranice terénu - hráč sa nedostane mimo terén, pretože mu bráni strmé svahy.

V obsluhu skĺzavaniu riešime samostatne, nezávisle na sebe, skĺznutiu v smeroch X a Z. Rozlišovaciu hranice pre skĺzavaniu takto síce nebude presná, bude závislá na smere, ale vyhneme sa určovanie smerníkov sklonu terénu

Najskôr si pripravíme pomocnú premennú, udávajúce mieru sklonu terénu v príslušnom smere (X alebo Z). Nebudeme presne riešiť uhol sklonu, stačí nám len akési pomernej číslo. To vypočítame z rozdielov výšok terénu v smeroch mierne posunutých od aktuálnej pozície, rozdiel vynásobíme konštantou určujúci vplyv skĺzavaniu.

Ak presiahne miera skĺzavaniu určitú hranicu, prebieha skĺzavaniu. V tom prípade pripočítame k danej súradnicu hodnotu miery sklonu vynásobenú uplynulým časom. Samozrejme ak sa ku skĺzavaniu pridáva vplyv aktivity hráčov, môže hráč vybehnúť terén i pri miernom skĺzavaniu. Pri veľkom svahu už vlastnou aktivitou skĺzavaniu nevykoriguje a tak sa do takého svahu už nedostane. Na maximálnu rýchlosť hráča treba dať pozor pri návrhu miest, kam sa hráč nemá dostať, aby nemohol nastať prípad, že sa hráč vyhrabe na nepatričné miesto napríklad s využitím záchytných zlomov v teréne.

3D grafika

3. Rozšírené ovládanie

Rozšírené ovládanie je trochu bohatší ako základné. V tomto móde umožňujeme hráči meniť rýchlosť, drží ak súčasne pri pohybe prešmýkač klávesy Shift. Bežne klávesy Shift rýchlosť zvyšujú. Aktivuje Ak hráč prešmýkač Caps Lock, bude rýchlosť trvale zvýšená a klávesy Shift ju budú naopak spomaľovať. Interne zaistíme obsluhu klávesy Shift tým spôsobom, že si pripravíme pomocné číslo použité ako násobok všetkých ostatných rýchlosťou, v závislosti na stisku Shift.

Klávesy vľavo a vpravo budeme obsluhovať bežným spôsobom, tj. Zmenou smeru otočenie hráča. Ak je však súčasne s klávesmi držaný prešmýkač Alt, nevykoná sa otočenie, ale úkrok hráča do strany. Aby sme mohli pre úkrok použiť rovnakú funkciu akú používame aj pre pohyb vpred a vzad, použijeme malý úskoky - hráča otočíme o 90 ° vľavo alebo vpravo, vykonáme krok vpred a hráča zas otočíme späť.

Ďalšou doplnkovou funkciou rozšíreného ovládania je zmena sklonu pohľadu. Ak použije hráč klávesy PageUp alebo PageDown, nakláňa sa pohľadová kamera nahor alebo nadol. Musíme pritom obmedziť maximálny uhol náklonu, teda akési hraničné zarážky. Pri riešení dorazov pamätajte na to, že uhly nemusí mať vždy len rozsah -180 ° až + 180 °, rovnako platné uhly sú trebárs aj 270 ° (čo zodpovedá uhlu -90 °). V ukážkovom programe je naklonenie kamery menené len programovo, preto sa počíta s intervalom -180 ° až + 180 °. Ak by sme však používali prvok uhla X z Petra, ten je normalizovaný do rozsahu 0 ° až 360 ° čo znamená, že záporné číslo sa zmení na veľké číslo menšie ako 360 °. Preto je treba pred kontrolou hraníc buď uhol normalizovať do známeho rozsahu alebo testovať hraničné intervaly pre viac variantov normalizácie.

3D grafika

4. Kombinované ovládanie

Pri kombinovanom ovládanie kombinujeme predošlej rozšírené ovládanie klávesami spolu s ovládaním myšou. Myšou otáčame pohľadom hráča do strán a hore / dole, zatiaľ čo šípkami vľavo a vpravo vykonávame úkroky do strán. Tento mód je obzvlášť vhodný pre rýchle akcie, kde sa hráč musí rýchlo otáčať, presne zameriavať a súčasne uskakovať do strán. Aj naďalej zostáva hráčovi možnosť otáčať sa klávesmi v prípade, že spolu s šípkami vľavo a vpravo držia prešmýkač Alt (teda obrátene než v rozšírenom ovládanie).

Pri ovládaní pohľade myšou nemožno vystačiť iba s vypnutím kurzora myši a čítaním aktuálne súradnice myši. Môže sa totiž stať, že kurzor myši sa dostane ku kraju obrazovky a nehýbe sa ďalej, čiže ovládanie by sa v danú chvíľu zarazilo. Preto nečítame absolútna súradnicu myši, ale zmenu pozície myši od minule. Po každom načítaní zmeny pozície myši vycentrujeme kurzor myši do stredu okna. Tým zabezpečíme, že myš bude mať neustále dostatočnú rezervu pre výchylku.

Mód zachytávanie myši (kedy je myš neustále centrovaná do stredu okna a kurzor myši je vypnutý) je nepríjemný v tom, že po prepnutí na oknový mód nie je myš k dispozícii a systém sa tak stáva ťažko ovládateľný. Preto je nutné urobiť prinajmenšom také opatrenie, že program bude zachytávať myš len v prípade, keď je program aktívny aplikácií. Ak sa užívateľ prepne z programu inam, musí sa prestať myš zachytávať. Program si len poznačí, že pozícia myši je neznáma, aby po návrate pohľad naraz neuskočil veľkou zmenou pozície myši. Pokiaľ to charakter programu umožňuje, bolo by ideálne zachytávať kurzor myši len v prípade celoobrazovkového módu, kým v oknovém móde túto funkciu nepoužívať, aby užívateľovi zostala možnosť ovládania okna myšou.

Kurzor myši sa pri zachytávaní myši zneviditeľní Iná formulácia na priehľadný obrázok. Ak nie je aplikácia aktívna, je vhodné kurzora myši navrátiť jeho štandardnej vzhľad. Nie je to nevyhnutné, ale môže byť pre užívateľa nepríjemné, ak kurzorom pohybuje nad oknom aplikácie a žiadny kurzor nevidí. Resp. nemôže tak kurzor na obrazovke nikde nájsť.

Zameriavanie myší je priamo nutnosťou obzvlášť v móde ostreľovača, kedy musí byť zameranie presné a citlivé.

3D grafika

5. Ovládanie myšou

U niektorých hier môže byť výhodnejšie použiť na ovládanie postavy hráčov (teda avatara) myš, kedy klikaním na miesta v teréne určujeme, kam sa má postava presunúť alebo na koho zaútočiť. Na rozdiel od bežných 2D aplikácií nemôžeme u 3D projekcia použiť jednoduchý vzťah medzi súradnicou kurzora myši a súradnicou ukazovatele v 3D priestore. Musíme vykonať spätnú projekciu obrazovkové súradnice myši do 3D súradníc. Vzhľadom na zložitosť je pre nás nereálne riešenie priesečníku lúča s akoukoľvek plôškou 3D sveta, uspokojíme sa preto s kompromisom. Chceme predovšetkým ovládať avatara, preto budeme uvažovať priesečník lúča myši s rovinou terénu, v ktorej sa avatar nachádza. Výšku kamery preto budeme prepočítavať na výškovú hladinu, v ktorej sa nachádza avatar. Aby sme sa vyhli nejasnostiam pri klikanie myšou (napr. Pri kliknutí do výškovo príliš odlišné oblasti, keď táto metóda už nefunguje správne), budeme hráči zobrazovať v teréne indikačné kurzor, aby vedel, kam program pokladá kurzor myši.

3D grafika

Situáciu pri vykresľovanie 3D grafiky si môžeme predstaviť tak, akoby pred pohľadovú kamerou bola umiestnená sklenená doska, na ktorú prebieha premietanie scény. Tejto doske hovoríme premietacie rovina. Pri pohybe myšou po obrazovke môžeme viesť z kamery ukazovateľom myši pomyselný lúč pretínajúca premietacie rovinu a rovinu terénu. Vieme vypočítať relatívnu pozíciu myši m vzhľadom ku stredu obrazovky (od súradnice myši odpočítame stred obrazovky a vydelíme zprůměrovaným rozmerom plochy). Relatívna pozícia myši m zodpovedá úseku, o ktorý je lúč myši vzdialený od stredového lúča v mieste premietacie roviny. Poznáme vzdialenosť premietacie roviny p (máme na to v 3D grafike prvok), takže máme všetky údaje a môžeme vypočítať uhol b, ktorý zviera lúč myši sa stredovým lúčom vo vertikálnom smere. Môžeme na to použiť funkciu Petra uhol bodu, m bude súradnicou x a p súradnicou y.

Uhol a zodpovedá sklonu kamery podľa osi X. Odpočítaním uhla lúča myši b obdržíme uhol, o ktorý je lúč myši odkloní od vodorovnej roviny. Vzhľadom k tomu, že poznáme výšku kamery nad terénom Y (presnejšie nad rovinou terénu avatara) a spočítali sme si už uhol, ktorý zviera lúč myši s terénom, môžeme odtiaľ vypočítať vzdialenosť priesečníku lúča s terénom r (vynásobíme výšku kamery Y funkcií cotg uhla a - b) a pohľadovou vzdialenosť priesečníku ku kamere d (vydelíme výšku kamery Y funkcií sin uhla a - b). Tu musíme ošetriť prípad, že kurzor myši je nad horizontom, tj uhol a - b je záporný - v tom prípade priesečník obmedzíme na zmysluplné veľké číslo (napr. Rozmer teréne).

3D grafika

Podobne, ako sme počítali uhol lúča myši vo vertikálnom smere, spočítame uhol lúča myši c v horizontálnom smere. Horizontálne súradnicu myši prepočítame na relatívnej súradnici vzhľadom na stred premietacej roviny a pomocou prvku uhol bodu vypočítame uhol c. Upozorňujem, že nasledujúce ľavý obrázok nepredstavuje pohľad zhora, ale pohľad kolmý k rovine ohraničené lúčom myši. Lúč myši môže totiž smerovať aj napr. Kolmo k zemi. Na základe vypočítaného uhla c a známe pozorovacej vzdialenosti d (z predošlého výpočtu) môžeme vypočítať Vzdialenosť e, o ktorú je lúč myši vzdialený od nevychýleného lúča v mieste priesečníku s terénom - vynásobením pohľadové vzdialenosti d funkcií tg uhla c. A tiež vypočítame opravenú skutočnú pozorovacia vzdialenosť d2 - vydelením pohľadové vzdialenosti d funkcií cos uhla c.

Na obrázku vpravo je pohľad na rovnaký trojuholník tvorený lúčom myši vychýleným v smere X a nevychýleným lúčom, tentoraz ale tak, ako sa premieta do roviny terénu. Vzdialenosť priesečníku s terénom r už poznáme z minulosti, teraz sme vypočítali odklon e. Z týchto údajov môžeme vypočítať uhol f, ktorý zvierajú odklonený a neodkloněný lúč myši v rovine teréne (pomocou funkcie uhol bodu). Pripočítaním uhla f k smeru otočenia kamery okolo osi Y obdržíme reálny smer priesečníkov lúča myši s terénom f2. Posledným potrebným údajom je vzdialenosť priesečníka lúča myši s terénom od päty kamery q, ktorý vypočítame z údajov e a r prvkom vzdialenosť bodu.

3D grafika

Z uhla a vzdialenosti priesečníku lúča myši s terénom už ľahko vypočítame súradnice kurzora myši v rovine teréne. Súradnicu X obdržíme pripočítaním násobku vzdialenosti priesečníka lúča myši q a funkcie sin uhla lúča f2 k súradnicu kamery X. Podobne súradnicu Z obdržíme pripočítaním násobku vzdialenosti priesečníka lúča myši q a funkcie cos uhla lúča f2 k súradnici kamery Z. V danom mieste vypočítame ešte výšku v teréne a umiestnime tam zameriavací kríž, ktorý sme vytvorili z objektu steny položenej do vodorovnej roviny a opatrené polopriehľadnou textúrou.

3D grafika

Aby zameriavací kríž pôsobil trochu zaujímavejšie a bol v teréne dobre viditeľný, zaistíme jeho animáciu pomalým otáčaním okolo osi Y. Vypnutím hĺbkového testu zaistíme, že sa kríž bude vykresľovať vždy a tak ho môžeme položiť presne na úroveň terénu (inak by sa s terénom prelínal a bol občas vidieť a občas nie). Ďalej je dobré zabezpečiť, aby kríž sledoval sklon terénu, tj. Akoby po teréne plával. To zaistíme tým, že kríž budeme nakláňať podľa osí X a Z. Pre každý zo smerov vypočítame sklon terénu tak, že zistíme výšku terénu v bodoch vychýlených o malý kúsok od lúča. Uhol, ktorý zviera terén s horizontálnou rovinou, potom vypočítame z rozdielov výšok a vzdialenosti testovacích bodov prvkom uhol bodu. Vzdialeností testovacích bodov môžeme určovať plynulosť prechodu sklonu kríža cez zlomovej hrany terénu - čím bude vzdialenosť väčšia, tým bude kríž prechádzať cez hrany plynulejšie.

Ďalej je dobré, meníme ak veľkosť zameriavacieho kríža tak, aby bol nezávislý od pohľadovej vzdialenosti. Nevyzeralo by dobre, keby bol jednej chvíli príliš veľký a inokedy zas nepatrný. To vykonáme tak, že meradlo zameriavacieho kríža budeme meniť priamo úmerne pohľadovej vzdialenosti priesečníku lúča myši s rovinou d2 a nepriamo úmerne so vzdialenosťou premietacie roviny p.

Posledným úkonom je pohyb avatara na dané miesto, kam užívateľ klikne kurzorom myši. To zaistíme úschovou súradníc cieľovej pozície a nastavením príznaku presunu avatara. V ďalšej obsluhe (nezávislé už na aktivite myši - teda ak hráč neklikne znovu na iné miesto) vykonávame presun na cieľovú pozíciu, kým je nastavený príznak presunu. V každom okamihu vypočítame zostávajúcu vzdialenosť k cieľu a vykonáme si skúšobnú zmenšenie vzdialenosti o koeficient rýchlosti vynásobený uplynulým časom. Ak nová vzdialenosť podteče pod nulu, bude v tomto kroku nedosiahne cieľová pozície. Vypneme príznak presunu avatara a opravíme koeficient rýchlosti tak, aby sme vzdialenosť kroku zmenšili na skutočnú zostávajúcu vzdialenosť. Vypočítame smer ciele a prevedieme krok v danom smere.

6. Ovládanie auta

Pri ovládaní dopravných prostriedkov je situácia trochu zložitejšie ako u peších avatarov. Predovšetkým musíme riešiť to, že dopravný prostriedok sa nevedia rozbehnúť a zastaviť skokom, zmena rýchlosti musí byť plynulá. A spravidla sa nemôže otáčať na mieste.

Pre zmenu rýchlosti si budeme udržiavať premennú udávajúce aktuálnu rýchlosť. Drží ak hráč šípku hore, budeme rýchlosť zvyšovať, čo znamená pričítať koeficient zrýchlenie vynásobený uplynulým časom. Aby zrýchlenie vyzeralo prirodzenejšie, nebudeme ho pripísať lineárne, ale ešte ho vynásobíme rozdielom aktuálnej rýchlosti od maximálnej povolenej rýchlosti. Tým dosiahneme efektu, že auto bude spočiatku rýchlo naberať rýchlosť, ale vo veľkých rýchlostiach už bude zrýchľovať len pomaly, až do maximálnej dosiahnuteľnej rýchlosti. Vďaka tomu nemusíme maximálnu rýchlosť obmedzovať. Naopak dosiahneme ešte zaujímavého efektu, že ak hráč z kopca presiahne samospádom maximálnu rýchlosť a bude sa snažiť šípkou vpred zrýchľovať, naopak bude rýchlosť znižovať smerom k maximálnej rýchlosti, teda akoby brzdil motorom.

Nedrží Ak hráč šípku vpred, bude auto samovoľne spomaľovať, len ale ak nie je dosiahnutá danej minimálnej rýchlosti, ktorú už považujeme za zastavenie. Spomalenie vykonáme lineárnym odčítaním koeficientu samovoľného spomalenia v závislosti na uplynulom čase.

Podobne ako zrýchlenie vpred obslúžime spomalenie (resp. Pohyb vzad) a samovoľné spomaľovanie pri pohybe vzad, len použijeme iné hodnoty koeficientov.

Ak nie je dosiahnutá minimálnej rýchlosti, ktorú už považujeme za zastavenie, vykonávame v ďalšej obsluhe jednak samotný pohyb danou rýchlosťou vpred či vzad a jednak obsluhu zatáčanie, ktorú by sme nemali vykonávať v prípade pokoji. Teda presnejšie, len u kolesových dopravných prostriedkov. U pásových dopravných prostriedkov ako je napr. Tank je prirodzené otáčanie na mieste.

Okrem bežného skĺzavaniu pri veľkom sklone terénu by sme mali pri aute obsluhovať aj zrýchlenie a spomaľovanie závislé na sklone terénu. Zo smeru otočenie auta vypočítame súradnice kúsok pred autom. V príklade sme pre jednoduchosť použili jednotkovú vzdialenosť testovacieho bodu. Zistíme výšku terénu jednak v testovacom bode pred autom a jednak na aktuálnu súradnici autá. Rozdiel výšok vynásobíme koeficientom vplyvu terénu a vzniknutý údaj ktorou môžeme pripočítať k aktuálnej rýchlosti, samozrejme vynásobený uplynulým časom. Korekciu vykonávame až od určitej minimálnej hraničnej hodnoty, aby sa auto samovoľne nerozbehli na miernom svahu.

Ďalšou vecou, ktorú musíme pri aute obsluhovať, je sledovanie sklonu terénu. Podobne sme sledovali zameriavací kríž pri ovládaní myšou. Auto budeme nakláňať podľa osí v smeroch X a Z. Z rozdielov výšok bodov, ktoré ležia od auta o určitú vzdialenosť v smeroch osi Z, určíme uhol (pomocou prvku uhol bodu), ktorý zviera terén s vodorovnou rovinou v smere Z. O tento uhol otočíme auto podľa osi X. Podobne budeme obsluhovať druhú os otáčania. Zistíme výšky bodov posunutých do strán v smeroch osi X a vypočítaným uhlom sklonu nastavíme sklon auta podľa osi Z. Vzdialenosť testovacích bodov ovplyvňuje plynulosť, s akou auto mení sklon na hranách terénu. Testovacie body by preto mali byť v miestach, kde sa nachádzajú kolesá auta.

3D grafika

7. Ovládanie lietadla

Opäť iný spôsob ovládania bude u leteckého dopravného prostriedku. Šípkami doľava a doprava ovládame smerové kormidlo ovplyvňujúce zatáčanie. Rýchlosť zatáčanie nie je okamžitá, ale mení sa plynule. Nedrží Ak hráč šípky vľavo a vpravo, smerové kormidlo sa navráti späť do priameho smeru a zatáčanie sa zas pomaly navracia do priameho smeru. V závislosti na rýchlosti zatáčania budeme meniť aktuálny smer otočenie lietadla.

Šípkami hore a dole riadime rýchlosť stúpania a klesania nastavovaním výškového kormidla. Stlačením šípky nadol pritiahneme riadiacu páku, výškové kormidlo sa zdvihne a lietadlo začne stúpať. Pomocou šípky nadol sa naopak odtlačí riadiaca páka, výškové kormidlo sa sklopí a lietadlo bude klesať. Rýchlosť stúpania opäť neriadime skokovo, ale plynulo v závislosti na čase. Čím dlhšie budeme kláves držať, tým rýchlejšie bude lietadlo stúpať či klesať. V závislosti na rýchlosti stúpania meníme aktuálnu rýchlosť. Ak lietadlo stúpa nahor, jeho rýchlosť sa znižuje. Naopak klesaním sa opäť zvyšuje.

Z uvedených údajov odvodzujeme animáciu pohybu lietadla. Rýchlosť stúpania ovplyvňuje smer sklonu lietadla podľa lokálnej osi X. Rýchlosť zatáčaní ovplyvňuje smer sklonu lietadla podľa lokálnej osi Z. Pomocou rýchlosti stúpania meníme výšku lietadla (pri kladnej rýchlosti stúpania sa výška zvyšuje). Výšku v ukážkovom programe obmedzujeme tak, aby lietadlo nebolo príliš vysoko nad terénom (aby neprefičal oblakmi) a tiež aby nebolo príliš nízko nad terénom, pretože tu nepodporujeme pristávanie ani kolízii s terénom.

3D grafika

.... pokračovanie nabudúce


 

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 233x (6.09 MB)
Aplikácia je vrátane zdrojových kódov v jazyku Petr Lite (sú obsiahnuté v EXE súbore, ktorý možno v programe priamo otvoriť)

 

Všetky články v sekcii
3D grafika
Článok pre vás napísal Panda38
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Programátor C++, WinAPI, ASM.
Aktivity