Разбирање на управувачките однесувања: бегство и пристигнување
Macedonian (Македонски јазик) translation by Stefan Nikolov (you can also view the original English article)
Управувачкото однесување има за цел да им помогне на автономните ликови да се движат на реалистичен начин, со користење на едноставни сили кои се комбинираат за да произведат животна навигација како импровизирана. Во ова упатство, ќе го покривам однесувањето на лицето, што го прави ликот да се оддалечи од гонителот и однесувањето кое го прави карактерот да забави и да застане додека се приближува до целта.
Забелешка: Иако ова упатство е напишано со помош на AS3 и Flash, треба да бидете во можност да ги користите истите техники и концепти во скоро секоја средина за развој на игри. Мора да имате основно разбирање за математичките вектори.
Бегајќи
Однесувањето на барањата опишано претходно се заснова на две сили кои го притискаат ликот кон целта: саканата брзина и управувањето.
desired_velocity = normalize(target - position) * max_velocity steering = desired_velocity - velocity
Посакуваната вредност
, во овој случај, е најкратката патека помеѓу карактерот и целта. Се пресметува со одземање на позицијата на целта од позицијата на ликот. Резултатот е сила вектор кој оди од ликот кон целта.

Побарајте однесување
Бегајното однесување ги користи истите истите две сили, но тие се приспособуваат за да се направи ликот да избега од целта:



Бегај однесување
Овој нов сакан вектор
на верификација се пресметува со одземање на позицијата на ликот од позицијата на целта, која произведува вектор кој оди од целта кон thecharacter.
Како резултат на силите се пресметуваат речиси на ист начин како и во однесувањето на барањата:
desired_velocity = normalize(position - target) * max_velocity steering = desired_velocity - velocity
Посакуваната_velocity
во тој случај претставува најлесната маршрута за избегнување која карактерот може да ја користи за бегство од целта. Управувачката сила го прави карактерот да се откаже од нејзината тековна рута, придвижувајќи го кон правецот на саканиот вектор на брзина.
Споредувајќи го посакуваниот вектор на брзина на бегство со саканиот вектор на брзина на однесувањето, може да се утврди следната релација:
flee_desired_velocity = -seek_desired_velocity
Со други зборови, еден вектор е негативен од другиот.
Додавање на силите за бегство
Откако се пресметува управувачката сила, таа мора да се додаде во векторот на брзината на ликот. Бидејќи таа сила го турка карактерот подалеку од целта, секоја рамка ликот ќе престане да се движи кон целта и ќе почне да се оддалечува од него, создавајќи бегство (портокалова крива на сликата подолу):



Додавањето на овие сили и конечната пресметка за брзина / позиција се постапува на ист начин како и порано. Подолу е демонстрација која прикажува неколку карактери кои вршат бегство однесување:
Движете го глувчето за да ја преместите целта.
Секој карактер е поставен во центарот на подвижното подрачје со случајна брзина. Тие ќе се обидат да побегнат од целта (курсорот на глувчето). Додавањето на сите сили го прави секој карактер непречено да ја напушти сегашната рута и да побегне од целта.
Во моментов целта влијае на секој карактер, игнорирајќи ја растојанието од нив; тоа можеше да биде ограничено на "област на дејство", каде што ликот ќе побегне само ако е доволно близу до целта.
Пристигнување
Однесувањето на барањата, како што видовме, го прави карактерот потег кон целта. Кога ќе стигне до дестинацијата, управувачката сила продолжува да делува врз неа врз основа на истите правила, со што карактерот "отскокнува" напред и назад околу целта.
Барањето однесување. Движете го глувчето за да ја преместите целта.
Однесувањето на доаѓањето го спречува ликот да се движи низ целта. Тоа го прави карактерот да се забави додека се приближува до дестинацијата, на крајот да застане на целта.
Однесувањето е составено од две фази. Првата фаза е кога ликот е подалеку од целта и функционира токму на истиот начин како и однесувањето на барањата (движење со целосна брзина кон целта).
Втората фаза е кога карактерот е близу до целта, во внатрешноста на "полето за забавување" (круг во центарот на позицијата на целта):



Кога ликот ќе влезе во кругот, тој се забавува додека не застане на целта.
Успорува
Кога карактерот ќе влезе во полето за забавување, неговата брзина се намалува линеарно до нула. Ова се постигнува со додавање на нова управувачка сила (сила на пристигнување) до векторот на брзината на ликот. Резултатот од ова дополнување на крајот ќе стане нула, што значи дека ништо нема да биде додадено на позицијата на ликот секоја рамка (нема да има движење):
// If (velocity + steering) equals zero, then there is no movement velocity = truncate(velocity + steering, max_speed) position = position + velocity function truncate(vector:Vector3D, max:Number) :void { var i :Number; i = max / vector.length; i = i < 1.0 ? i : 1.0; vector.scaleBy(i); }
Со цел да се осигура дека карактерот постепено ќе се забави пред да застане, брзината не треба да стане нула веднаш. Постепениот процес на забавување се пресметува врз основа на радиусот на полето за забавување и растојанието помеѓу карактерот и целта:
// Calculate the desired velocity desired_velocity = target - position distance = length(desired_velocity) // Check the distance to detect whether the character // is inside the slowing area if (distance < 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
Ако растојанието е поголемо од забавувањеRadius
, тоа значи дека карактерот е далеку од целта и неговата брзина треба да остане max_velocity
.
Ако растојанието е помало од забавениот радиус
, тоа значи дека карактерот влегол во областа на забавување и неговата брзина треба да се намали.
Терминот растојание
/ забавувањеRadius
ќе варира од 1
(кога растојанието
е еднакво на забавувањеRadius
) до 0 (w отпорноста
е речиси нула). Оваа линеарна варијација ќе ја намали брзината на брзината:



Како што претходно беше опишано, движењето на знаците се изведува на следниов начин:
steering = desired_velocity - velocity velocity = truncate (velocity + steering , max_speed) position = position + velocity
Ако саканата брзина се спушта до нула, тогаш управувачката сила станува-голема брзина
. Како последица на тоа, кога таа управувачка сила ќе се додаде на брзината, тоа ќе резултира со нула, правејќи го ликот да престане да се движи.
Подолу е демонстрација која го покажува однесувањето на пристигнување:
Поместете го глувчето за да ја преместите целта.
, се пресметува сила која ќе биде еднаква на -velocity
, спречување на ликот да се движи се додека таа сила е на место. Оригиналниот вектор на брзината на карактерот не се менува и продолжува да работи, но се намалува со помош на управувачот.
Ако личното придвижување на пристигнувањето е симнато, ликот повторно ќе почне да се движи, користејќи го својот оригинален вектор на брзина.
Заклучок
се движат подалеку од посакуваната цел додека однесувањето на пристигнување го прави забави и застанува на позицијата на целта. И двете можат да се искористат за да се создаде непречено бегство или да се следат моделите на движење, на пример. Тие, исто така, можат да се комбинираат за да создадат уште покомплексни движења.
Ова упатство повеќе опишуваше однесувања за водење, објаснувајќи ги бегствата и однесувањето. Во следните неколку постови ќе дознаеме повеќе однесување. Бидете во тек со следење на нас на Twitter, Facebook или Google+.