FIT ČVUT

Adam Vesecký

NI-APH
Přednáška 7

Fyzika

Geometrie

Body a vektory

  • Kartézský systém souřadnic - nejběžnější
  • hry obvykle používají Euklidovský prostor
  • ve 2D hrách je osa Y často invertovaná

2D systém souřadnic

3D systém souřadnic

Body a vektory

  • Vektor - veličina, která má svou velikost a směr
  • vektory mohou reprezentovat body, pokud uvažujeme jejich počátek v počátku systému souřadnic

Sčítání a odčítání

  • vektor + vektor = vektor
  • vektor - vektor = vektor
  • bod + vektor = bod
  • bod - bod = vektor
  • bod + bod = není definovaný

Sčítání a odčítání

Body a vektory

Velikost vektoru

  • skalár reprezentující délku vektoru
  • |a| = \sqrt{a_x^2+a_y^2+a_z^2}

Velikost vektoru

Normalizace

  • jednotkový vektor je vektor s velikostí 1: \mathrm{u} = \frac{\mathrm{v}}{|\mathrm{v}|}

Normálový vektor

  • vektor je normálový k plošce, pokud je na ni kolmý

Skalární součin

  • \mathrm{a}\cdot\mathrm{b} = a_xb_x+a_yb_y+a_zb_z
  • \mathrm{a}\cdot\mathrm{b} = |\mathrm{a}|\cdot |\mathrm{b}|\cdot \cos{(\theta)}

Vektorový součin

  • výsledkem je nový vektor, který je kolmý na první dva
  • \mathrm{a}\times\mathrm{b} = [(a_yb_z - a_zb_y),(a_zb_x - a_xb_z),(a_xb_y - a_yb_x)]

Projekce

  • projekce vektoru na jiný vektor
  • \mathrm{v'} = \frac{\mathrm{w}\cdot\mathrm{v}}{|\mathrm{v}|^2}\cdot \mathrm{v}

Dynamika

Pojmy

  • Kinematika - řídí pohyb objektů bez silového působení
  • Dynamika - řídí pohyb objektů se silovým působením
  • Rychlost - změna vzdálenosti v čase
  • Zrychlení - změna rychlosti v čase
  • Síla - veličina označující velikost vzájemného působení hmotných těles
Většina enginů používá MKS jednotky (metry, kilogramy, sekundy) a radiány pro úhly.

Dynamika

Lineární dynamika

  • ignorujeme rotaci
  • pozice je definována pozičním vektorem: \mathrm{r}
  • rychlost: v(t) = \frac{dr(t)}{dt}
  • zrychlení: a(t) = \frac{dv(t)}{dt} = \frac{d^2r(t)}{dt^2}
  • výslednice sil: \mathrm{F_{net}} = \sum^N_{i=1} \mathrm{F_i}
  • Newtonův druhý pohybový zákon: \mathrm{F} = m\cdot a(t)
  • hybnost: \mathrm{p(t)} = m\cdot v(t)

Úhlová dynamika

  • úhlová rychlost: \omega(t) = \frac{d\varphi(t)}{dt}
  • úhlové zrychlení: \alpha(t) = \frac{d\omega(t)}{dt} = \frac{d^2\varphi(t)}{dt^2}
  • točivý moment: \mathrm{N} = \mathrm{r} \times \mathrm{F} , způsoben silovým působením na bod vzdálený od osy otáčení
Jakákoliv fyzikální interakce objektu se dá rozložit na lineární pohyb těžiště a úhlový pohyb kolem něj

Pohyb

Pohyb projektilu

  • \mathrm{F} = m\cdot \mathrm{a}
  • m\cdot \mathrm{a} = -m\cdot \mathrm{g}
  • \mathrm{a} = -\mathrm{g}

Pohyb po nakloněné rovině (bez tření)

  • \mathrm{F} = m\cdot \mathrm{a}
  • \mathrm{F} = \mathrm{F_G} \cdot \sin{(\alpha)}
  • \mathrm{a} = \frac{\mathrm{F}}{m} = \mathrm{g}\cdot \sin{(\alpha)}

Pohybové rovnice

  • analytické řešení se v herní fyzice téměř nikdy nepoužívá
  • Numerická integrace
    • máme-li r(t_1), v(t_1), \mathrm{F}(t, r, v) , potřebujeme najít r(t_2), v(t_2)
    • začneme u r(t_1)  a krokujeme v čase podél
      tangenty, dokud nevytvoříme aproximaci pro r(t_2)
    • integrační metody nám umožní
      aproximovat s narůstající přesností

Integrační metody

Implicitní metody

  • používají hodnoty z následující iterace
  • odebírají energii ze systému

Explicitní metody

  • používají hodnoty ze současné iterace

Semi-implicitní metody

  • kombinace explicitních a implicitních

Runge-Kutta family

  • Eulerovy methody, metody středových bodů, RK4,...

Verlet family

  • Regular Verlet
  • Leapfrog Verlet
  • Velocity Verlet

Eulerova integrace

  • v(t+ \Delta t) = v(t) + a(t) \cdot \Delta t

Explicitní metoda

  • r(t+\Delta t) = r(t) + v(t) \Delta t

Vylepšená metoda

  • r(t+\Delta t) = r(t) + \frac{v(t)+v(t+\Delta t)}{2} \Delta t

Implicitní metoda

  • r(t+ \Delta t) = r(t) + v(t+\Delta t) \Delta t
  • jednoduché na implementaci
  • nízká stabilita, závislá přímo
    na délce kroku

Steering Behaviors

Steering Behaviors

  • sada algoritmů, která pomocí silového působení simuluje realistický pohyb herních objektů (agentů)
  • vytvořeno Craigem Reynoldsem na začátku 90. let
  • Agent - systém nacházející se v prostředí, se schopností na prostředí reagovat

Steering Behaviors

Seek

  • nejjednodušší
  • síla, která přitahuje agenta k cíli

Steering Behaviors

Flee

  • opak funkce seek, odpudivá síla navádějící agenta pryč od cíle

Arrive

  • seek + dojezd (zpomalení před cílem)

Pursuit

  • pronásledování pohybujícího se cíle
  • může zahrnovat predikci pohybu cíle

Evade

  • opak funkce pursuit
  • agent se snaží utéct od predikované budoucí pozice druhého agenta

Steering Behaviors

Wander

  • náhodná procházka
  • vektor pohybu je náhodně vychylován
  • uvažujeme kružnici umístěnou před agentem
  • agent se pohybuje směrem k bodu na kružnici
  • parametry: poloměr kružnice, vzdálenost od agenta a intenzita dislokace

Steering Behaviors

Path follow

  • posouvá agenta podél waypointů
  • poslední waypoint pro zastavení používá arrive funkci, u ostatních stačí seek
  • hladkého pohybu můžeme dosáhnout tolerančním poloměrem či aproximací Bézierovou křivkou

Steering Behaviors

Flocking

  • kombinace tří aspektů:
    • separation - navádí agenta pryč od sousedních agentů
    • alignment - zarovnává směr agenta se směrem sousedních agentů
    • cohesion - navádí agenta směrem k těžišti houfu sousedních agentů

Fyzikální engine

Fyzikální engine

  • systém který aproximuje fyzikální interakci v reálném čase
  • má zásadní vliv na imerzi
  • může hru i snadno rozbít
  • Flow

Fyzika a animace

  • fyzika \neq  animace!
  • animace musí harmonizovat s fyzikálním enginem
  • cut-scény a statické animace nejsou součástí fyzikální interakce
  • téměř každá hra používá statické animace či baked physics

Fyzika ve hrách

Pinbally (1980+)

  • netriviální OBB detekce

The Incredible Machine (1993)

  • pokročilá interakce

Worms (1995)

  • pixel-level environmentální interakce

Half-Life 2 (2004)

  • zničitelné prostředí, fluidní mechanika

Fyzika ve hrách

World of Goo (2008)

  • fyzika jako hlavní mechanika

Angry Birds (2009)

  • fyzika jako hlavní mechanika

INSIDE (2016)

  • soft-bodies řízené impulzivní mřížkou

Half-Life Alyx (2020)

  • fyzikální interakce

Noita (2020)

  • pixel-level simulace

Typy objektů

Body

  • základní fyzikální objekt herní scény

Rigid Body

  • tuhé těleso
  • physics-driven bodies - řízeny fyzikálním enginem
  • game-driven bodies - řízeny procedurálně (animace)
  • fixed bodies - kolizní neviditelná tělesa (triggery)

Soft body

  • deformovatelné

Shape

  • polygon či polyhedron

Fixture

  • vlastnosti materiálu objektu

Typy objektů

Constraint

  • spojuje objekty dohromady ke zjednodušení simulace (lana, kola, panty, písty)

Sensor/Phantom/Trigger

  • objekt, který se podílí na detekci kolizí, ale není vidět

Rag doll

  • humanoidní figurína

Roztříštitelné objekty

  • obvykle vytvářené nahrazením tuhého tělesa sadou menších těles

Constrainty

  • Revolute - závěs nebo čep, okolo kterého těleso rotuje
    • kola, řetězy, dveře, páky
  • Distance - udržuje fixní vzdálenost mezi tělesy
  • Rope - udržuje maximální vzdálenost mezi tělesy, simuluje lano
  • Prismatic - omezení na jeden stupeň volnosti
    • výtahy a písty
  • Weld - udržuje fixní rotaci těles
  • Cone-Twist - ramenní kloub
  • Gear - propojení těles způsobem, kdy pohyb jednoho ovlivní pohyb druhého
  • Motor - přidává tělesu silové impulzy

Constrainty

rope

revolute

prismatic

cone-twist

Constrainty

Fracturing

  • rozbití objektů na malé fragmenty
  • v mnoha případech není dynamická (hojně se používají statické animace)
  • techniky: manuální, Voronoi Shattering, voxely

Paratrooper (1982)

Fictorium (2017)

Teardown (2020)

Particle systémy

  • bodová tělesa v prostoru
  • mohou modelovat komplexní tvary
  • hojně využívá Flyweight pattern

Aplikace

  • fluidní mechanika
  • vizuální efekty
  • houfy
  • vegetace
  • soft bodies (oblečení, vlasy)

Příklad: CryEngine Fluidní fyzika

  • 5000+ řádků kódu jen pro RigidBody tělesa
  • příšerná kvalita kódu
    1 if (min(min(min(body.M,ibody_inv.x),ibody_inv.y),ibody_inv.z)<0) {
    2 body.M = body.Minv = 0;
    3 body.Ibody_inv.zero(); body.Ibody.zero();
    4 } else {
    5 body.P = (body.v=v)*body.M;
    6 body.L = body.q*(body.Ibody*(!body.q*(body.w=w)));
    7 }

Detekce kolizí

Detekce kolizí

Kroky

  • pro daný frame se spočtou výsledné pozice
  • spatial struktura nalezne kolizní kandidáty
  • detekují se skutečné kolize
  • kolize se vyřeší v collision resolveru pomocí zpětných impulzů
  • constraint resolver vyřeší constrainty (omezení stupňů volnosti)

Kolidující objekty

  • každý objekt musí mít nějakou fyzikální reprezentaci
  • čím jednodušší tvar, tím rychlejší výpočet (např. člověk se může modelovat pomocí kapsule)
  • komplexní tvary se používají jen pokud ty jednodušší nejsou v daném kontextu dostačující
  • pokud už u jednoduchých tvarů nedojde ke kolizi, nemůže k ní dojít ani u komplexnějších tvarů
  • pokud dojde ke kolizi, nemusí to nutně znamenat, že jsou objekty ve skutečné kolizi

Bounding Boxy

Koule

  • stačí nám střed a poloměr (4 čísla pro 3D)

Kapsule

  • 2D: obdélník a dva kruhy
  • 3D: válec a dvě polokoule
  • reprezentace: dva body a poloměr

AABB

  • axis-aligned bounding box (osově zarovnaný obalový tvar)
  • kvádr, jehož stěny jsou rovnoběžné s osami systému souřadnic
  • velmi rychlé pro kolizní testování
  • musí se přepočítat při každé rotaci objektu

Bounding Boxy

OBB

  • oriented bounding box
  • definovaný pozicí a rotací
  • běžně se používá

k-DOP

  • discrete oriented polytope
  • zobecněný případ AABB OBB
  • více aproximuje tvar skutečného objektu

Složené tvary

  • mohou obsahovat jakákoliv obalová primitiva

Konvexní obálka

  • konvexní tvar/objem, který obaluje celý objekt

Porovnání

Kolize ve 2D hrách

  • dokonce i side-scroller hry potřebují složené tvary
  • jednoduchá AABB kolize nebude pro nepravidelné sprity fungovat

Vyhledávání kolizních kandidátů

Naivní řešení

  • každý s každým
  • O(n^2)  -> 10 objektů vyjde na 100 kontrol, 100 na 10 000 atd.

Quad-tree

  • složitost je O(n^{1.5}\log{(n)}) , neb index vyžaduje cca \log{(n)}  porovnání při průchodu stromem
  • vhodné pro malé objekty
  • nejhorší případ: n^2

Sweep and Prune

  • seřadí hrany podle jednotlivých os (např. levý kraj a horní kraj)

BSP

  • binary space partitioning, používá se pro komplexní statické objekty (budovy)

Grid, Oct-tree, R-tree, R+tree, R*tree, X-tree, M-tree,...

Testování kolizí

Koule-koule

  • (C_1 - C_2)\cdot(C_1-C_2) \leq (r_1 + r_2)^2 , kde C  je střed

Koule-paprsek

  • stačí otestovat nejmenší vzdálenost mezi středem koule a paprskem

AABB-AABB

  • otestují se kraje

AABB-paprsek

  • intervaly [A, B]  a [C, D]  se nesmí překrývat

OBB-OBB

  • Gottschalkův axis-separating theorem

SAT

SAT (separating axis theorem)

  • pokud můžeme mezi dva polygony vložit přímku tak, že na jedné straně je jeden polygon a na druhé straně druhý, pak se nepřekrývají
  • pro 2D: AABB 2 osy, OBB 4 osy
  • pro 3D: AABB 3 osy, OBB 15 os
  • AABB ve 2D: testujeme pouze 2 osy

Tunneling problem

Substeps

  • fyzikální engine provede v rámci jednoho framu vícero iterací dle dané situace
  • čas kolize se vypočte binárním vyhledáváním, kdy s objektem hýbáme vpřed a zpět o 1/N kroku

Continuous Collision Detection (CCD)

  • používá Raycasting či techniku zvanou Swept Shapes
  • Raycasting - objekt vyšle paprsek a ten se dále testuje
  • Swept Shapes - pohyb objektu dá vzniknout siluetě nového kolizního objektu, který se dále testuje

Collision response

Jak reagovat na kolizi?

Exploze

  • přidáváme energii

Fracturing

  • objekty rozdrolíme na několik částí

Odraz

  • když se dva objekty srazí, odrazí se pod stejným úhlem a ztratí část energie

Tření

  • síla která vzniká mezi tělesy, které jsou v těsném kontaktu, omezujíc jejich pohyb
  • odebírá energii ze systému
  • statická, dynamická, valivý odpor

Constraint

  • omezení stupňů volnosti (např. dveře mohou rotovat jen kolem pantů)

Collision Resolver

Relaxace

  • LCP - Problém lineární komplementarity
  • pokud se jeden objekt pohne, musí se pohnout i druhý, třetí, čtvrtý,...
  • velmi komplexní numerické metody
  • PGS, Dantzig solver, Lemkeho methoda, Jacobiho methoda

Klidový stav

  • energie systému postupně konverguje k nule
  • může dojít k numerické nestabilitě (čísla blízko nuly)
    • sleep criteria
      • jakmile energie klesne pod určitý práh
    • simulation islands
      • shlukování objektů které jsou v interakci

Co jsme si řekli

  • Něco o vektorových operacích: sčítání, odčítání, velikost, normalizace a skalární součin
  • Něco o steering behaviors
  • Něco o obalových objektech fyzikálních enginů
  • Něco o particle systémech
  • Něco o fyzikálních omezeních (constraints)
  • Něco o bounding box kolizích
  • Co je to SAT teorém
  • Co je to CCD

Hláška na závěr

Do you guys not have phones?Wyatt Cheng, BlizzCon 2018