2. Over..
• Introductie waypoints en navigation meshes
• Waypoints vs. Navigation meshes
• De constructie van een navigation mesh
• Werking van een navigation mesh
• In de praktijk
AI in MMO’s, specifiek in World of Warcraft. Dit is nog niet de uiteindelijke versie, ik ben van plan om hier en daar nog wat tekst/dia’s toe te voegen.Ook zal ik meer code toelichten in de aangegeven link. Daarna zal ik in WoW laten zien hoe de eerder besproken theorie in de praktijk uitpakt.Bronnen:http://www.ai-blog.net/archives/000152.html - Artikel over unit pathfinding.http://udn.epicgames.com/Three/NavigationMeshReference.html - Constructie van navigationmeshes uitgelegd door Epic Games (Unreal Engine).http://www.navpower.com/gdc2006_miles_david_pathplanning.ppt - Een presentatie van David Miled op GDC 2006http://www.lsi.upc.edu/~npelechano/Oliva_MIG2011.pdfhttp://arcemu.org – De gebruikte WoW emulator omnavigationmesh in de praktijk te laten zien. World of Warcraft – Game wordt gebruikt als voorbeeld.
http://vidyalife.blogspot.nl/2012/01/nostalgia-sunday-rollercoaster-tycoon.html - BewerktRoller Coaster Tycoon is een perfect voorbeeld van een waypoints systeem. Ook al is er een groot plein zullen de bezoekers alsnog in dezelfde paden lopen, van tile tot tile.
Hier wordt een waypoint structuur aangegeven, zoals te zien zijn er veel nodes die kris-kras over de wereld lopen. Mogelijkheid: smoothing, maar brengt extra problemen.
Hier is een navigationmesh te zien bestaande uit meerdere verbonden nodes.
Een voorbeeld van een navigation map in de stad “Dalaran” in WoW.
Waypoints zijn statischer, een navigationmesh kan smoothen zonder risico’s. Dit gebeurt door simpelweg de nodes te bekijken en daartussen het optimale (en realitische) bepalen.
Waypoints zijn kris-kras, met een navigationmesh is er praktisch altijd de snelste route. Dit introduceert problemen, aangegeven in de volgende dia.
http://en.wikipedia.org/wiki/Cubic_Hermite_spline#Catmull.E2.80.93Rom_spline – Uitleg Catmull-RomsplineEen mogelijk oplossing tot het zigzaggen is door de paden te smoothen. D.m.v. bijv. een Catmull-Romspline kan er worden gesmooth tussen de waypoints, dit introduceert problemen als bijv. de mogelijkheid tot het vallen in een rivier.
Een navigationmesh kan m.b.v.raycasting in de LoS obstakels aan zien komen en daarop het path aanpassen.
Bij verschillende groottes van units kan de radius van de unit als afstand tussen de mesh node en unit worden aangehouden. In het geval vanwaypoints zou er voor elk type unit een verschillend waypoint-netwerk gemaakt moeten worden.
De eerste mesh wordt gemaakt m.b.v. het ophalen van vlakken m.b.v. raycasts. Hierdoor ontstaat een groot (nog niet geoptimaliseerd) grid.
Door een vooraf ingestelde stap-afstand kan het zijn dat er mogelijk en grote afstand ontstaat tussen zijvlakken en bijvoorbeeld muren. Door een steeds kleinere stap-afstand te gebruiken kan er alsnog een nauwkeurige mesh ontstaan.
Alle vierkanten worden dan zoveel mogelijk gemerged, als doel zo groot mogelijke vlakkken te genereren. Vooral bij grote open gebieden scheelt dit enorm.
De tweede simplificatie stap is het mergen van polypunten die vlak bij elkaar liggen, herhalende structuren zoals trappen zijn dan nog niet “versimpeld”.
Hier is te zien hoe trappen zijngesmooth, dit maakt voor de pathfinding uiteindelijk niet uit.
Uiteindelijk worden van alle vierkanten polygons gemaakt om het aantal nodes te verminderen. Het is nu goed te zien dat nodes eigenlijk alleen onstaan bij hoeken van objecten/muren.
In veel games zijn waypoints nog steeds nodig (bij bijv. patrols), dit is nog steeds mogelijk door punten globaler aan te geven waarin de unit dan zelf een pad vind. Ook andere AI events kunnen worden geplaatst binnen de navigationmesh, de unit kan hierin dan zijn eigen pad aanmaken.
Er is eerder een oplossing opgenoemd voor dynamische obstakels, namelijk het gebruik van raycasts. Dit kan echter inefficiënt worden, vooral bij meerdere units.Een mogelijk betere oplossing is het splitten van de meshes om het obstacle heen, deze worden dan vermeervoudigd. Daarna kan in het bestaande systeem alsnog het pad worden berekend.
Units gebruiken de navigationmesh via de “next corner” methodiek. Er wordt gekeken naar de eerstvolgende collision met een hoek, waar hij dan heen stuurt.
Hierbij een realistisch voorbeeld van een eerste hoek, in de volgende dia’s wordt uitgelegd hoe er aan deze hoek wordt gekomen.
Er zijn een soort van portals tussen de gebieden, deze worden o.a. gebruikt om de eerstvolgende hoek te ontdekken.
Iteratie 1: Links
Iteratie 1: Rechts
Iteratie 1: Finished
Iteratie 2: Links
Iteratie 2: Rechts
Iteratie 2: Finished
Iteratie drie: Links
De iteratie is afgelopen, de eerstvolgende hoek is ontdekt.
Hier start ik twee keer een WoW emulator waar ik op beide één keer inlog, eentje met navigationmeshesenabled, de ander disabled. Hierbij laat ik ook de performance en het geheugen zien, en hoe enemies in beide emulaties reageren op de gespeelde character.