Förstå styrningsbeteenden fly och ankomst

Styrbeteenden syftar till att hjälpa autonoma karaktärer att flytta på ett realistiskt sätt, med hjälp av enkla krafter som kombinerar för att producera livsliknande, improvisationsnavigering. I denna handledning täcker jag fly beteende, vilket gör karaktären flytta från en förföljare och ankomst beteende, vilket gör karaktären långsam och stoppa när den närmar sig ett mål.

Notera: Även om denna handledning skrivs med AS3 och Flash, borde du kunna använda samma tekniker och begrepp i nästan vilken spelutvecklingsmiljö som helst. Du måste ha en grundläggande förståelse för matematiska vektorer.


Springer iväg

Det tidigare beskrivna sökbeteendet är baserat på två krafter som driver karaktären mot målet: önskad hastighet och styrningen.

desired_velocity = normalisera (målposition) * max_velocity styrning = önskad hastighet - hastighet

De desired_velocity, i det här fallet är den kortaste vägen mellan karaktären och målet. Det beräknas genom att subtrahera målets position från teckenets position. Resultatet är en kraftvektor som går från karaktär mot mål.


Sök beteende

Flödesbeteendet använder samma två krafter, men de anpassas för att få karaktären att köras bort från målet:


Flee behavior

Det nya desired_velocity vektorn beräknas genom att subtrahera tecken position från målets position, som producerar en vektor som går från mål mot karaktär

De resulterande krafterna beräknas nästan på samma sätt som i sökbeteendet:

desired_velocity = normalisera (position - mål) * max_velocity styrning = önskad hastighet - hastighet

De desired_velocity i så fall representerar den enklaste flyktningsvägen som tecknet kan använda för att springa bort från målet. Styrkraften gör att karaktären överger sin nuvarande väg och trycker den mot riktningen för den önskade hastighetsvektorn.

Genom att jämföra den önskade hastighetsvektorn hos flygningsbeteendet med den önskade hastighetsvektorn i sökbeteendet kan följande relation etableras:

flee_desired_velocity = -seek_desired_velocity

Med andra ord är en vektor den negativa av den andra.


Lägger till flygstyrkor

När styrkraften är beräknad måste den läggas till karaktärens hastighetsvektor. Eftersom denna kraft skjuter karaktären bort från målet, kommer varje ram karaktären att sluta röra sig mot målet och börja flytta bort från det, vilket ger en flygväg (apelsinskurvan i figuren nedan):

Tillsatsen av dessa krafter och sluthastigheten / positionberäkningen hanteras på samma sätt som tidigare. Nedan visas en demo som visar flera tecken som utför flygningsbeteendet:


Flytta musen för att flytta målet.

Varje karaktär placeras i mitten av det rörliga området med en slumpmässig hastighet. De kommer att försöka fly från målet (muspekaren). Tillägget av alla krafter gör att varje karaktär smidigt överger sin nuvarande väg och flyger målet.

För närvarande påverkar målet varje karaktär och ignorerar avståndet från dem. det kunde ha varit begränsat till ett "effektområde", där karaktären skulle fly bara om den är tillräckligt nära målet.


Ankomst

Sökbeteendet, som vi har sett, gör en karaktärsrörelse mot ett mål. När den når destinationen fortsätter styrkraften att fungera på grund av samma regler, vilket gör tecknet "studsa" fram och tillbaka runt målet.


Sökbeteendet. Flytta musen för att flytta målet.

De ankomst beteende förhindrar karaktären att röra sig genom målet. Det gör karaktären långsam när den närmar sig destinationen, slutligen slutar vid målet.

Beteendet består av två faser. Den första fasen är när tecknet ligger långt ifrån målet och det fungerar exakt på samma sätt som sökbeteendet gör (rör sig i full fart mot målet).

Den andra fasen är när tecknet ligger nära målet, inuti "slowing-området" (en cirkel centrerad vid målets position):

När tecknet går in i cirkeln saktar det ner tills det stannar vid målet.


Saktar ner

När tecknet går in i slowing-området sänks hastigheten linjärt till noll. Detta uppnås genom att man lägger till en ny styrkraft ( ankomststyrka) till karaktärens hastighetsvektor. Resultatet av denna tillägg blir så småningom noll, vilket betyder att ingenting kommer att läggas till karaktärens position varje ram (så det blir ingen rörelse):

// Om (hastighet + styrning) är lika med noll, är det ingen rörelseshastighet = trunkera (hastighet + styrning, max_speed) position = position + hastighetsfunktion truncate (vektor: Vector3D, max: Nummer): void var i: Number; i = max / vector.length; i = i < 1.0 ? i : 1.0; vector.scaleBy(i); 

För att säkerställa att karaktären gradvis sakta ner innan den stannar, bör hastigheten inte bli noll omedelbart. Den gradvisa nedbromsprocessen beräknas utifrån radie av saktningsområdet och avståndet mellan karaktären och målet:

// Beräkna önskad hastighet desired_velocity = mål - positionsavstånd = längd (önskad hastighet) // Kontrollera avståndet för att upptäcka om tecknet // är inuti avbakningsområdet om (avstånd < 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

Om avståndet är större än slowingRadius, det betyder att karaktären är långt ifrån målet och dess hastighet bör förbli max_velocity.

Om avståndet är mindre än slowingRadius, det betyder att karaktären har gått in i slowingområdet och hastigheten bör rampas ner.

Termen avstånd / slowingRadius kommer att variera från 1 (när distans är lika med slowingRadius) till 0 (när distans är nästan noll). Denna linjära variation gör att hastigheten släcks jämnt:

Som tidigare beskrivits utförs karaktärsrörelsen enligt följande:

styrning = önskad_hastighet - hastighetshastighet = trunkera (hastighet + styrning, max_hastighet) position = läge + hastighet

Om den önskade hastigheten rampas ner till noll, blir styrkraften -hastighet. Som en följd av detta, när den här styrkraften läggs till hastigheten kommer den att resultera i noll, vilket gör att teckenstoppet rör sig.

Nedan följer en demonstration som visar ankomstbeteendet:


Flytta musen för att flytta målet.

Vad ankomstbeteendet verkligen gör är att beräkna en kraft som kommer att vara lika med -hastighet, förhindra karaktären att röra sig så länge den kraften är på plats. Karaktärens ursprungliga hastighetsvektor ändras inte och den fortsätter att fungera, men den är nollställd av styrtillägget.

Om ankomststyrningskraften lyftas, börjar tecknet igen med sin ursprungliga hastighetsvektor.


Slutsats

Flytbeteendet gör att teckenet flyttar sig bort från det önskade målet medan ankomstbeteendet gör det långsamt och stannar vid målets position. Båda kan användas för att skapa jämn flykt eller till exempel följa rörelsemönster. De kan också kombineras för att skapa ännu mer komplexa rörelser.

Denna handledning beskriver mer om styrningsbeteenden, förklarar flykten och ankomstbeteenden. Under de kommande inläggen lär vi oss mer om beteende. Håll dig uppdaterad genom att följa oss på Twitter, Facebook eller Google+.