Stuurgedrag is erop gericht om autonome personages op een realistische manier te laten bewegen, door eenvoudige krachten te gebruiken die worden gecombineerd om levensechte, improviserende navigatie rond de omgeving van de personages te produceren. In deze tutorial zal ik de basistheorie achter de zoeken stuurgedrag, evenals de uitvoering ervan.
De ideeën achter dit gedrag werden voorgesteld door Craig W. Reynolds; ze zijn niet gebaseerd op complexe strategieën met routeplanning of globale berekeningen, maar gebruiken in plaats daarvan lokale informatie, zoals de krachten van buren. Dit maakt ze eenvoudig te begrijpen en te implementeren, maar toch in staat om zeer complexe bewegingspatronen te produceren.
Notitie: Hoewel deze tutorial geschreven is met behulp van AS3 en Flash, zou je in bijna elke game-ontwikkelomgeving dezelfde technieken en concepten moeten kunnen gebruiken. Je moet een basiskennis hebben van wiskundige vectoren.
De implementatie van alle krachten die betrokken zijn bij stuurgedrag kan worden bereikt met wiskundige vectoren. Omdat deze krachten de snelheid en de positie van het personage zullen beïnvloeden, is het een goede benadering om vectoren te gebruiken om ze ook te vertegenwoordigen.
Ook al heeft een vector een richting, het zal worden genegeerd wanneer gerelateerd aan positie (laten we aannemen dat de positievector verwijst naar de huidige locatie van het personage).
De bovenstaande afbeelding vertegenwoordigt een personage dat is gepositioneerd op (x, y)
met een snelheid (a, b)
. De beweging wordt berekend met behulp van Euler-integratie:
positie = positie + snelheid
De richting van de snelheidsvector bepaalt waar het personage naartoe gaat, terwijl de lengte (of magnitude) bepaalt hoeveel elk frame wordt verplaatst. Hoe groter de lengte, hoe sneller het personage beweegt. De snelheidsvector kan worden afgekapt om te zorgen dat deze niet groter is dan een bepaalde waarde, meestal de maximale snelheid. Hieronder is een test die die benadering toont.
Het rode vierkant beweegt naar een doelwit (de muiscursor). Dit bewegingspatroon illustreert de zoeken gedrag zonder alle stuurkrachten die tot nu toe zijn toegepast. De groene lijn vertegenwoordigt de snelheidsvector, die als volgt wordt berekend:
snelheid = normaliseren (doel - positie) * max_velocity
Het is belangrijk om op te merken dat het personage zonder de stuurkracht rechte routes beschrijft en het direct van richting verandert wanneer het doel beweegt, waardoor er een abrupte overgang wordt gemaakt tussen de huidige route en de nieuwe route..
Als er alleen de snelheidskracht was, zou het personage een rechte lijn volgen die wordt bepaald door de richting van die vector. Een van de ideeën van stuurgedrag is om de beweging van het personage te beïnvloeden door krachten toe te voegen (genaamd stuurkrachten). Afhankelijk van die krachten, beweegt het personage in een of andere richting.
Voor het zoekgedrag zorgt de toevoeging van stuurkrachten aan het karakter voor elk frame ervoor dat het zijn snelheid soepel aanpast, waardoor plotselinge routewijzigingen worden vermeden. Als het doel beweegt, zal het karakter dat doen geleidelijk verander zijn snelheidsvector, proberend om het doel op zijn nieuwe locatie te bereiken.
Het zoekgedrag omvat twee krachten: gewenste snelheid en stuurinrichting:
De gewenste snelheid is een kracht die het personage naar het doelwit leidt met het kortst mogelijke pad (rechte lijn ertussen - voorheen was dit de enige kracht die op het personage inwerkt). De stuurinrichting kracht is het resultaat van de gewenste snelheid afgetrokken door de huidige snelheid en het duwt het personage ook naar het doel.
Die krachten worden als volgt berekend:
desired_velocity = normaliseren (doel - positie) * max_velocity steering = desired_velocity - velocity
Nadat de stuurkracht is berekend, moet deze worden toegevoegd aan het karakter (deze wordt toegevoegd aan de snelheidskracht). De toevoeging van de stuurkracht aan de snelheid van elk frame zorgt ervoor dat het personage soepel zijn oude rechte weg verlaat en richting het doelwit gaat, een beschrijving van een zoek pad (oranje curve in de onderstaande afbeelding):
De toevoeging van die krachten en de uiteindelijke snelheids- / positieberekening zijn:
sturen = afbreken (sturen, max_kracht) sturen = sturen / massasnelheid = afbreken (snelheid + sturen, max_snelheid) positie = positie + snelheid
De stuurkracht wordt afgekapt om ervoor te zorgen dat deze de hoeveelheid toegestane krachten die het personage aankan niet zal overschrijden. Ook wordt de stuurkracht gedeeld door de karaktermassa, die verschillende bewegingssnelheden produceert voor verschillende gewogen karakters. Hieronder staat een test die het zoekgedrag toont met alle toegepaste krachten:
Elke keer dat het doel beweegt, is elk personage gewenste snelheid vector verandert dienovereenkomstig. De snelheid vector heeft echter enige tijd nodig om te veranderen en opnieuw op het doelwit te richten. Het resultaat is een soepele overgang van de beweging.
Stuurgedrag is geweldig voor het creëren van realistische bewegingspatronen. Het belangrijkste idee is om lokale informatie te gebruiken om krachten te berekenen en toe te passen om het gedrag te creëren. Hoewel de berekening eenvoudig te implementeren is, kan deze nog steeds zeer complexe resultaten produceren.
Deze tutorial beschreef de basisprincipes van stuurgedrag en verklaarde het zoekgedrag. In de volgende paar berichten zullen we meer leren over meer gedrag. Bekijk de volgende post: Vlucht en aankomst.