Forstå styringsadferd Flee and Arrival

Styringsadferdene tar sikte på å hjelpe autonome tegn å bevege seg på en realistisk måte, ved å bruke enkle krefter som kombinerer å produsere livslignende improvisasjonsnavigering. I denne opplæringen vil jeg dekke flykte atferd, som gjør tegnet bevege seg bort fra en etterfølger, og ankomst oppførsel, som gjør at tegnet går sakte og stopper når det nærmer seg et mål.

Merk: Selv om denne opplæringen er skrevet med AS3 og Flash, bør du kunne bruke de samme teknikkene og konseptene i nesten hvilket som helst spillutviklingsmiljø. Du må ha en grunnleggende forståelse av matematiske vektorer.


Kjører bort

Søkeoppførelsen beskrevet tidligere er basert på to krefter som skyver karakteren mot målet: ønsket hastighet og styringen.

desired_velocity = normaliser (målposisjon) * max_velocity styring = ønsket_velocity - hastighet

De desired_velocity, i dette tilfellet er den korteste banen mellom tegnet og målet. Det beregnes ved å trekke målets posisjon fra tegnets posisjon. Resultatet er en kraftvektor som går fra karakter mot mål.


Søke oppførsel

Flyteadferdigheten bruker de samme to kreftene, men de er justert for å få karakteren til å løpe borte fra målet:


Flee behavior

Det nye desired_velocity vektoren beregnes ved å subtrahere tegn posisjon fra målets posisjon, som produserer en vektor som går fra mål mot karakter

De resulterende kreftene beregnes nesten på samme måte som i søkeadferansen:

desired_velocity = normalisere (posisjon - mål) * max_velocity styring = ønsket_velocity - hastighet

De desired_velocity I så fall representerer den enkleste rømningsruten karakteren kan bruke til å løpe bort fra målet. Styrkraften gjør karakteren forlate sin nåværende rute, og skyver den mot retningen av ønsket hastighetsvektor.

Sammenligning av den ønskede hastighetsvektoren av flyteadferdigheten med den ønskede hastighetsvektoren for søksadferd, kan følgende forhold etableres:

flee_desired_velocity = -seek_desired_velocity

Med andre ord er en vektor den negative av den andre.


Legge til flyktingstyrker

Etter at styrkraften er beregnet, må det legges til tegnets hastighetsvektor. Siden denne kraften skyver tegnet bort fra målet, vil hver ramme karakteren slutte å bevege seg mot målet og begynne å bevege seg bort fra det, produsere en flykte sti (den oransje kurven i figuren under):

Tilsetningen av disse kreftene og den endelige hastighets- / stillingsberegningen håndteres på samme måte som før. Nedenfor er en demonstrasjon som viser flere tegn som utfører flykteferden:


Flytt musen for å flytte målet.

Hver karakter er plassert i midten av det bevegelige området med en tilfeldig hastighet. De vil forsøke å flykte fra målet (musemarkøren). Tillegget av alle styrker gjør at hver figur gir jevnt forlat sin nåværende rute og flyr målet.

For øyeblikket påvirker målet hvert tegn, ignorerer avstanden fra dem; det kunne ha vært begrenset til et "effektområde", hvor tegnet ville flykte bare hvis det er nært nok til målet.


Ankomst

Søkeoppførelsen, som vi har sett, gjør et tegn til et mål. Når den når destinasjonen, fortsetter styrestyrken å handle på den basert på de samme reglene, slik at tegnet "hopper" frem og tilbake rundt målet.


Søkeoppførelsen. Flytt musen for å flytte målet.

De ankomst oppførsel forhindrer tegnet i å bevege seg gjennom målet. Det gjør tegnet sakte når det nærmer seg målet, til slutt stopper mot målet.

Oppførselen består av to faser. Den første fasen er når tegnet er langt borte fra målet, og det fungerer nøyaktig på samme måte som søksadferd gjør (flytte i full fart mot målet).

Den andre fasen er når tegnet ligger nær målet, inne i "bremseområdet" (en sirkel som er sentrert på målets posisjon):

Når tegnet går inn i sirkelen, senkes det til det stopper ved målet.


Sakker farten

Når karakteren går inn i sakteområdet, blir hastigheten rammet lineært til null. Dette oppnås ved å legge til en ny styringskraft ( ankomststyrke) til tegnets hastighetsvektor. Resultatet av dette tillegget vil til slutt bli null, noe som betyr at ingenting vil bli lagt til tegnetes posisjon hver ramme (så det blir ingen bevegelse):

// Hvis (hastighet + styring) er lik null, så er det ingen bevegelseshastighet = trunkate (hastighet + styring, maks_speed) posisjon = posisjon + hastighetsfunksjon avkorte (vektor: Vector3D, maks: Nummer): tomrom var i: tall; i = max / vector.length; jeg = jeg < 1.0 ? i : 1.0; vector.scaleBy(i); 

For å sikre at karakteren gradvis reduseres før den stopper, bør hastigheten ikke bli null umiddelbart. Den gradvise sakte prosessen beregnes ut fra radius av sakteområdet og avstanden mellom tegnet og målet:

// Beregn ønsket hastighet ønsket_velocity = mål - posisjon avstand = lengde (ønsket_velocity) // Sjekk avstanden for å oppdage om tegnet // er inne i bremseområdet hvis (avstand < 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

Hvis avstanden er større enn slowingRadius, det betyr at tegnet er langt borte fra målet og dets hastighet bør forbli max_velocity.

Hvis avstanden er mindre enn slowingRadius, det betyr at tegnet har gått inn i bremseområdet, og hastigheten skal rampes ned.

Begrepet avstand / slowingRadius vil variere fra 1 (når avstand er lik slowingRadius) til 0 (når avstand er nesten null). Denne lineære variasjonen vil gjøre hastigheten jevnt sakte:

Som tidligere beskrevet, utføres tegningsbevegelsen som følger:

styring = ønsket_hastighet - hastighetshastighet = avkorting (hastighet + styring, maks_speed) posisjon = posisjon + hastighet

Hvis den ønskede hastigheten rammes ned til null, blir styrestyrken -hastighet. Som følge av dette, når den styrestyrken legges til hastigheten, vil den resultere i null, slik at tegnet slutter å bevege seg.

Nedenfor er en demonstrasjon som viser ankomstadferansen:


Flytt musen for å flytte målet.

Hva ankomstadferd virkelig gjør, er å beregne en kraft som vil være lik -hastighet, forhindrer tegnet i å bevege seg så lenge den styrken er på plass. Tegns originale hastighetsvektor endres ikke, og den fortsetter å fungere, men den blir nullstillet av styretilsatsen.

Hvis ankomststyrkekraften løftes, begynner tegnet igjen med sin originale hastighetsvektor.


Konklusjon

Flyteadferdigheten gjør at tegnet beveger seg bort fra ønsket mål, mens ankomstadferd gjør det sakte og stopper ved målets posisjon. Begge kan brukes til å skape jevn rømning eller følge bevegelsesmønstre, for eksempel. De kan også kombineres for å skape enda mer komplekse bevegelser.

Denne opplæringen beskrev mer om styringsadferd, forklarer flykten og ankomstadferdene. I løpet av de neste innleggene lærer vi om mer oppførsel. Hold deg oppdatert ved å følge oss på Twitter, Facebook eller Google+.