Înțelegerea comportamentelor de direcție exercitarea și evitarea

Până acum ne-am uitat la căutarea, fuga, sosirea și rătăcirea comportamentelor de direcție. În acest tutorial, voi acoperi urmărire si se sustrage comportamente, care fac personajele dvs. să urmeze sau să evite ținta.

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ă.


Ce este o urmărire?

Urmărirea este procesul de urmărire a unei ținte care vizează prinde-l. Este important să rețineți că cuvântul "captură" face diferența aici. Dacă ceva urmează doar o țintă, tot ce trebuie să faceți este să repetați mișcările țintă și, ca o consecință, va fi pe drumul său.

Atunci când urmărește ceva, urmăritorul trebuie să-și urmeze ținta, dar trebuie să anticipeze și unde va fi ținta în viitorul apropiat. Dacă puteți anticipa (sau estima) unde obiectivul va fi în următoarele câteva secunde, este posibil să ajustați traiectoria curentă pentru a evita rutele inutile:


Prezicerea viitorului

După cum este descris în primele tutoriale, mișcarea este calculată utilizând integrarea Euler:

poziția = poziția + viteza

Ca o consecință directă, dacă poziția și viteza personajului actual sunt cunoscute, este posibil să se prevadă unde va fi în următorul T actualizări de jocuri. Presupunând că personajul se mișcă într-o linie dreaptă și că poziția pe care vrem să o previzionăm este trei actualizări înainte (T = 3), pozitia viitorului personajului va fi:

poziția = poziția + viteza * T

Cheia pentru o bună predicție este valoarea potrivită pentru T. Dacă valoarea este prea mare, înseamnă că urmăritorul va ajunge la urmărirea unei fantome. Dacă T este prea aproape de zero, înseamnă că urmăritorul nu urmărește de fapt ținta, ci doar urmărește-o (nici o prezicere).

Dacă predicția este calculată pentru fiecare cadru de joc, acesta funcționează chiar dacă țintă își schimbă constant direcția. Fiecare actualizare a unei noi "poziții viitoare" este generată pe baza vectorului de viteză curent al personajului (care ghidează și direcția de mișcare).


Urmarind

Comportamentul de urmărire funcționează cam la fel caută, singura diferență este că urmăritorul nu va căuta ținta în sine, ci poziția sa în viitorul apropiat.

Presupunând că fiecare personaj din joc este reprezentat de o clasă numită Boid, următorul pseudo-cod implementează ideea de bază din spatele comportamentului de urmărire:

 exercitarea funcției publice (t: Boid): Vector3D T: int = 3; viitorPosition: Vector3D = t.position + t.velocity * T; retur căuta (futurePosition); 

După calculul forței de urmărire, trebuie adăugat la vectorul de viteză la fel ca toate forțele de direcție anterioare:

 funcția de direcție / viteza de masă = trunchiul (viteza + direcția, max_speed) poziția = poziția + viteza

Figura de mai jos ilustrează procesul:

Urmăritorul (personajul din partea de jos) va căuta poziția viitoare a țintă, urmând o traiectorie descrisă de curba portocalie. Rezultatul final va fi:


Folosirea comportamentului de urmărire T = 30. Faceți clic pe demo pentru a afișa vectori de forță. Ținta caută mouse-ul.


Îmbunătățirea acurateței exercitării

Există o problemă când valoarea T este constant: precizia de urmărire tinde să fie slabă atunci când ținta este aproape. Acest lucru se datorează faptului că atunci când obiectivul este aproape, urmăritorul va continua să caute predicția poziției țintă, adică T cadre "departe".

Acest comportament nu s-ar întâmpla niciodată într-o urmărire reală, deoarece urmăritorul ar ști că este destul de aproape de țintă și ar trebui să nu mai prevadă poziția sa.

Există un truc simplu care poate fi implementat pentru a evita acest lucru și pentru a îmbunătăți drastic exactitatea urmăririi. Ideea este foarte simplă; în loc de o valoare constantă pentru T, una dinamică este utilizată:

 T = distanța dintreTargetAndPursuer / MAX_VELOCITY

Noul T se calculează pe baza distanței dintre cele două caractere și a vitezei maxime pe care țintă o poate atinge. Cuvintele simple noi T mijloace "câte actualizări trebuie să treacă de la poziția actuală la poziția urmăritorului".

Cu cât distanța este mai mare, cu atât este mai mare T va fi, astfel că urmăritorul va căuta un punct cu mult mai departe decât ținta. Cu cât distanța este mai mică, cu atât este mai mică T va fi, însemnând că va căuta un punct foarte apropiat de țintă. Noul cod pentru această implementare este:

 urmărirea funcției publice (t: Boid): Vector3D var distanța: Vector3D = poziția - poziția; var T: int = distanță.length / MAX_VELOCITY; viitorPosition: Vector3D = t.position + t.velocity * T; retur căuta (futurePosition); 

Rezultatul final este:


Comportamentul de urmărire folosind o dinamică T. Faceți clic pe demo pentru a afișa vectori de forță. Ținta caută mouse-ul.


Sustragerea

Comportamentul de evitare este opusul comportamentului de urmărire. În loc să caute poziția viitoare a țintă, în comportamentul de evadare caracterul va fugi de această poziție:

Codul de evitare este aproape identic, doar ultima linie este schimbată:

 funcția publică evadată (t: Boid): Vector3D var distanța: Vector3D = poziția - poziția; var updatesAhead: int = distanță.length / MAX_VELOCITY; viitorPosition: Vector3D = t.position + t.velocity * updatesAhead; întoarce fuga (futurePosition); 

Rezultatul final este următorul:


Comportamentul de evitare. Faceți clic pe demo pentru a afișa vectori de forță. Ținta caută mouse-ul.

Concluzie

Acest tutorial descrie urmărirea și evitarea comportamentelor, care sunt minunate pentru a simula o varietate de modele, cum ar fi un grup de animale care încearcă să scape de un vânător.

Sper că v-ați bucurat de aceste sfaturi până acum și puteți începe să utilizați toate acele comportamente, combinându-le pentru a crea modele mai bune! Fiți la curent cu noi pe Twitter, Facebook sau Google+.