Törmäyksen tunnistus. Törmäyksen tunnistus tietokonopeleissä. Törmäyksen tunnistus. Sijainti pelisilmukassa. Timo Suomela

Samankaltaiset tiedostot
x 5 15 x 25 10x 40 11x x y 36 y sijoitus jompaankumpaan yhtälöön : b)

Lieriö ja särmiö Tarkastellaan pintaa, joka syntyy, kun tasoa T leikkaava suora s liikkuu suuntansa

PRELIMINÄÄRIKOE PITKÄ MATEMATIIKKA

Suorien ja tasojen geometriaa Suorien ja tasojen yhtälöt

GEOMETRIA MAA3 Geometrian perusobjekteja ja suureita


Tietorakenteet, laskuharjoitus 7, ratkaisuja

Kartio ja pyramidi

Tekijä Pitkä matematiikka

Tekijä Pitkä matematiikka Suoran pisteitä ovat esimerkiksi ( 5, 2), ( 2,1), (1, 0), (4, 1) ja ( 11, 4).

Algoritmit 2. Luento 11 Ti Timo Männikkö

Vektorien pistetulo on aina reaaliluku. Esimerkiksi vektorien v = (3, 2, 0) ja w = (1, 2, 3) pistetulo on

MATEMATIIKKA JA TAIDE I

yleisessä muodossa x y ax by c 0. 6p

YMPYRÄ. Ympyrä opetus.tv:ssä. Määritelmä Kehän pituus Pinta-ala Sektori, kaari, keskuskulma, segmentti ja jänne

Yhtälöryhmä matriisimuodossa. MS-A0004/A0006 Matriisilaskenta. Tarkastellaan esimerkkinä lineaarista yhtälöparia. 2x1 x 2 = 1 x 1 + x 2 = 5.

Luento 10: Työ, energia ja teho. Johdanto Työ ja kineettinen energia Teho

Algoritmit 1. Luento 8 Ke Timo Männikkö

Jypelin käyttöohjeet» Miten voin liittää törmäyksiin tapahtumia?

4.3 Kehäkulma. Keskuskulma

Taso 1/5 Sisältö ESITIEDOT: vektori, koordinaatistot, piste, suora

y=-3x+2 y=2x-3 y=3x+2 x = = 6

Algoritmit 2. Luento 10 To Timo Männikkö

Yhtälön oikealla puolella on säteen neliö, joten r. = 5 eli r = ± 5. Koska säde on positiivinen, niin r = 5.

9. Vektorit. 9.1 Skalaarit ja vektorit. 9.2 Vektorit tasossa

2 Pistejoukko koordinaatistossa

2.2. Kohteiden konstruktiivinen avaruusgeometrinen esitys

Kenguru Student (lukion 2. ja 3. vuosi) sivu 1 / 6

MATEMATIIKKA JA TAIDE II

Opetusmateriaali. Tarvittavat välineet: KUVA 1. Rullakko 1. KUVA 2. Rullakko 2, jossa kiekoissa on kuhmu

Helsingin seitsemäsluokkalaisten matematiikkakilpailu Ratkaisuita

Kenguru 2012 Junior sivu 1 / 8 (lukion 1. vuosi)

KJR-C1001 Statiikka ja dynamiikka. Luento Susanna Hurme

Ratkaisut vuosien tehtäviin

Algoritmit 2. Luento 6 Ke Timo Männikkö

Tampereen yliopisto Tietokonegrafiikka 2013 Tietojenkäsittelytiede Harjoitus

Eye Pal Solo. Käyttöohje

a b c d

Tehtävien ratkaisut

Pong-peli, vaihe Koordinaatistosta. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 2/7. Tämän vaiheen aikana

v 8 v 9 v 5 C v 3 v 4

Jakso 8. Ampèren laki. B-kentän kenttäviivojen piirtäminen

Johdatus matematiikkaan - tarinaosasto Tero Kilpeläinen

Algoritmit 2. Luento 7 Ti Timo Männikkö

Algoritmit 2. Luento 6 To Timo Männikkö

58131 Tietorakenteet (kevät 2009) Harjoitus 6, ratkaisuja (Antti Laaksonen)

Suorista ja tasoista LaMa 1 syksyllä 2009

Demo 1: Simplex-menetelmä

Pelimatematiikka ja ohjelmointi ATMOS, Mikkeli

Vanhoja koetehtäviä. Analyyttinen geometria 2016

A Lausekkeen 1,1 3 arvo on 1,13 3,3 1,331 B Tilavuus 0,5 m 3 on sama kuin 50 l 500 l l C Luvuista 2 3, 6 7

Algoritmi III Vierekkäisten kuvioiden käsittely. Metsätehon tuloskalvosarja 7a/2018 LIITE 3 Timo Melkas Kirsi Riekki Metsäteho Oy

KJR-C1001: Statiikka L2 Luento : voiman momentti ja voimasysteemit

Lukujonon raja-arvo 1/7 Sisältö ESITIEDOT: lukujonot

Kenguru 2015 Mini-Ecolier (2. ja 3. luokka) RATKAISUT

5.3 Suoran ja toisen asteen käyrän yhteiset pisteet

Tässä osassa ei käytetä laskinta. Selitä päätelmäsi lyhyesti tai perustele ratkaisusi laskulausekkeella, kuviolla tms.

Kenguru 2013 Student sivu 1 / 7 (lukion 2. ja 3. vuosi)

MS-A0202 Differentiaali- ja integraalilaskenta 2 (SCI) Luento 1: Parametrisoidut käyrät ja kaarenpituus

Tekijä Pitkä matematiikka b) Kuvasta nähdään, että b = i 4 j. c) Käytetään a- ja b-kohtien tuloksia ja muokataan lauseketta.

Kenguru 2010 Cadet (8. ja 9. luokka) sivu 1 / 5

MS-A0003/A0005 Matriisilaskenta Malliratkaisut 5 / vko 48

Matematiikan tukikurssi

! 7! = N! x 8. x x 4 x + 1 = 6.

PAINOPISTE JA MASSAKESKIPISTE

Mohrin-Mascheronin lause kolmiulotteisessa harppi-viivaingeometriassa

M 1 ~M 2, jos monikulmioiden vastinkulmat ovat yhtä suuret ja vastinsivujen pituuksien suhteet ovat yhtä suuret eli vastinsivut ovat verrannolliset

Kombinatorinen optimointi

Kenguru 2014 Student sivu 1 / 8 (lukion 2. ja 3. vuosi)

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

Ympyrä 1/6 Sisältö ESITIEDOT: käyrä, kulma, piste, suora

Monikulmiot 1/5 Sisältö ESITIEDOT: kolmio

Anna jokaisen kohdan vastaus kolmen merkitsevän numeron tarkkuudella muodossa

Luvun 5 laskuesimerkit

= = = 1 3.

TÖRMÄYKSEN TUNNISTUS 3D- YMPÄRISTÖSSÄ

KJR-C1001 Statiikka ja dynamiikka. Luento Susanna Hurme

Mb8 Koe Kuopion Lyseon lukio (KK) sivu 1/3

Luento 3: 3D katselu. Sisältö

Juuri 4 Tehtävien ratkaisut Kustannusosakeyhtiö Otava päivitetty Kertaus. b) B = (3, 0, 5) K2. ( )

Algoritmit 2. Luento 13 Ti Timo Männikkö

Algoritmit 2. Luento 4 To Timo Männikkö

Luku 8. Aluekyselyt. 8.1 Summataulukko

Algoritmit 2. Luento 2 To Timo Männikkö

Algoritmit 2. Luento 4 Ke Timo Männikkö

763306A JOHDATUS SUHTEELLISUUSTEORIAAN 2 Ratkaisut 2 Kevät 2017

0, niin vektorit eivät ole kohtisuorassa toisiaan vastaan.

a) Lasketaan sähkökenttä pallon ulkopuolella

12. Derivointioperaattoreista geometrisissa avaruuksissa

Yhtälöryhmä matriisimuodossa. MS-A0007 Matriisilaskenta. Tarkastellaan esimerkkinä lineaarista yhtälöparia. 2x1 x 2 = 1 x 1 + x 2 = 5.

3.3 Paraabeli toisen asteen polynomifunktion kuvaajana. Toisen asteen epäyhtälö

58131 Tietorakenteet (kevät 2009) Harjoitus 11, ratkaisuja (Topi Musto)

Diplomi-insinööri- ja arkkitehtikoulutuksen yhteisvalinta 2017 Insinöörivalinnan matematiikan koe , Ratkaisut (Sarja A)

MAB3 - Harjoitustehtävien ratkaisut:

Tekijä MAA2 Polynomifunktiot ja -yhtälöt = Vastaus a)

Suora 1/5 Sisältö ESITIEDOT: vektori, koordinaatistot, piste

Luento 6: Geometrinen mallinnus

Geometrian kertausta. MAB2 Juhani Kaukoranta Raahen lukio

Transkriptio:

Törmäyksen tunnistus tietokonopeleissä Timo Suomela Törmäyksen tunnistus Halutaan tietää, kun Pelaajahahmo kävelee seinää päin Jotta hahmon animaatio sekä liike voidaan pysäyttää/muuttaa Auto palaa ilmahypyn jälkeen maan pinnalle Auto pystyy kiihdyttämään jälleen, sillä renkaat koskettavat taas tienpintaan Pelaajahahmo koskee merkittyyn kohtaan pelikentässä Pelin tapahtumia ohjaava laukaisin (trigger) käynnistää käsikirjoitetun sekvenssin (scripted sequence), esim. välianimaation Törmäyksen tunnistus Sijainti pelisilmukassa Törmäyksen tunnistus (collision detection) Törmäysten löytämistä sekä ajassa että avaruudessa Ketkä törmäävät Milloin törmäys tapahtuu Missä törmäys tapahtuu Törmäyksen ratkaisu (collision resolution) Mitä törmäyksestä seuraa Riippuu vahvasti pelissä käytetystä fysiikkamallista, käsitellään ainoastaan periaatetasolla. while (gamerunning) { processinput(); performai(); moveobjects(); drawgraphics(); playsounds(); sleepremainder(); } Pelisilmukka toistaa aikakehyksestä (frame) toiseen samat toimenpiteet Törmäykset voidaan tunnistaa joko ennen kun kappaleita liikutetaan (intersection testing), tai sen jälkeen kun ne ovat jo liikkuneet (overlap testing). 1

Ongelma? Algoritmin valinta Kuten aina, käytettävissä olevat resurssit ovat niukat Aika, muisti Periaattessa jokainen liikkuva kappale voi törmätä jokaisessa aikakehyksessä jokaiseen toiseen liikkuvaan tai staattiseen kappaleeseen 3D-ympäristöissä kappaleet koostuvat kymmenistä, sadoista, tuhansista kolmioista (verkko, mesh) Naiivi algoritmi tarkistaa kaikki kappaleet pareittain, törmäävätkö ne. 3D-ympäristöissä tämä siis tarkoittaa että tarkistetaan jokaisen tarkistusparin kaikki kolmiot leikkauksen varalta Jos liikkuvia kappaleita on n ja staattisia kappaleita m, niin tarvittavien testien määrä on mn + n(n-1) / 2 Vastaa O(n²) aikavaatimusta Törmäävien kappaleiden geometria on keskeisin tekijä sopivan algoritmin valinnassa Kappaleet voi olla pisteitä tai viivoja tai jotain moniulotteisempia muotoja (kolmio, neliö, kuutio...) Kappale voi olla kupera (convex) tai kovera (concave), umpinainen tai ontto, joustava tai jäykkä,... Kappaleiden liike on toinen tekijä Kunka nopeasti kappaleet liikkuvat Kuinka usein kappaleita päivitetään Yleiset algoritmille asetetut vaatimukset Nopeus Yksinkertaisuus Vankkuus (robustness) Sopivan algoritmin periatteita Sijaiskappale Karsitaan nopeilla karkeilla testeillä kalliiden tarkempien testin lukumäärää Aproximoidaan kappaleet yksinkertaisemmalla geometrisella muodolla Hyväksikäytetään paikallisuutta Ainoastaan ne kappaleet voivat törmätä, jotka ovat tarpeeksi lähellä toisiaan Käytetään hyväksi peräkkäisten testien yhtenäisyyttä Aikakehyksestä toiseen tapahtuu vain vähän muutosta Proxy Kahden kolmioverkon leikkaustestaus on kallista Käytetään kappaleen sijaisean yksinkertaisempi geometrinen muoto -> halvemmat testit Jos kaksi sijaista törmää toisiinsa tehdään lisätarkistuksia selvittääkseen, törmäävätkö myös alkuperäiset kappaleet Jos kaksi sijaista ei törmää, ei tarvita listätestejä, jos sijainen ympäröi kappaleen kokonaan. Hyvä sijaiskappale on mahdollisimman samanmuotoinen alkuperäisen kappaleen kanssa Vähemmän false positives, eli tilanteita, joissa sijaiskappaleet leikkavaat, mutta ei alkuperäiskappaleet 2

Sijasikappale: Rajauskehikko Rajauskehikko : Ympyrä Bounding Volume Tarkoitus on yksinkertaistaa monimutkaista geometriaa yksinkertaisemmalla Jos kahden kappaleen rajauskehikot eivät leikkaa, niin ei myöskään itse kappaleet leikkaa ja voidaan jättää tekemättä tarkempaa testausta. Kehyksen ja kehystetyn kappaleen välillä pitää olla mahdollismman vähän tilaa Mitä enemmän tilaa, sitä suurempi todennäköisyys väärille tunnistuksille (false positive) Bounding Sphere Geometrisesti yksinkertaisin kehikko Pyöreen kehikon määrittelyyn riittää kaksi arvoa, keskipiste ja säde Kappaletta voidaan vapaasti pyörittää pyöreän kehikon sisällä Pyöreiden kehysten yhteentörmäys on helppo tunnistaa Jos keskipisteet ovat lähempänä kuin säteiden summa niin ympyrät leikkaavat. Rajauskehikot : Lieriö Rajauskehikot : Rajauslaatikko Bounding Cylinder Lieriön muotoisen kehikon määrittleyyn riittää kolme arvoa Pohjana toimivan ympyrän keskipiste Kantena toimivan ympyrän keskipiste Ympyröiden säde Lieriö sopii hyvin sellaisen kappaleen kehikoksi joka liikkuu tasaisella alustalla ja pyörii ainoastaan pystyakselin (x) ympäri Esimerkiksi pelaajahahmo Kahden x-akselin suuntaisen, samalla tasolla seisovan lieriön leikkaus on helppo todeta: Jos kappaleiden akseleiden välinen etäisyys on pienempi kui niiden yhteenlaskettu säde, niin kappaleet leikkaavat. Bounding Box Rajauslaatikko on laatikkomainen kehikko kappaleen ympärillä. Parempi kuin ympyrä sellaisissa tilanteissa, joissa kappaleet on hyvin lähellä toisiaan kuitenkin törmäämättä toisiinsa. Katua pitkin avajan auton tapauksessa kappaletta ympyröivä ympyrä leikkaa katua, vaikka auto on sen pinnalla. Tämä aiheuttaa turhia (kalliita) lisätestejä joka aikakehyksessä. Rajauslaatikko ei leikkaa kadun pintaa, joten ei tarvita lisätestejä. 3

Rajauskehikot : AABB Rajauskehikot : AABB Axis Aligned Bounding Box Laatikonmallinen kehys jonka särmät ovat maailman koordinaatiston akseleiden suuntaiset. Kahden AABB -kehikon leikkaus helppo tarkistaa tarkistamalla, onko yhden kehikon jokin nurkkapiste toisen kehikon sisälllä. Kaksi AABB kehystä A ja B ei leikkaa, joss: max(ax) < min(bx) tai max(bx) < min(ax) max(ay) < min(by) tai max(by) < min(ay) max(az) < min(bz) tai Joudutaan laskemaan yleensä uudestaan, kun kehystettävää kappaletta pyöritetään Voidaan myös laskea kappaleen pisimmän akselin mukaisesti. Kappaletta voidaan sillon pyörittää vapaasti kehikon sisällä joutumatta laskemaan sitä uudestaan. Kappaleen ympärille jää näin kylläkin paljon hukkatilaa. Rajauskehikot : OBB Rajauskehikot : AABB Oriented Bounding Box Laatikonmallinen kehikko, joka on samansuuntainen kuin kehystetty kappale Voidaan pyörittämään kappaleen mukana Yleensä parempi istuvuus kuin ympyröillä ja AABBkehikoilla Kahden OBB:n leikkauksen laskeminen kalliimpaa kuin kahden AABB:n AABB voidaan laskea kappaleen pyörityksen jälkeen myös OBB:n avulla. OBB:n avulla AABB:n laskeminen on halvempaa kuin monimutkaisen kappaleen perusteella Saattaa jätää paljon enemään turhaa tilaa kehystetyn kappaleen ympärille verrattuna itse kappaleen perusteellaa laskettuun AABB-kehykseen. 4

Rajauskehikot : k-dop Rajauskehikot : k-dop Discrete Orientation Polytype Kappale kehystetään k tunnetulla tasolla Voidaan ajatella, että kappale joutuu tasojen puristukseen Kaksiulotteinen k-dop on polygoni Kolmiulotteinen k-dop on polyhedron Kolmiulotteisessa koordinaatistossa AABB ja OBB vastaavat 6-DOP -kehikkoa Yleensä vähemmän hukkatilaa kuin OBB -kehikolla ja paras istuvuus kaikista kehikoista Joudutaan laskemaan Rajauskehikot : Kupera kehys Rajauskehikot : Hierarkiat Convex Hull Pienin mahdollinen kupera polytyyppi Vähiten hukkatilaa kappaleen ympärillä Toisin kuin k-dop:in kohdalla, tasot eivät ole ennestään tiedossa Bounding Volume Hierarchy Koko kappaleen kehystävä kehikko jaetaan rekursiivisesti pienempiin kehikkoihin Kappaleet muodostavat binääripuun Rekursio voi ylettyä alimmalle tasolle, jolloin kappaleen verkon yksittäiset kolmiot muodostavat puun lehdet. Rekursion syvyydellä voidaan säätää tunnistuksen tarkkuutta. 5

Rajauskehikot : Hierarkiat Törmäyksen testaus Oheisen kuvan kaksi AABB:tä törmäävät toisiinsa. Ihminen pystyy näkemään, että itse kappaleet eivät kuitenkaan törmää. Mistä tiedetään törmäävätö kaksi kappaletta toisiinsa? Jos pystymme löytämään tason, joka erottaa annetut kaksi kappaletta, niin tiedetään, etteivät ne törmää. Törmäyksen testaus Törmäyksen testaus Erottavan tason etsintä voidaan aloittaaa kappaleen tasoista. Tasolle määritellään normaalivektori Nurkkapisteiden normaalivektoreiden keskiarvo tai kahden tason muodostavan vektorin ristitulo Muodostetaan vektorit tason jostain nurkkapisteestä jokaisen toisen kappaleen nurkkapisteisiin (kuvassa ba) Jos tälläisen vekorin ja tason normaalivektorin pistetulo on positiivinen, niin nurkkapiste on tason omistavan kappaleen ulkopuolella Entä jos ollaan käyty läpi kaikki kappaleen tasot ja ei olla löydetty erottavaa tasoa? Mahdollisia tasoja on ääretön määrä. Muodostetaan taso käyttämällä yhden kappaleen yhtä särmää ja toisen kappaleen yhtä nurkkapistettä. Jos yhden kappaleen kaikki nurkkapisteet ovat tämän tason yhdellä puolella, ja toisen kappaleen kaikki nurkkapisteet tason toisella puolella, ollaan löydetty erottava taso. 6

Törmäyksen testaus Törmäyksen ajankohta Jos kappaleet erottava taso löydetään, se kannattaa tallentaa jonnekkin seuraavan aikakehyksen tarkistusta varten Testit toimivat ainoastaan kuperilla kappaleilla Jos kappaleet ovat koveria, tarvitaan kappaleen ympärille kupera kehys Kovera kappale voidaan jakaa pienempiin kuperiin kappaleisiin Voidaan käyttää menetelmiä, jotka luovat automaattisesti kuperan kehyksen koveran kappaleen ympärille Kappaletta varten voidaan käsin mallintaa törmäystarkistuksessa käytettävä kupera kappale. Näin 3D-artisti voi päätää, mitkä ovat kappaleen törmäystarkistuksen kannalta tärkeimmät piirteet. Yleiseensä kahden kappaleen törmäyksen ajankohta on aikakehyksen sisällä, harvemmin jommassakummassa päässä. Kehyksen alussa kappaleet ovat erillään Kehyksen lopussa kappaleet ovat ainakin osittain päällekkäin Tarvitaan törmäyksen tarkka ajankohta sekä paikka Reaktio saadaan tarkemmaksi Etäisyyden puolittaminen Distance halving Jos kappaleet ovat ainakin osittain päälekkäin, voidaan laskea törmäyksen ajankohta palaamalla ajassa taakseppäin Tiedetään, että kehyksen alussa kappaleet eivät olleet pällekkäin (tämä on meidän alaraja) kehyksen lopussa kappaleet ovat päällekkäin (tämä on meidän yläraja) törmäys on siis tapahtunut kuluvan aikakehyksen sisällä Puolittamalla etäisyyttä kappaleen ylä- ja alarajan välillä lähestytään törmäyksen ajankohtaa. Jos puolituksen jälkeen kappaleet ovat päällekkäin tulee pisteestä tulee uusi yläraja Jos puolituksen jälkeen kappaleet eivä ole päällekkäin tulee pisteestä uusi alaraja Jatketaan, kunnes ylä- ja alaraja ovat samat tai tarpeeksi lähellä toisiaan Etäisyyden Kuvassa näkyy liikkuva kappale A ja staattinen kappale B ajassa t=0 7

Etäisyyden Ajassa t=1 kappale A törmää kappaleeseen B Etäisyyden Puolittamalla etäisyyden kappaleen A:n sijainneista ajassa t=0 ja t=1 saadaan uusi sijanti kappaleelle A ajassa t=0,5. Kappale A ei enään leikkaa kappale B:n aluetta mutta on vielä törmäyksen kannalta liian kaukan siitä. Mennään ajassa hieman eteenpäin Etäisyyden Puolitetaan matka kappale A:n sijainnista ajassa t=0,5 ja t=1 ja saadaan kappaleen A:n sijainti ajassa t=0,75. Nyt kappaleet leikkaavat taas, eli mennään ajassa hieman taakseppäin Etäisyyden Puolitetaan matka kappale A:n sijainnista ajassa t=0,5 ja t= 0,75 ja saadaan kappaleen A:n sijainti ajassa t=0.625. Kappaleet eivät leikka toisiaan, mutta ovat vielä hieman liian kaukana toisistaan. Mennään ajassa hieman eteenpäin 8

Etäisyyden Puolitetaan matka kappale A:n sijainnista ajassa t=0,625 ja t=0,75 ja saadaan kappaleen A:n sijainti ajassa t=0,6875. Kappaleet leikkaavat jälleen, eli mennään hieman ajassa taakseppäin Etäisyyden Puolitetaan matka kappale A:n sijainnista ajassa t=0,625 ja t=0,6875 ja saadaan kappaleen A:n sijainti ajassa t=0,65625 Etäisyyden Kappaleet ovat tarpeeksi lähellä toisiaan, ja ollaan löydetty ajankohta, jolla kappaleet A ja B törmäävät (t=0,65625) Etäisyyden puolittaminen Eniten käytetty menetelmä törmäyksen ajankohdan selvittämiseen Suhtellisen edullinen Ei huomaa liian nopeasti liikkuvien kappaleiden törmäystä window t -1 t 0 t 1 t 2 bullet 9

Nopeasti liikkuvat kappaleet Nopeasti liikkuvat kappaleet Joitakin vaihtoehtoisia ratkaisumahdollisuuksia Yksinkertaisin ratkaisu on jättää vaikeimmat tapaukset huomioimatta. Pelaaja ei välttämättä huomaa kaikkia 'vilppejä'. Mallinnetaan liikerata viivasegmentillä kappaleen keskipisteestä kehyksen alussa kehyksen loppuun + Yksinkertainen - Vieläkin jää joitakin törmäyksiä huomaamatta, eli vaikka viivasegmentti ei törmää, kappale voi törmätä Pienennetään kehyksen pituutta + Kaikki törmäykset löydetään - Kehyksen maksimipituus pitää ensin selvittää, kallis Rajoitetaan kappaleiden ominaisuuksia Määritellään kappaleille maksiminopeus ja minimikoko Askelpituuten ylärajaksi muodostuu minimikoko jaettuna maksiminopeudella. Voidaan käyttää muita lisärajoitteita Rajoitetaan kappaleiden liike: Lineaari liike Luodaan kappaleen kehystävä ympyrä Luodaan laatikon malllinen kehys joka kehystää kappaleen kehystävän ympyrän sekä aikakehyksen alussa että lopussa Törmäyksen ennustaminen Törmäyksen ennustaminen Törmäyksen voidaan ennustaa myös aikakehyksen alussa tarkistamalla, leikkaavatko kahden kappaleen liikeradat (intersection testing) Testattavat kappaleet venytetään liikeradan suuntaisesti Jos venytetyt kappaleet menevät päällekkäin, tiedetään törmäyksen tapahtuvan annetun aikakehyksen aikana. A+ B:A X and B Y Kahdesta testattavasta kappaleesta voidaan tehdä uusi geometrinen muoto ottamalla niiden Minkowski summa, joka helpoittaa trömäyksen ennustamista Uusi kappale lasketaan lisäämällä kappaleen X pisteisiin kaikki kappaleen Y pisteet. t 0 t 1 X Y = X Y = X Y 10

Törmäyksen ennustaminen Törmäyksen ennustaminen Nyt riittää, että tarkistetaan, leikkaako liikkuvan kappaleen liikerataa uutta summana saatua kappaletta. t 1 t 1 Törmäyksen ennustamisella saadaan tarkempi tulos törmäyksen ajankodalle, kuin esim. etäisyyden puolittamalla. Vaikea ellei mahdoton erottaa pelin fysiikkamoottorista Asettaa rajoituksia pelin fyysiikanmallille Kappaleiden nopeus pitää olla vakio, kiihtyvyys nolla, liikkeen lineaarinen t 0 t 0 Testattavien kappaleparien vähentämien Testattavien kappaleparien vähentämien Annetussa pelissä on 36 vapaasti liikkuvaa kappaletta Teoreettisesti jokainen voi törmätä jokaiseen annetussa aikakehyksessä Törmäysten löytämiseen kappaleet pitää testata pareittain -> tarvitaan n(n-1) / 2 testiä joka vastaa O(n^2) aikavaatimusta 36 kappaleen kohdalla pitää testata 630 paria Ratkaisu: Jaetaan kenttä soluihin Nyt tarvitaan ainoastaan testata niitä kappalepareja, jotka ovat annetussa aikakehyksessä saman solun alueella Jos solut valitaan tarpeeksi pieniksi ja kappaleet jakautuvat pelikentälle tasaisesti, parien läpikäynti lähenee O(n), eli tarvitaan ainoastaan 36 testiä Periaattessa kaikki kappaleet voivat olla myös saman solun sisällä, jolloin aikavaatimus ei ole parantunut aikaisemmasta 11

Testattavien kappaleparien vähentämien Testattavien kappaleparien vähentämien BSP puu (Binary Space Partitioning Tree) Pelikenttä on jaettu tasoilla rekursiivisesti soluihin Puun juuressa on koko avaruuden kahteen osaan jakava taso. Tasoina voidaan käyttää pelikentän polygonien tasoja Jokaisella tasolla on etu- ja takapuoli, jokaisen solmun vasen lapsi vastaa tason etupuolta, solmun oikea lapsi tason takapuolta Jos jokin käsiteltävä taso leikkaa jo puuhun otettua tasoa, se jaetaan kahteen osaan Mitä tasapainoisempi puu (jokaisella ei-lehtisolmulla kaksi lasta) ja mitä vähemmän polygoneja pitää leikata pienempiin osiin, sitä parempi lopputulos Haastavaa löytää oikea jako -> käytetään BSP-kääntäjää joka käytännössä brute force -menetelmällä käy läpi vaihtoehdot ja valitsee parhaan Myös pelikentää voidaan jakaa puumaiseen hierarkiaan siten, että jaetaan kentän staattisia kappaleita soluihin Puuta voidaan käyttää sitten pelaajan ja kentän välisen törmäyksen selvittämiseen Pyyhkäisymenetelmä Törmäyksen ratkaisu Sweep and prune Jos on käytössä AABBkehikkoja voidaan hyödyntää sen ominaisuuksi kappaleparien karsimisessa Jos kaksi AABB-kehikkoa leikkavat toisiaan, niin ne tekee niin jokaisella koordinaatiston akselilla Käydään kaikki akselit vuorotellen läpi ja kerätään ne parit listaan, joiden projektiot annetulle akselille menevät päällekkäin Jos jo talteen otettu pari ei leikkaa myöhemmin tarkistetulla akselilla, se y x Mitä tapahtuu, kun törmäys kahden kappaleen välillä on tunnistettu, riippuu pelistä. Jompikumpi tai kummatkin kappaleet tuhoutuvat Näytetään jonkinlainen visuaalinen efekti Soitetaan jonkinlainen ääniefekti Käynnistetään jokin tapahtumaketju 12

Loppu 13