Table of Contents

Komponenty herního enginu, herní smyčka. Detekce kolizí a základy herní fyziky. Reprezentace a výpočet animací. Základní optimalizační metody pro herní engine.

B4B39HRY Webové stránky předmětu

1. Komponenty herního enginu a herní smyčka

1. Přehled komponent herního enginu a jejich funkce

Herní engine je komplexní softwarová platforma, která poskytuje základní strukturu pro vývoj her. Nabízí framework, který umožňuje efektivní práci s jednotlivými částmi hry bez nutnosti tvořit vše od nuly. Obsahuje jak core systémy, tak nástroje pro práci s daty a prostředky (assets), a často také podporuje multiplatformní vývoj a integraci třetích stran (např. middleware, SDK).

2. Herní smyčka

Herní smyčka představuje jádro řízení běhu hry – zajišťuje zpracování vstupů, aktualizaci herního světa a vykreslení obrazu. Tento cyklus probíhá opakovaně po celou dobu běhu hry, často desítky až stovky krát za sekundu (FPS).

Základní struktura smyčky zahrnuje:

Smyčka typicky běží nezávisle na hráči – tedy i v případě, že hráč nedává žádné vstupy, se svět aktualizuje dál (např. pohyb NPC, efekty prostředí).

Varianty herní smyčky

Herní smyčka může být řízena různými způsoby podle toho, jak zachází s časem:

Tato struktura se dá doplnit o další části, jako je LateUpdate pro úpravy po výpočtu kolizí nebo fyziky (např. nastavení kamery), nebo Coroutines, které umožňují rozdělení výpočtů do více snímků.

3. Souvislost reálného a herního času

Ve hře se pracuje s několika druhy času:

Nesoulad mezi časy (např. kvůli výkonu HW) může vést k nedeterministickému chování. Z tohoto důvodu je třeba správně volit simulační krok a synchronizaci.

Příklad problémů při různém FPS:

Příkladem robustního přístupu je herní smyčka s akumulací času:

double previous = GetCurrentTime();
double lag = 0.0;
while (running) {
    double current = GetCurrentTime();
    double delta = current - previous;
    previous = current;
    lag += delta;
 
    ProcessInput();
    while (lag >= FIXED_STEP) {
        UpdateGame(FIXED_STEP);
        lag -= FIXED_STEP;
    }
    Render();
}

Synchronizace herního času s reálným časem zajistí konzistentní herní zážitek bez ohledu na výkon zařízení.

4. Vazba komponent herního enginu na herní smyčku

Jednotlivé komponenty enginu jsou propojeny s částmi smyčky:

Interní komponenty jako fyzika, animace nebo zvuk jsou často aktualizovány automaticky v rámci hlavní smyčky, nebo pomocí událostí (např. OnCollision, OnRender, OnPreUpdate). V některých enginech je možné explicitně řídit pořadí aktualizací, např. pomocí ScriptExecutionOrder. Pokud dojde ke zpomalení v některé části (např. fyzika), může to ovlivnit celkový dojem ze hry – proto se používají paralelizace (vlákna), dělení na fáze a interpolace stavu.

5. Zpracování dlouhých procedur

V průběhu hry může dojít k operacím, které jsou výpočetně náročné a trvají déle než jeden snímek. Pokud by byly vykonány „naráz“, mohlo by to způsobit zpomalení hry, snížení FPS nebo dokonce zaseknutí aplikace. Proto je důležité tyto operace vhodně řídit a rozdělit.

Použitím těchto technik lze dosáhnout vyšší stability hry, lepší odezvy a komfortu pro hráče.

6. Synchronizace fyzikální simulace a zobrazování

Simulace a zobrazení nemusí nutně probíhat ve stejném čase nebo frekvenci. V praxi to znamená, že mezi výpočtem polohy objektu a jeho vykreslením může uplynout čas – což vede k viditelným nesouladům, například k „cukání“ pohybu (stuttering) nebo k chybám v pozici.

Synchronizace je zásadní pro kvalitní vizuální výstup a konzistentní fyzikální interakce. Používá se také tzv. double buffering stavu, kdy si engine pamatuje dva poslední stavy pro interpolaci nebo porovnání. Správná implementace synchronizace má přímý vliv na hratelnost – zejména v rychlých akcích, závodních hrách nebo VR.

2. Detekce kolizí a základy herní fyziky

1. Motivace, princip, využití

Fyzikální simulace ve hrách umožňuje realistické (nebo stylizované) chování objektů a prostředí – zajišťuje, aby se postavy, předměty nebo částice pohybovaly a reagovaly přirozeně. Využívá se nejen pro efekty a interakce, ale i jako součást samotné herní mechaniky.

Typické oblasti využití:

Fyzikální simulace může být real-time (běží spolu s hrou), nebo předpočítaná (např. pro cutscény nebo animace). Je často nejnáročnější částí enginu, zejména ve hrách s komplexním prostředím a mnoha objekty.

2. Typy kolizních objektů

Pro detekci kolizí se objekty neporovnávají pomocí celé své geometrie (ta může být velmi složitá), ale pomocí tzv. kolizních těles (colliders). Ty představují jednoduché geometrické útvary, které přibližně obalují objekt. Cílem je rychlý test kolize, případně i výpočet průniku nebo kontaktních sil. Výběr typu kolizního tělesa je kompromisem mezi přesností a výpočetní náročností:

3. Algoritmy pro detekci kolizí

Separating Axis Theorem (SAT)

Separating Axis Theorem (teorém separační osy) říká, že pokud existuje nějaká osa, na kterou lze objekty promítnout tak, že se jejich projekce neprotínají, pak tyto objekty nekolidují. Naopak: pokud na všech relevantních osách projekce překrývají, pak objekty pravděpodobně kolidují.

Počet testovaných os závisí na typu objektů:

SAT je velmi efektivní pro kolizní testy mezi konvexními objekty, např. OBB nebo jednoduchými polygonálními útvary. Je oblíbený pro svoji srozumitelnost a přijatelný výkon i u složitějších scén.

GJK algoritmus

GJK (Gilbert–Johnson–Keerthi) algoritmus je obecný a velmi výkonný algoritmus pro detekci kolize konvexních objektů v libovolném rozměru. Je založen na Minkowského rozdílu dvou objektů.

Minkowského rozdíl: \[ A \ominus B = \{ a - b \mid a \in A, b \in B \} \] Geometricky tento rozdíl zahrnuje všechny možné vektory z bodu B do bodu A. Pokud výsledný rozdíl obsahuje počátek souřadnic, znamená to, že se objekty A a B překrývají.

Princip GJK:

GJK se výborně hodí i pro velmi komplikované kolizní objekty (např. konvexní obálky). Výhoda oproti SAT: nemusíme předem znát osy – ty se určují dynamicky během běhu algoritmu. Nevýhoda: složitější implementace, závislá na správném zpracování podporujících bodů.

Shrnutí:

4. Fáze detekce kolizí

Detekce kolizí probíhá ve více fázích, které postupně zužují množinu objektů, jež je třeba detailně testovat. To umožňuje udržet výpočty efektivní i ve složitých scénách.

Široká fáze (Broad Phase)

Široká fáze se snaží rychle vyřadit objekty, které se zjevně nemohou dotýkat. Provádí hrubé testy mezi obalovými tělesy, často s využitím akceleračních struktur.

Filtrování kolizí

Pomocí vrstev a kolizních masek určujeme, které objekty mohou kolidovat.

Úzká fáze (Narrow Phase)

Přesná detekce kolizí vybraných dvojic objektů.

5. Kolizní dotazy a jejich varianty

Kolizní dotazy slouží k aktivnímu zjišťování, zda a kde objekt koliduje s prostředím nebo jinými objekty. Na rozdíl od klasické detekce kolizí se provádějí explicitně – často jako součást herní logiky, pohybu postav, AI nebo fyzikálních interakcí.

Tyto dotazy se často spouštějí v každém snímku nebo na vyžádání a bývají napojeny přímo na fyzikální engine. Výsledkem dotazu může být:

6. Smyčka fyzikální simulace

Fyzikální simulace probíhá v pravidelných krocích v rámci hlavní herní smyčky nebo samostatně (např. s vyšší frekvencí). Každý krok zahrnuje sadu operací, které zajistí realistické chování objektů ve scéně. Níže je uvedena typická struktura smyčky:

  1. Aktualizace herních objektů
    • Zpracují se vstupy od uživatele (např. GUI, stisk klávesy, skripty).
    • Herní logika ovlivní objekty (např. aktivuje animaci nebo spustí sílu).
    • Připraví se nové požadavky na pohyb, otáčení, přechod mezi stavy atd.
  2. Výpočet sil a aplikace impulsů
    • Na objekty se aplikují síly (např. gravitace, tření, pružnost) a momenty.
    • Mohou se upravit vazby (např. klouby mezi objekty, řetězce, tuhé spojení).
    • Herní skripty mohou aplikovat dodatečné síly nebo reakce (např. výbuch, zásah).
  3. Simulační krok
    1. Numerická integrace – pomocí metod jako Eulerova nebo Runge-Kutta se spočítá nová pozice a rychlost objektů podle působících sil.
    2. Detekce kolizí – zjistí se, které objekty spolu kolidují, pomocí technik jako SAT, GJK, AABB testy.
    3. Řešení kolizí – pokud se kolize vyskytují:
      • Vypočítají se kontaktní síly nebo penalizační impulzy.
      • Aplikují se korekce pozice (např. posunutí objektu, aby „nevlezl“ do jiného).
      • Mohou být vytvořeny dočasné vazby (např. postava stojící na pohybující se plošině).
    4. Iterace – v případě potřeby se celý krok může několikrát opakovat pro lepší přesnost nebo stabilitu (např. v enginu PhysX nebo Bullet).
  4. Aktualizace herních objektů podle simulace
    • Nové pozice, rotace a stavy se promítnou do herních objektů.
    • Např. postava se přesune, předmět se kutálí, dveře se pohnou atd.
    • Možné je odeslání notifikací o změnách (např. „hráč spadl na zem“).
  5. Kolizní dotazy
    • Provádějí se raycasty nebo shapecasty na základě aktuálního stavu světa.
    • Používají je AI, kamera, ovládání nebo herní logika (např. jestli je hráč ve výhledu, co má postava pod nohama apod.).
  6. Render
    • Na závěr se podle aktualizovaných dat vykreslí scéna.
    • To zahrnuje pozice objektů, rotace, animace, efekty apod.

Tato smyčka je klíčová pro realistický pohyb a interakce objektů. V moderních enginech může být implementována samostatně od hlavní herní smyčky a může běžet s vyšší frekvencí (např. 120× za sekundu), což zvyšuje stabilitu a přesnost simulace.

7. Řešení pohybové rovnice

Pohyb objektu ve fyzikální simulaci se řídí druhým Newtonovým zákonem:

\[ F(t) = m \cdot a(t) = m \cdot \frac{dv(t)}{dt} = m \cdot \frac{d^2r(t)}{dt^2} \]

kde:

Výsledkem jsou diferenciální rovnice, které lze řešit dvěma základními způsoby:

Analytické řešení

Analytické řešení využívá klasickou integraci rovnic pohybu. Je přesné, ale omezené na jednodušší případy (např. konstantní síla, střela pod vlivem gravitace):

\[ F(t) = m \cdot g = m \cdot v'(t) \] \[ v(t) = \int g \, dt = g \cdot t + v(0) \] \[ r(t) = \int v(t) \, dt = \frac{1}{2} g t^2 + v(0) t + r(0) \]

Tento přístup se používá pro přesně definované trajektorie (např. let střely bez odporu vzduchu).

Numerické řešení

Numerická integrace je použita v simulacích, kde není možné nebo výhodné použít analytický přístup. Využívá se diskrétních kroků v čase \( \Delta t \). Základními metodami jsou:

Eulerova metoda

\[ v(t + \Delta t) = v(t) + \frac{F(t)}{m} \cdot \Delta t \] \[ r(t + \Delta t) = r(t) + v(t) \cdot \Delta t \]

Verletova metoda

\[ r(t + \Delta t) = 2r(t) - r(t - \Delta t) + \frac{F(t)}{m} \cdot \Delta t^2 \] \[ v(t + \Delta t) = \frac{r(t + \Delta t) - r(t)}{\Delta t} \]

Rychlostní Verletova metoda (Velocity Verlet)

Výpočetně náročnější, ale přesnější: \[ r(t + \Delta t) = r(t) + v(t) \cdot \Delta t + \frac{1}{2} a(t) \cdot \Delta t^2 \] \[ v\left(t + \frac{1}{2} \Delta t\right) = v(t) + \frac{1}{2} a(t) \cdot \Delta t \] \[ a(t + \Delta t) = \frac{1}{m} F\left(t + \Delta t,\, r(t + \Delta t)\right) \] \[ v(t + \Delta t) = v\left(t + \frac{1}{2} \Delta t\right) + \frac{1}{2} a(t + \Delta t) \cdot \Delta t \]

Odpor vzduchu

V reálné simulaci střely musíme zohlednit odpor vzduchu, který je závislý na rychlosti:

Praktické poznámky

8. Typy vazeb mezi objekty

Ve fyzikální simulaci často dochází k situacím, kdy mezi objekty existují určité omezení pohybu – tzv. vazby. Tyto vazby slouží k simulaci realistického chování složených těles nebo strojních mechanismů. Zavedením vazeb vzniká soustava diferenciálních rovnic s omezeními, které se často řeší iterativně během každého simulačního kroku.

Typické vazby mezi objekty:

Vazby jsou důležité i pro herní logiku a interakci hráče s objekty – např. držení předmětů ve VR, otevírání dveří nebo simulace vozidel.

9. Výpočet reakce na kolize a fyzikální materiály

Při detekci kolize mezi dvěma objekty nestačí pouze zjistit, že ke kolizi došlo – je nutné také určit reakci těchto těles, tj. jak se budou pohybovat dál. Tento proces se označuje jako řešení kolize (collision response) a typicky se provádí výpočtem impulzu, který objektům dodá správný směr a velikost změny pohybu.

Výpočet impulzu při kolizi

Kolize dvou těles je popsána jako změna hybnosti. Uvažujeme zákon zachování celkové hybnosti izolované soustavy:

\[ \vec{p}_1 + \vec{p}_2 = \vec{p}'_1 + \vec{p}'_2 \]

kde:

Impuls se vypočítá podle:

\[ \Delta \vec{p} = \frac{(1 + \epsilon)(\vec{v}_2 \cdot \vec{n} - \vec{v}_1 \cdot \vec{n})} {\frac{1}{m_1} + \frac{1}{m_2}} \cdot \vec{n} \]

kde:

Rychlosti po kolizi:

\[ \vec{v}'_1 = \vec{v}_1 - \frac{\Delta \vec{p}}{m_1}, \quad \vec{v}'_2 = \vec{v}_2 + \frac{\Delta \vec{p}}{m_2} \]

Síla vzniklá z impulzu:

\[ \vec{F} = \frac{\Delta \vec{p}}{\Delta t} \]

Tento výpočet probíhá pro každý kolizní kontakt v simulaci. Složitější simulace navíc používají iterativní řešení, kdy se opakovaně upravují pozice a rychlosti těles, dokud se neodstraní nebo nezminimalizují průniky.

Penalizační síly

Pokud tělesa mírně penetrují (pronikají do sebe), lze jejich oddělení řešit penalizační silou – síla je úměrná hloubce průniku a působí opačným směrem. Výhodou je jednoduchost, nevýhodou méně přesná simulace.

Fyzikální materiály

Fyzikální vlastnosti kolize jsou řízeny tzv. materiály, které jsou přiřazeny objektům. Ty definují:

Kontakty

Kolizní systém často detekuje i tzv. kontakty těsně před skutečným průnikem – tyto se využívají např. pro detekci stání na zemi, lehkého dotyku či “trigger” zón.

Každý kontakt obsahuje: pozici kontaktu, kolizní normálu (směr síly), hloubku průniku, lokální souřadnice.

Tyto informace se pak předávají do kolizních callbacků (např. `OnCollisionEnter`) nebo herní logiky.

3. Reprezentace a výpočet animací

1. Typy animací a jejich využití

Cílem animace je rozpohybovat objekty – pro účely hry, realismu nebo stylizace. Existuje několik typů animací, které se používají podle potřeby:

2. Skeletální animace a reprezentace kostry

Skeletální animace používá kostru (hierarchický strom kloubů), která ovládá deformaci polygonálního modelu („kůže“).

Čtyři základní techniky animace kostry:

3. Animační klipy

4. Míchání animačních klipů

5. Skinning (Linear Blend Skinning)

Skinning je metoda deformace polygonálního modelu (kůže) podle animace kostry (skeletonu). Každý vrchol modelu je ovlivněn jedním nebo více klouby v závislosti na typu skinningu.

\[ \vec{v}' = F(j) \cdot A^{-1}(j) \cdot \vec{v} \]

\[ \vec{v}_{\text{new}} = \sum_{i=1}^{m} w_i \cdot F(j_i) \cdot A^{-1}(j_i) \cdot \vec{v} \]

6. Animační křivky, princip a využití

Animační křivky určují průběh hodnot (např. pozice, rotace, barvy) mezi klíčovými snímky. Používají se pro plynulou interpolaci v čase, řízení pohybu kamery či procedurální animace.

Požadavky

Lineární interpolace

Hermitova kubika

Catmull–Rom spline

Použití:

Křivky jsou zásadní pro dosažení realistického nebo stylizovaného pohybu bez nutnosti ručního nastavování každého snímku.

4. Základní optimalizační metody pro herní engine

1. Cíl optimalizace

Cílem optimalizací je udržet stabilní snímkovou frekvenci (FPS) – např. 60 FPS, pro VR až 90 FPS. Největší zátěž obvykle představuje rendering.

2. Dopředné a odložené vykreslování

Dopředné vykreslování (Forward rendering)

Odložené vykreslování (Deferred rendering)

Kombinovaný přístup

3. Optimalizace pomocí LOD

LOD (Level of Detail) je technika pro snižování zátěže GPU tím, že se místo plně detailního modelu používá zjednodušená verze podle vzdálenosti od kamery.

Diskrétní LOD

Spojité LOD

Pseudo-spojité LOD

Další optimalizační techniky

LOD je klíčovým prvkem pro škálování grafické náročnosti a udržení plynulého výkonu při zobrazování rozsáhlých scén.

4. Předpočítané osvětlení a sondy odrazu

Lightmapy

Reflection probes

5. Redukování podle viditelnosti (Culling)

Culling je technika pro zvýšení výkonu tím, že neviditelné objekty nejsou vůbec posílány na vykreslení. Typicky se jedná o objekty mimo zorné pole nebo zakryté jinými objekty.

View Frustum Culling

Occlusion Culling

Potenciálně Viditelné Množiny (PVS)

Hierarchické Zpracování a Konzistence