Pathfinding
–Vad är det? –Sökning från A till B
Tracking –Enklaste versionen av pathfinding –Gå rakt till målet, utan hänsyn till hinder –Algo 1. Dra linje mellan start och mål 2. Flytta objektet med vektorn 3. Om inte vid målet, upprepa (gå till 2)
Crash and turn –Som tracking, men när objektet kolliderar med något så backar man, går åt höger eller vänster ett givet antal steg, och sen provar man att gå mot målet igen –Algo 1. Dra linje mellan start och mål, normalisera 2. Flytta objektet med vektorn 3. Om kollision: –3A. Backa ett antal steg (negera riktning) –3B. Välj riktning (rotera vektor) –3C. Flytta ett antal steg, hårdkodat eller slumpat 4. Om inte vid målet, upprepa (gå till 2)
Contour tracing –Förbättrad variant av Crash and Turn. Skillnaden är att när objekt kolliderar med något så följer man dess konturer istället för att bara slumpa en ny riktning. Man testar periodiskt om en linje (från obj till mål) skär hindret – gör den det, fortsätt följ, annars vrid mot mål. –Vanligt i FPS, inte bra i spel med toppvy –Algo 1. Dra linje mellan start och mål, normalisera 2. Flytta objektet med vektorn 3. Om kollision: –3A. Följ linjesegment (välj riktning, slumpa eller ta närmast) –3B. Dra linje från objekt till mål –3C. Om linje skär hinder, fortsätt följ kontur (gå till 3A) 4. Om inte vid målet, upprepa (gå till 2)
Collision Avoidance Tracks –Förbättrad Contour Tracing. Contour Tracing ser dumt ut uppifrån. Kräver bättre algoritm som inte följer kontur slaviskt. –Placera spår runt hinder, som visar väg. Spår består av antal noder, och kopplingen mellan visar hur man ska gå. –När objektet skall flyttas mot mål, testar man (med linje) om det är fritt mot mål. Finns det hinder, går man till närmsta spår, med tracking, och följer fler spår tills linjen mot mål är fri igen. –Kommer alltid att hitta en väg runt hinder, eftersom det är förbestämt.
Collision Avoidance Tracks –Algo 1. Dra linje mellan start och mål, normalisera 2. Flytta objekt med vektor 3. Om hinder i vägen (linjetest) –3A. Hitta närmaste trackingnod –3B. Gå till den (tracking) –3C. Följ riktningsvektor till nästa nod –3D. Om hinder i vägen, upprepa (gå till 3C) 4. Om inte vid målet, upprepa (gå till 2)
Waypoint Pathfinding –Vidareutveckling av Collision Avoidance Tracks. –Istället för bara noder runt hinder, noder på hela banan. –Enkelt: hitta närmsta nod och följ riktningsvektorer till mål. –Väldigt användbar i bilspel.
Waypoint Pathfinding, exempel struct WayPoint {int x, y; WayPoint * next; } WayPoint path[5] = {{ x0, y0, & path[1] }, { x1, y1, & path[2] }, { x2, y2, & path[3] }, { x3, y3, & path[4] }, { x4, y4, NULL /* markerar slut */ }}; // Kan även peka på noder i annan lista, för att byta spår // Följ noderna, pseudo While(not_at_goal()) { tracking(path[next_node]); if(reached(path[next_node])) next_node = path[next_node].next; }
A* –Graf, noder, kanter –Används för sökningar i träd / grafer Gamestates, luffarschack, schack (sök mål) –Breadth first, depth first –Använder heuristiska funktioner för att kapa dåliga sökgrenar. Algoritm, bakgrund –Sökarea, rutnät (men ändå graf), start / mål, (non)walkable, parent / child, islands –Öppen lista, ännu obesökta noder –Stängd lista, färdiga (besökta noder)
Algoritm, bakgrund forts –Algo är breadth first (testar alla i omgivningen), men istället för att blint testa alla, tar man dom med lägst F-poäng. –F = G + H. Värderar en nod. G – Avstånd (kostnad) från startnod. H – Avstånd (kostnad) till målnod. (Manhattan, fågelväg) –Algo väljer bäst först, sökning blir snabb. –När man nått målet följer man parentlista, från mål till start.
A* algoritm –1. Lägg till startnod i öppen lista –2. Upprepa A. Hitta nod med lägst F-poäng i öppna listan. Detta blir nuvarande nod. B. Lägg till den i stängda listan, ta bort från öppna. C. För varje grannod (8 st) –Om den är nonwalkable, eller i stängda listan, ignorera. –Om inte i stängd lista, lägg till den. Markera nuvarande nod som förälder och beräkna F = G + H. –Om den finns i öppen lista, kolla om kostnaden för denna väg är mindre än redan lagrade. Lägre G-poäng ger bättre väg. Om bättre, byt parent till nuvarande och beräkna om F. D. Stoppa när –Målnoden läggs till öppna listan, då är path funnen. –När öppen lista är tom, ingen path finns (island) –3. Spara path. Börja på målnod, gå genom parents till start.