Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

A přece se točí!

Jaký by to byl svět bez pohybu! Tak si teď náš 3D svět trochu rozhýbeme. Budeme pokračovat v programu 3D z minulé lekce. Nejdříve ho upravíme a teprve potom až si vysvětlíme co a jak se v programu děje.

Do hlavní smyčky programu doplňte prvek rotace podle osy Y, který naleznete ve skupině grafika / 3D grafika / transformace. Při každém průchodu smyčkou přečtěte aktuální hodnotu prvku, přičtěte k ní 0.05 a výsledek nastavte jako novou hodnotu prvku.

Spustíte-li program, uvidíte planetu Zemi, jak se otáčí kolem své osy. A nyní se podíváme, co program vlastně dělá.

3D svět je ve skutečnosti statický svět. Nic se v něm samo nehýbe, vše se nachází přesně v takovém stavu, do jakého to uvedeme my. To platí i o poloze a stavu objektů. Chceme-li objekty rozpohybovat, musíme opakovaně, v závislosti na čase, měnit jejich polohu a stav. Neboli objekty animovat.

K rozpohybování objektů potřebujeme mít souřadný systém. Ten nám udává polohu objektu ve 3D světě vzhledem k jakémusi pomyslnému počátku. Systém Petr používá implicitně tzv. levoruký kartézský souřadný systém, používaný též v rozhraní DirectX. Označení levoruký je proto, že ukazuje-li ukazováček levé ruky směrem první souřadnice (X), sklopený prostředníček směrem druhé souřadnice (Y), pak zvednutý palec ukazuje směr třetí souřadnice (Z). Nebo chcete-li, ještě jiná mnemotechnická pomůcka: Postavíme-li se tak, abychom se dívali směrem první souřadnice (X), nahoru aby mířila druhá souřadnice (Y), pak levá ruka upažená do strany ukazuje směr třetí souřadnice (Z).

Grafické rozhraní OpenGL naproti tomu používá pravoruký kartézský souřadný systém. Každý ze systémů má své opodstatnění. Pravoruký systém je akademickým systémem a je chápán tak, že pokud máme na stole položený papír s osami X a Y, pak třetí osa Z vystupuje nahoru z papíru a znamená výšku. Je proto vhodný např. v kartografii. Naproti tomu levoruký systém můžeme chápat tak, že směřuje-li osa X vpravo a osa Y nahoru, pak se díváme směrem vpřed, ve směru kladné osy Z. Souřadnice Z představuje vzdálenost od nás neboli hloubku. Proto je levoruký systém vhodnější pro použití v počítačové 3D grafice. V případě potřeby lze v Petrovi souřadný systém změnit pomocí prvku typ projekce.

Polohu objektu ve 3D světě určujeme pomocí transformací. Transformace jsou operace, které provádíme s objektem - posun, otočení, změna velikosti. Každá z transformací se provádí v jednom ze směrů X, Y, Z. Transformace se dají chápat jako poloha objektu - např. prvek posun ve směru X je souřadnice X objektu ve 3D světě. Chceme-li posunout objekt ve směru X o vzdálenost 0.1, změníme hodnotu tohoto prvku o hodnotu 0.1.

Pořadí transformací není přitom určeno tím, v jakém pořadí transformace zadáváme. Pořadí transformací je pevně dáno a jejich interpretace je taková, že všechny transformace se provedou z nulového stavu objektu při každém renderování snímku. V systému Petr je pořadí transformací následující:

  1. změna měřítka ve směrech X, Y a Z
  2. rotace podle osy X (sklopení objektu)
  3. rotace podle osy Y (nastavení směru)
  4. rotace podle osy Z (natočení)
  5. posun ve směrech X, Y a Z

Nejdříve se nastaví velikost objektu - abychom si mohli připravit objekt v potřebné velikosti. Poté se objekt otáčí kolem svého středu podle zadaných rotací. Nakonec se objekt posune na cílovou absolutní souřadnici. Uvedené pořadí rotací X-Y-Z je implicitní a je možné ho změnit prvkem pořadí rotací. U levorukého systému se směr rotací provádí podle pravidla levé ruky - palec ukazuje směr osy, kolem které se rotace provádí, a sklopené prsty ukazují směr rotace.

Další vlastností transformací je, že objekty lze spojovat do větších celků. Potomci připojení k objektu dědí jeho transformace, jednotlivé transformace se skládají. Připojený objekt mění např. svou velikost spolu se změnou velikosti rodičovského objektu.

Vyzkoušíme si to. Přidáme k naší Zemi ještě geostacionární satelitní družici, která bude obíhat Zemi nad jejím povrchem. A jak je známo, geostacionární družice se pohybuje nad rovníkem tak, jakoby se držela stále nad jedním místem zemského povrchu.

Pro udržení přehledu přejmenujte prvek ID na ID Země a texturu Země na textura Země. Příkazy pro vytvoření Země přesuňte do samostatné skupiny vytvoření Země. Připravte si další prvek, s názvem ID družice. Družici vytvoříte PŘED vytvořením Země, ve skupině vytvoření družice. Použijte k tomu prvek kužel, ten by nám mohl dobře posloužit jako model družice. Měřítko družice ve směru X nastavte např. na 0.05. Bude to sice nejgigantičtější družice na světě, ale rádi bychom v okně něco viděli. Namísto nastavování měřítka v ostatních směrech použijte hodnotu prvku měřítka ve směru X - snáze se pak mění měřítko pro všechny směry najednou. Kužel se vytvoří otočený špičkou nahoru, proto ho otočíme podle osy Z o 90 stupňů doprava. Tím ho sklopíme tak, že špička bude nyní ukazovat směrem doleva. Nakonec posuneme satelit o 0.55 směrem k nám (tedy záporně ve směru Z), jinak by zůstal ve středu Země. Teď ještě družici připojíme k Zemi pomocí prvku připojení., který uvedeme na konci skupiny pro vytvoření Země. Tím jsme družici k Zemi přilepili. Proto jsme ji vytvářeli před vytvářením Země, abychom už znali její ID a mohli ji připojit.

Když program spustíte, měla by se nad povrchem Země objevit maličká družice, která se otáčí spolu se Zemí.

K Zemi samozřejmě neoddělitelně patří Měsíc. Texturu najdete na konci lekce, přidejte ji do programu pod názvem textura Měsíce.

Připravte číselnou proměnnou ID Měsíce. Za příkazy pro vytvoření Země připravte další skupinu, označenou vytvoření Měsíce. Nejdříve nastavte složitost objektu na 8, vytvořte objekt Měsíce pomocí koule (výsledný ID se uloží do proměnné ID Měsíce), nastavte objektu texturu Měsíce, měřítko objektu změňte na 0.2, objekt posuňte o 0.7 ve směru k nám (tj. -0.7 ve směru Z).

Když teď program spustíte, objeví se před Zemí Měsíc. Samozřejmě se nehýbe. Kdybychom ho připojili k Zemi, otáčel by se spolu se Zemí podobně jako družice, což nechceme. Chceme, aby se pohyboval pomaleji. Vzhledem k danému pořadí transformací nemůžeme objekt Měsíce posunout ze středu a pak teprve celou soustavu otočit. Proto použijeme pomocný objekt, skupinu, kterou najdete v grafika / 3D grafika / vytvořit. Pozor, nezaměnit se stejnojmenným prvkem skupina, používaným ke shromáždění více programových prvků. Objekt skupina je také plnohodnotný 3D objekt, neobsahuje však žádný viditelný prvek. Slouží pouze ke spojování více objektů do jedné skupiny a k provádění doplňkových transformací.

Připravte si další číselnou proměnnou, ID skupiny Měsíce. Na konec skupiny příkazů pro vytvoření Měsíce přidejte příkaz pro vytvoření objektu skupiny Měsíce. K objektu skupiny Měsíce připojte objekt Měsíce.

Při spuštění programu není patrná žádná změna, samozřejmě. Nyní Měsíc rozpohybujeme a to tak, že celou skupinou budeme otáčet podobně jako Zemí. Chceme manipulovat s jiným objektem než byla Země a to znamená, že musíme už programu říkat, se kterým objektem budeme otáčet. Slouží k tomu prvek aktivní objekt. Pomocí tohoto prvku vybereme nejdříve na začátku programové smyčky ID Země, jedním příkazem zajistíme otáčení Země, pak vybereme jako aktivní objekt ID skupiny Měsíce a poté dalším příkazem zajistíme obíhání Měsíce kolem Země. Zvolíme ale nižší rychlost než jakou se otáčí Zermě, dejme tomu 0.01.

A už zbývá jen spustit. Vidíte, jak se Měsíc pomalu a majestátně loudá kolem Země a shlíží na ni stále stejnou přivrácenou tváří. Galileo by z nás měl radost!


 

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 266x (303.16 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)

 

Všechny články v sekci
3D grafika
Článek pro vás napsal Panda38
Avatar
Uživatelské hodnocení:
1 hlasů
Programátor C++, WinAPI, ASM.
Aktivity