Înțelegerea comportamentelor de direcție Flee și Sosire

Metodele de conducere urmăresc să ajute personajele autonome să se miște într-o manieră realistă, folosind forțe simple care se combină pentru a produce navigație improvizată similară vieții. În acest tutorial, voi acoperi fugă comportament, care face caracterul se îndepărtează de un urmăritor, și sosire comportament, ceea ce face ca caracterul să încetinească și să se oprească pe măsură ce se apropie de țintă.

Notă: Deși acest tutorial este scris folosind AS3 și Flash, ar trebui să puteți utiliza aceleași tehnici și concepte în aproape orice mediu de dezvoltare a jocului. Trebuie să aveți o înțelegere de bază a vectorilor de matematică.


Rularea

Comportamentul căutării descris anterior se bazează pe două forțe care împing caracterul către ținta: viteza dorită și direcția.

desired_velocity = normaliza (ținta - poziția) * direcția max_velocity = dorită_velocitate - viteza

desired_velocity, în acest caz, este cea mai scurtă cale între caracter și țintă. Se calculează prin scăderea poziției țintă de la poziția caracterului. Rezultatul este un vector de forță care merge de la caracter catre ţintă.


Căutați comportamentul

Comportamentul la fugă folosește aceleași două forțe, dar acestea sunt ajustate pentru a face ca personajul să se desfășoare departe din țintă:


Fugiți

Acest nou desired_velocity vectorul este calculat prin scăderea caracterul lui poziție de la Țintele poziție, care produce un vector care merge de la ţintă catre caracter

Forțele rezultate sunt calculate aproape în același mod ca în comportamentul căutării:

desired_velocity = normaliza (poziția - țintă) * direcția max_velocity = viteza dorită - viteza

desired_velocity în acest caz reprezintă cea mai ușoară rută de evadare pe care personajul o poate folosi pentru a fugi de țintă. Forța de direcție face ca personajul să abandoneze traseul curent, împingându-l spre direcția vectorului de viteză dorit.

Comparând vectorul de viteză dorit al comportamentului de fugă cu vectorul de viteză dorit al comportamentului căutării, se poate stabili următoarea relație:

flee_desired_velocity = -seek_desired_velocity

Cu alte cuvinte, un vector este cel negativ al celuilalt.


Adăugarea forțelor de evacuare

După ce forța de direcție este calculată, trebuie adăugată la vectorul vitezei caracterului. Deoarece această forță împinge caracterul departe de țintă, fiecare cadru caracterul va înceta să se deplaseze spre ținta și începe să se îndepărteze de ea, producând fugi calea (curba portocalie din figura de mai jos):

Adăugarea acestor forțe și calculul vitezei / poziției finale sunt tratate în același mod ca înainte. Mai jos este o demonstrație care prezintă mai multe personaje care comportă comportamentul de fugă:


Deplasați mouse-ul pentru a muta ținta.

Fiecare personaj este plasat în centrul zonei în mișcare cu o viteză aleatorie. Ei vor încerca să fugă de țintă (cursorul mouse-ului). Adunarea tuturor forțelor face ca fiecare personaj să abandoneze linia curentă și să fugă de țintă.

În prezent, țintă afectează fiecare personaj, ignorând distanța de la el; ar fi putut fi limitat la o "zonă de efect", în care caracterul ar fugi doar dacă este suficient de apropiat de obiectiv.


Sosire

Căutarea comportamentului, după cum am văzut, face ca un personaj să se îndrepte spre o țintă. Când ajunge la destinație, forța de direcție continuă să acționeze asupra acesteia pe baza acelorași reguli, făcând caracterul "sări" înainte și înapoi în jurul țintei.


Căutați comportamentul. Deplasați mouse-ul pentru a muta ținta.

sosire comportament împiedică caracterul să se deplaseze prin țintă. Aceasta face ca personajul să încetinească în timp ce se apropie de destinație, oprindu-se în cele din urmă la țintă.

Comportamentul este compus din două faze. Prima fază este atunci când personajul este departe de țintă și funcționează exact în același mod ca și comportamentul căutării (se deplasează la viteza maximă spre țintă).

A doua fază este atunci când caracterul este aproape de țintă, în interiorul "zonei de încetinire" (un cerc centrat la poziția țintă):

Când caracterul intră în cerc, acesta încetinește până când se oprește la țintă.


Încetinirea

Când caracterul intră în zona de încetinire, viteza sa este înclinată liniar la zero. Aceasta se obține prin adăugarea unei noi forțe de direcție ( forța de sosire) la vectorul vitezei caracterului. Rezultatul acestei adăugiri va deveni în cele din urmă zero, ceea ce înseamnă că nimic nu va fi adăugat la poziția personajului în fiecare cadru (deci nu va exista mișcare):

Dacă viteza + direcția este egală cu zero, atunci nu există viteză de mișcare = trunchiat (viteză + direcție, max_speed) poziție = poziție + trăsătură funcție de viteză (vector: Vector3D, max: număr): void var i: Number; i = max / vector.length; i = i < 1.0 ? i : 1.0; vector.scaleBy(i); 

Pentru a vă asigura că caracterul va încetini treptat înainte de a se opri, viteza nu ar trebui să devină zero imediat. Procesul de încetinire progresivă se calculează pe baza razei zonei de încetinire și a distanței dintre caracter și țintă:

// Calculați viteza dorită dorită_velocitate = ținta - distanța de poziție = lungimea (dorită_velocitate) // Verificați distanța pentru a detecta dacă caracterul // se află în interiorul zonei de încetinire dacă (distanța < 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

Dacă distanța este mai mare decât slowingRadius, inseamna ca personajul este departe de tinta si viteza lui ar trebui sa ramana max_velocity.

Dacă distanța este mai mică de slowingRadius, înseamnă că personajul a intrat în zona de încetinire, iar viteza sa ar trebui să fie înrăutățită.

Termenul distanța / încetinireaRadius va varia de la 1 (cand distanţă este egală slowingRadius) la 0 (cand distanţă este aproape zero). Această variație liniară va face ca viteza să încetinească ușor:

După cum sa descris mai înainte, mișcarea de caractere se realizează după cum urmează:

direcție = viteza dorită - viteza vitezei = trunchiul (viteza + direcția, max_speed) poziția = poziția + viteza

Dacă viteza dorită este ridicată la zero, atunci forța de direcție devine -viteză. În consecință, atunci când această forță de direcție este adăugată vitezei, aceasta va avea ca rezultat zero, făcând ca personajul să se oprească.

Mai jos este o demonstrație care arată comportamentul de sosire:


Deplasați mouse-ul pentru a muta ținta.

Ceea ce comportamentul sosirii are, într-adevăr, se calculează o forță care va fi egală cu -viteză, împiedicând personajul să se deplaseze atât timp cât forța este în vigoare. Vectorul vitezei originale a personajului nu se schimbă și continuă să funcționeze, dar este anulat de adăugarea direcției.

Dacă forța de direcție a sosirii este ridicată, caracterul va începe din nou să se miște, utilizând vectorul său original de viteză.


Concluzie

Comportamentul de fugă face ca personajul să se îndepărteze de ținta dorită, în timp ce comportamentul de sosire îl încetinește și se oprește la poziția țintă. Ambele pot fi folosite pentru a crea o evadare buna sau pentru a urmari modelele de miscare, de exemplu. Ele pot fi, de asemenea, combinate pentru a crea mișcări și mai complexe.

Acest tutorial a descris mai multe despre comportamentele de direcție, explicând comportamentul de fugă și de sosire. În următoarele câteva postări, vom afla despre mai multe comportamente. Fiți la curent cu noi pe Twitter, Facebook sau Google+.