Gilbert -Johnson-Kerthi - algoritmi ( lyhennettynä GJK ) on algoritmi kahden kuperan joukon (objektin) välisen etäisyyden määrittämiseksi. Toisin kuin monet muut etäisyysalgoritmit, GJK ei vaadi geometriatietojen tallentamista mihinkään tiettyyn muotoon. Sen sijaan GJK-algoritmi luottaa täysin funktion tukeen ja luo iteratiivisesti (iteraatioita käyttämällä) lähimmät yksinkertaistukset kahden kuperan objektin välisen etäisyyden määrittämiseksi oikein . Samaan aikaan GJK-algoritmi käyttää työssään Minkowskin summan käsitteitä kahdelle konveksille muodolle.
Jos etsit kahden ei-kuperan objektin välistä etäisyyttä, voit: [1]
Gilbert-Johnson-Keerty-algoritmi tarjoaa melko tehokkaan menetelmän konveksien objektien välisten törmäysten havaitsemiseen. Se perustuu useisiin avainkohtiin, joista on yhteenveto alla: [2]
Minkowski-summa : On olemassa kaksi joukkoaja, niiden Minkowski-summa määritellään seuraavasti: [2]
Tämä määritelmä näyttää olevan virheellinen, koska pisteiden summaaminen on merkityksetöntä. Tässä löysässä huomautuksessa ja tulkitaan pikemminkin vektoreina , missä on maailman koordinaattijärjestelmän origo. [2]
Configuration Space Obstacle ( CSO ) . Konveksiobjektien parille annetaan niiden CSO , eli Minkowskin summa ja . Tämä joukko on erityisen hyödyllinen törmäysmäärittelyissä, koska voidaan todistaa, että ja leikkaavat, jos ja vain jos niiden kansalaisjärjestöt sisältävät koordinaattijärjestelmän origon: [2]
Lisäksi niiden etäisyys saadaan seuraavasti:
Vastaavasti objektiparien tunkeutumissyvyys voidaan ilmaista niiden CSO:na seuraavasti: [2]
Leikkaavien kohteiden parin tunkeutumissyvyys toteutuu rajan pisteessä, joka on lähinnä koordinaattijärjestelmän origoa.
Tuki kartoitus . Support Mapping on funktio, joka ottaa vektorin ja kuperan joukon ja palauttaa "äärimmäisimmän" pisteen kuperalle objektille kyseisessä suunnassa (vektorisuunta ). Muodollisesti: [2]
Erotteleva Plane/Axis : Koska kaksi esinettä ja , Taso , joka erottaa ja , jos jokaiselle pisteelle ja jokaiselle pisteelle . Vektoria kutsutaan "heikosti erottavaksi akseliksi " ja koska siinä on ainakin yksi erotustaso, joka on normaali tai vastaava,
GJK-algoritmin yleinen idea on tutkia konfiguraatioesteavaruutta (CSO) kahdelle tietylle objektille ja etsiä simpleksiä, joka sisältää koordinaattijärjestelmän origon. Jos haku päättyy kielteiseen vastaukseen, eli koordinaattijärjestelmän origo on CSO:n ulkopuolella, objektit eivät leikkaa. [3] Tässä tapauksessa CSO:n piste, joka on lähinnä koordinaattijärjestelmän origoa, edustaa erotusakselia ja , ja tätä puolestaan voidaan käyttää törmäystestauksen lähtökohtana myöhemmissä iteraatioissa. [2]
Toisaalta, jos haku onnistui ja sitten kohteet leikkaavat, tarvitaan laskelmia törmäysvasteen suorittamiseksi ja joitain muita törmäykseen liittyviä yksityiskohtia. Esimerkiksi tyypillinen piiri, joka yrittää määrittää tunkeutumissyvyyden, jonka puolestaan on löydettävä CSO-rajalla piste, joka on lähinnä koordinaattijärjestelmän origoa. Van den Bergen [ 4] ehdottaa laajennettua polytooppialgoritmia tähän tapaukseen . Järjestelmämme kuitenkin laskee suhteelliset tiedot - osumapinnan ( englanniksi hit face ) , eli CSO-kuoren pinnan, joka on lähinnä koordinaattijärjestelmän origoa. Analysoimalla tämän pinnan kärkipisteitä on mahdollista määrittää, mikä kappaleen osa osallistui törmäykseen. Tässä erotetaan kaksi päätapausta: reuna-reuna törmäykset ( reuna - reuna ) ja kärkipinnan törmäykset ( vertex-face ) . Ymmärtääksesi, kuinka osat tunnistetaan, huomaa, että kukin kansalaisjärjestö vastaa vektoriparia . Esimerkiksi kuperan objektin kärki on törmännyt kuperan objektin pintaan , jolle on tunnusomaista se, että iskupinnan kaikki kolme kärkeä vastaavat samaa objektin kärkeä , mutta kolmea eri objektin kärkeä . [2]
GJK-algoritmia käytetään usein simulaatiojärjestelmissä, tietokoneanimaatioissa ja tietokonepeleissä . Tässä tilassa laskettaessa lopullista (ulostuloa, tuloksena olevaa) simpleksia edellisestä iteraatiosta, sitä käytetään lähtötietona seuraavassa iteraatiossa (kehys, kehys). Jos paikka uudessa kehyksessä on lähellä samaa sijaintia vanhassa kehyksessä, niin algoritmi konvergoi yhdessä tai kahdessa iteraatiossa.
Algoritmin vakaus, nopeus ja muistijalanjälki ovat tehneet siitä suositun reaaliaikaisessa törmäyksentunnistuksessa , erityisesti tietokonepelien fysiikkamoottoreissa . [yksi]