Gilbert-Johnson- Kerthi -algoritmen ( forkortet GJK ) er en algoritme til at bestemme afstanden mellem to konvekse sæt (objekter). I modsætning til mange andre afstandsalgoritmer kræver GJK ikke, at geometridataene gemmes i et bestemt format. I stedet er GJK-algoritmen helt afhængig af understøttelsen af funktionen og genererer iterativt (ved hjælp af iterationer) de nærmeste simplices for korrekt at bestemme afstanden mellem to konvekse objekter . Samtidig bruger GJK-algoritmen i sit arbejde begreberneMinkowski summer for to konvekse former.
I tilfælde af at finde afstanden mellem to ikke-konvekse objekter, kan du: [1]
Gilbert-Johnson-Keerty-algoritmen giver en ret effektiv metode til at detektere kollisioner mellem konvekse objekter. Den bygger på flere nøglepunkter, som er opsummeret nedenfor: [2]
Minkowski sum : Der er to sætogderes Minkowski sum er defineret som: [2]
Denne definition ser ud til at være forkert, da det er meningsløst at summere pointene. I denne løse bemærkning og lad hellere opfattes som vektorer , hvor er oprindelsen til verdenskoordinatsystemet. [2]
Konfiguration Space Obstacle ( CSO ) . For et par konvekse objekter vil deres CSO blive givet , det vil sige Minkowski-summen af og . Dette sæt er især nyttigt i kollisionsdefinitioner, da det kan bevises, at og skærer hinanden, hvis og kun hvis deres CSO'er indeholder oprindelsen af koordinatsystemet: [2]
Derudover er deres afstand givet af:
På samme måde kan indtrængningsdybden for par af objekter udtrykkes i forhold til deres CSO som: [2]
For et par skærende objekter realiseres indtrængningsdybden af det punkt på grænsen , der er tættest på koordinatsystemets udspring.
Support kortlægning . Support Mapping er en funktion, der tager en vektor og en konveks mængde og returnerer det mest "ekstreme" punkt for det konvekse objekt i den retning (vektorretning ). Formelt set: [2]
Adskillelsesplan/akse : Givet to objekter og , en plan der adskiller og , hvis for hvert punkt og for hvert punkt . Vektoren er kendt som en "svagt adskillelsesakse " for og fordi der er mindst ét adskillelsesplan, der er normalt på den, eller tilsvarende,
Den generelle idé med GJK-algoritmen er at udforske konfigurationsforhindringsrummet (CSO) for to givne objekter og lede efter en simplex, der indeholder oprindelsen af koordinatsystemet. Hvis søgningen ender med et negativt svar, det vil sige, at oprindelsen af koordinatsystemet ligger uden for CSO'en, så skærer objekterne ikke hinanden. [3] I dette tilfælde repræsenterer det punkt fra CSO'en, der er tættest på koordinatsystemets oprindelse, adskillelsesaksen og , og denne kan igen bruges som udgangspunkt for kollisionstest i efterfølgende iterationer. [2]
På den anden side, hvis søgningen var vellykket, og objekterne derefter krydser hinanden, er der behov for beregninger for at udføre kollisionsreaktionen og nogle andre detaljer med hensyn til kollisionen. For eksempel et typisk kredsløb, der forsøger at bestemme penetrationsdybden, som igen skal finde et punkt på CSO-grænsen, der vil være tættest på koordinatsystemets oprindelse. Van den Bergen [ 4] foreslår en udvidet polytopalgoritme til dette tilfælde . Vores system beregner dog relativ information - hitfacet ( engelsk hit face ) , altså det ansigt på CSO-skallen, der er tættest på koordinatsystemets oprindelse. Ved at analysere hjørnerne i dette ansigt er det muligt at bestemme, hvilken del af objektet, der deltog i kollisionen. Her skelnes der mellem to hovedtilfælde: kant-kant-kollisioner ( kant - kant ) og top-flade kollisioner ( vertex-face ) . For at forstå, hvordan de konstituerende dele identificeres, skal du bemærke, at hver af CSO'erne svarer til et par vektorer . For eksempel er et toppunkt på en konveks genstand kollideret med en flade på et konveks objekt , hvilket er kendetegnet ved, at alle tre hjørner af anslagsfladen svarer til det samme toppunkt af objektet , men til tre forskellige hjørner af objektet . [2]
GJK-algoritmen bruges ofte i simuleringssystemer, computeranimation og computerspil . I denne tilstand, når man beregner den endelige (output, resulterende) simplex fra den forrige iteration, bruges den som startdata i den næste iteration (ramme, ramme). Hvis positionen i den nye ramme er tæt på den samme position i den gamle ramme, vil algoritmen konvergere i en eller to iterationer.
Algoritmens stabilitet, hastighed og hukommelsesfodaftryk har gjort den populær inden for kollisionsdetektion i realtid , især i fysikmotorer til computerspil. [en]