Stuurgedrag is erop gericht om autonome personages op een realistische manier te laten bewegen, door eenvoudige krachten te gebruiken die leiden tot een levensechte, improviserende navigatie. In deze tutorial behandel ik de vluchten gedrag, waardoor het personage zich verwijdert van een achtervolger, en de aankomst gedrag, waardoor het personage langzamer wordt en stopt als het een doel nadert.
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.
Het eerder beschreven zoekgedrag is gebaseerd op twee krachten die het personage naar het doelwit duwen: de gewenste snelheid en de besturing.
desired_velocity = normaliseren (doel - positie) * max_velocity steering = desired_velocity - velocity
De desired_velocity
, in dit geval is dit het kortste pad tussen het personage en het doelwit. Het wordt berekend door de positie van het doel af te trekken van de positie van het personage. Het resultaat is een krachtvector die van de karakter richting de doelwit.
Het vluchtgedrag gebruikt dezelfde twee krachten, maar ze worden aangepast om het personage te laten rennen weg van het doelwit:
Dat nieuw desired_velocity
vector wordt berekend door de personage positie van de doelwit positie, die een vector produceert die van de doelwit richting de karakter.
De resulterende krachten worden bijna op dezelfde manier berekend als in het zoekgedrag:
desired_velocity = normaliseren (positie - doel) * max_velocity steering = desired_velocity - velocity
De desired_velocity
is in dat geval de gemakkelijkste ontsnappingsroute die het personage kan gebruiken om weg te rennen van het doelwit. Door de stuurkracht verlaat het personage de huidige route en duwt het in de richting van de gewenste snelheidsvector.
Door de gewenste snelheidsvector van het vluchtgedrag te vergelijken met de gewenste snelheidsvector van het zoekgedrag, kan de volgende relatie worden vastgesteld:
flee_desired_velocity = -seek_desired_velocity
Met andere woorden, de ene vector is het negatief van de andere.
Nadat de stuurkracht is berekend, moet deze worden toegevoegd aan de snelheidsvector van het personage. Omdat die kracht het personage weg duwt van het doelwit, stopt elk personage met het bewegen naar het doelwit en begint het weg te bewegen, waardoor een vlucht pad (de oranje curve in de onderstaande afbeelding):
De toevoeging van die krachten en de uiteindelijke snelheid / positieberekening worden op dezelfde manier behandeld als voorheen. Hieronder is een demo met verschillende personages die het vlieggedrag uitvoeren:
Elk personage wordt met een willekeurige snelheid in het midden van het bewegende gebied geplaatst. Ze zullen proberen het doelwit (de muiscursor) te ontvluchten. De toevoeging van alle krachten zorgt ervoor dat elk personage zijn huidige route soepel verlaat en het doelwit ontvlucht.
Op dit moment beïnvloedt het doelwit elk karakter, negeert de afstand ervan; het zou kunnen zijn beperkt tot een "effectgebied", waar het personage alleen zou vluchten als het dichtbij genoeg is om het doelwit te bereiken.
Het zoekgedrag, zoals we hebben gezien, zorgt ervoor dat een personage naar een doelwit beweegt. Wanneer het de bestemming bereikt, blijft de stuurkracht daarop handelen op basis van dezelfde regels, waardoor het karakter heen en weer rond het doelwit "kaatst".
De aankomst gedrag voorkomt dat het personage door het doel beweegt. Het maakt het personage langzamer naarmate het de bestemming nadert en uiteindelijk stopt bij het doelwit.
Het gedrag bestaat uit twee fasen. De eerste fase is wanneer het personage ver van het doelwit verwijderd is en het precies hetzelfde werkt als het zoekgedrag (op volle snelheid naar het doelwit bewegen).
De tweede fase is wanneer het personage zich dicht bij het doelwit bevindt, binnen het "vertragingsgebied" (een cirkel gecentreerd rond de positie van het doelwit):
Wanneer het personage de cirkel binnengaat, vertraagt het totdat het stopt bij het doel.
Wanneer het personage het vertragingsgebied binnengaat, wordt zijn snelheid lineair verlaagd naar nul. Dit wordt bereikt door een nieuwe stuurkracht toe te voegen (de aankomstkracht) naar de snelheidsvector van het personage. Het resultaat van deze toevoeging zal uiteindelijk nul worden, wat betekent dat niets aan de positie van elk personage wordt toegevoegd (er zal dus geen beweging zijn):
// Als (snelheid + besturing) gelijk is aan nul, dan is er geen bewegingssnelheid = afkappen (snelheid + sturen, max_snelheid) positie = positie + snelheidsfunctie afkappen (vector: Vector3D, max: getal): void var i: Number; i = max / vector.length; i = i < 1.0 ? i : 1.0; vector.scaleBy(i);
Om ervoor te zorgen dat het personage geleidelijk langzamer gaat draaien voordat het stopt, mag de snelheid niet onmiddellijk nul worden. Het geleidelijke vertragingsproces wordt berekend op basis van de straal van het vertragingsgebied en de afstand tussen het personage en het doel:
// Bereken de gewenste snelheid desired_velocity = target - position distance = length (desired_velocity) // Controleer de afstand om te detecteren of het karakter // binnen het vertragingsgebied valt als (afstand < slowingRadius) // Inside the slowing area desired_velocity = normalize(desired_velocity) * max_velocity * (distance / slowingRadius) else // Outside the slowing area. desired_velocity = normalize(desired_velocity) * max_velocity // Set the steering based on this steering = desired_velocity - velocity
Als de afstand groter is dan slowingRadius
, het betekent dat het personage ver van het doelwit verwijderd is en dat de snelheid ervan moet blijven max_velocity
.
Als de afstand minder is dan slowingRadius
, het betekent dat het personage het vertragingsgebied is binnengegaan en dat de snelheid ervan moet worden verlaagd.
De voorwaarde afstand / vertragenRadius
zal variëren van 1
(wanneer afstand
is gelijk aan slowingRadius
) naar 0
(wanneer afstand
is bijna nul). Deze lineaire variatie zal de snelheid soepel laten vertragen:
Zoals eerder beschreven, wordt de karakterbeweging als volgt uitgevoerd:
besturing = gewenste snelheid - snelheid snelheid = afbreken (snelheid + besturing, max_snelheid) positie = positie + snelheid
Als de gewenste snelheid op nul wordt gesteld, wordt de stuurkracht -snelheid
. Als gevolg hiervan, wanneer die stuurkracht wordt toegevoegd aan de snelheid, zal deze resulteren in nul, waardoor het personage stopt met bewegen.
Hieronder is een demo met het aankomstgedrag:
Wat het aankomstgedrag eigenlijk doet, is een kracht berekenen die gelijk zal zijn aan -snelheid
, voorkomen dat het personage beweegt, zolang die kracht op zijn plaats is. De oorspronkelijke snelheidsvector van het personage verandert niet en blijft werken, maar wordt tenietgedaan door de stuuroptie.
Als de aankomende stuurkracht wordt opgeheven, begint het personage opnieuw te bewegen, gebruikmakend van de oorspronkelijke snelheidsvector.
Het vlieggedrag zorgt ervoor dat het personage zich van het gewenste doelwit verwijdert, terwijl het aankomstgedrag het vertraagt en stopt bij de positie van het doelwit. Beide kunnen worden gebruikt om bijvoorbeeld een soepele ontsnapping te creëren of bewegingspatronen te volgen. Ze kunnen ook worden gecombineerd om nog complexere bewegingen te maken.
Deze tutorial beschreef meer over stuurgedrag, uitleg over het vlucht- en het aankomstgedrag. In de volgende paar berichten zullen we meer leren over meer gedrag. Blijf op de hoogte door ons te volgen op Twitter, Facebook of Google+.