AI кули
ziat 24 октомври 2009 г., 19:11 ч
В момента работя върху AI на кулите. Опитвам се да разбера AI скрипта по подразбиране от урока, за да продължа напред
Сблъсках се със забавен проблем: Код: Избор на всички var attackRange = 30.0; var shootAngleDistance = 10.0; var target : Transform;
функция Start () if (target == null && GameObject.FindWithTag("Player")) target = GameObject.FindWithTag("Player").transform; > function Update () < ако (target == null) връщане; // Завъртане към цел var targetPoint = target.position; var targetRotation = Quaternion.LookRotation(targetPoint - transform.position, Vector3.up); transform.rotation = Quaternion.Slerp( transform.rotation, targetRotation, Time.deltaTime * 2.0); // Ако сме почти завъртяни към целта - изстреляйте един пълнител с амуниции var forward = transform.TransformDirection(Vector3.forward); var targetDir = target.position - transform.position; //if (Vector3.Angle(forward, targetDir) (скриптът е леко модифициран, тъй като е необходим само за разбиране)
Как да зададем само една равнина на въртене? (Кулата ще се състои от две части, едната се върти, другата се накланя) Точно както разбирам от скрипта, задаваме само една равнина за него, но купола проследява целта и вертикално.
Все още ли е нормално да виждам редовете си за отстраняване на грешки само след натискане на бутона "стоп" и след това за секунда?
Re: AI кули
gnoblin 24 октомври 2009 г. 22:18
Върнете първоначалната стойност на въртене по една ос в самия край.
Re: AI кули
ziat 25 октомври 2009 г. 14:25 ч
просто така? И как да го приложим
А какво ще кажете за линиите, защо са необходими тогава, ако не се виждат в прозореца на играта? Изграждайте всеки пътпроект?
Re: AI кули
Neodrop 25 октомври 2009 г. 14:55 ч
Re: AI кули
Zaicheg 25 октомври 2009 г., 18:10 ч.
Re: AI кули
ziat 25 октомври 2009 г., 21:39 ч
Реших да не страдам със самолети, нека кулите са ала галактика на батълстар, а не на Междузвездни войни
Код: Изберете всички варианти на снаряд: Rigidbody; var shootAngleDistance = 10.0; var bulspeed=700; var target : Transform; var reloadTime = 0.5; var ammoCount = 2000; private var lastShot = -10.0;
функция Start () if (target == null && GameObject.FindWithTag("Player")) target = GameObject.FindWithTag("Player").transform; > function Update () < ако (target == null) връщане; var targetvelocity=target.rigidbody.velocity; var Distance =Vector3.Distance(transform.position, target.position) ; var targetPoint = Vector3(target.position.x+targetvelocity.x*Mathf.Sqrt(Mathf.Pow(Distance,2)/(Mathf.Pow(bulspeed,2)-Mathf.Pow(targetvelocity.x,2))),target.position.y+targetvelocity.y*Mathf.Sqrt(Mathf.Pow(Distance,2)/(Mathf.Po w (bulspeed,2)-Mathf.Pow(targetvelocity.y,2))),target.position.z+targetvelocity.z*Mathf.Sqrt(Mathf.Pow(Distance,2)/(Mathf.Pow(bulspeed,2)-Mathf.Pow(targetvelocity.z,2))));//Корекция тук var targetRotation = Quaternion.LookRotation (targetPo int -transform.position, Vector3(0,1,0)); transform.rotation = Quaternion.Slerp( transform.rotation, targetRotation, Time.deltaTime * 2.0); var forward = transform.TransformDirection(Vector3.forward); var targetDir = target.position - transform.position; if (Vector3.Angle(forward, targetDir) reloadTime + lastShot && ammoCount > 0) var instantiatedProjectile : Rig > instantiatedProjectile.velocity =transform.TransformDirection(Vector3(0,0,bulspeed)); lastShot = Time.time; амуниции-- ; > >
Така че може би някой ще бъде полезен Скриптът прави корекция при насочване към целта, като взема предвид скоростта на целта и скоростта на снаряда, замествайки вместо реални координати, координатите на изчислената цел Формулата, по която се изчислява координатата за една ос V2- Скоростта на целта по тази ос V1-Скорост на куршума (число) L -Разстояние от купола до целта (Всички в глобални координати)
Приблизително същата техника може да се използва за добавяне на поправка за движещи се кули
Само самият скрипт все още трябва да се подобри малко, ако желаете) Тъй като самата кула се притъпява и продължава да стреля, когато целта е извън полезрението.
И как да огранича въртенето на купола (и ъгли, и скорост)?
Re: AI кули
Zaicheg 25 октомври 2009 г., 22:00 ч.
Re: AI кули
ziat 25 октомври 2009 г., 22:02 ч
да, както е. Вероятно ще тествам утре
Тази поправка изяде мозъка ми днес%), докато измислих изпълнението
Re: AI кули
iqubik 26 октомври 2009 г., 09:21 ч
ziat написа: ATP
Реших да не страдам със самолети, нека кулите са ала галактика на батълстар, а не на Междузвездни войни
Код: Изберете всички варианти на снаряд: Rigidbody; var shootAngleDistance = 10.0; var bulspeed=700; var target : Transform; var reloadTime = 0.5; var ammoCount = 2000; private var lastShot = -10.0;
функция Start () if (target == null && GameObject.FindWithTag("Player")) target = GameObject.FindWithTag("Player").transform; > function Update () < ако (target == null) връщане; var targetvelocity=target.rigidbody.velocity; var Distance =Vector3.Distance(transform.position, target.position) ; варtargetPoint = Vector3(target.position.x+targetvelocity.x*Mathf.Sqrt(Mathf.Pow(Distance,2)/(Mathf.Pow(bulspeed,2)-Mathf.Pow(targetvelocity.x,2))),target.position.y+targetvelocity.y*Mathf.Sqrt(Mathf.Pow(Distance,2)/(Mathf.Pow(bulspe) ed,2)-Mathf.Pow(targetvelocity.y,2))),target.position.z+targetvelocity.z*Mathf.Sqrt(Mathf.Pow(Distance,2)/(Mathf.Pow(bulspeed,2)-Mathf.Pow(targetvelocity.z,2))));//Поправку берём тук var targetRotation = Quaternion.LookRotation (targetPoint- transform.position, Vector3(0,1,0)); transform.rotation = Quaternion.Slerp( transform.rotation, targetRotation, Time.deltaTime * 2.0); var forward = transform.TransformDirection(Vector3.forward); var targetDir = target.position - transform.position; if (Vector3.Angle(forward, targetDir) reloadTime + lastShot && ammoCount > 0) var instantiatedProjectile : Rig > instantiatedProjectile.velocity = transform.TransformDirection(Vector3(0,0,bulspeed)); lastShot = Time.time; амуниции-- ; > >
Значи може да се пригоди Скриптът трябва да бъде поправен при навеждане на целта беря в съответствие със скоростта на целта и скоростта на снаряда, подставяйки вместо реални координати координатите на разчетните цели Формула, по която се изчислява координатата за една оси V2- Скорост на целта по тази оси V1-Скорост на пули(число) L -Разстояние от турели до цел (Все в глобалните координати)
Примерно тази методика може да добави поправка и за движещи се турелей
Само сам скрипт още надо малко да направя при желания) Тк турел сама тупит и продължава да стреля, когато целта е извън видимостта.
И още как да ограничите връщането на турели(както е много и скорост)?
Re: Аи турели
ziat 26 октомври 2009, 13:30
Re: Аи турели
iqubik 27октомври 2009 г., 23:53 ч
Re: AI кули
Толкинг 28 октомври 2009 г., 10:30 сутринта
И къде е изчисляването на сборната точка, времето на полета?
Дадено: VT -ВЕКТОР на скоростта на целта L -позиция на целта (вектор) Vel - скорост на куршума
Намерете VECTOR стрелба VB
(Ние броим от купола)
Позиция на целта в момент t (Мишената не се клати или променя скоростта) PTt=VT*t+L Позиция на куршума в момент t PBt=VB*t Нуждаем се от целта и куршума, за да се срещнат: PTt=PBt. В този случай скоростта на куршума (дължината на вектора) не трябва да надвишава Vel: VBx*VBx+VBy*VBy+VBz*VBz=Vel*Vel
Това е някак общо взето, но не мога да го реша с познанията си по математика.
За да реша този проблем, ще трябва да намеря нормалата към равнината, минаваща през вектора на скоростта и купола. Поставете обекта "прицел" в позицията на купола и завъртете "отгоре" по тази нормала. Преобразувайте всички данни в координатната система "aimer", като се отървете от едно измерение, решете системата от 3 уравнения с 3 неизвестни: т.е.
Vx-вземете от първия, Vy от втория. Заместете в третото и решете уравнението, намерете t от него, заменете го в 1 и 2, намерете вектора на скоростта на куршума, който превеждате от системата "прицел" в глобални и стреляйте. Въпреки че не мога да реша такова опростено уравнение. Има 2 квадрата от сумата за разкриване, нямам достатъчно внимание!
А в реалния живот задачите за прицелване се решават някак чрез интеграли, доколкото знам.
P.S. Не виждам снимката с формулите.
Re: AI кули
iqubik 28 октомври 2009 г., 15:08 ч.
Толкинг написа: Глупав съм.
И къде е изчисляването на сборната точка, времето на полета?
Дадено: VT - ВЕКТОР на целевата скорост L-позиция на целта (вектор) Vel - скорост на куршума
Намерете VECTOR стрелба VB
(Ние броим от купола)
Позиция на целта в момент t (Мишената не се клати или променя скоростта) PTt=VT*t+L Позиция на куршума в момент t PBt=VB*t Нуждаем се от целта и куршума, за да се срещнат: PTt=PBt. В този случай скоростта на куршума (дължината на вектора) не трябва да надвишава Vel: VBx*VBx+VBy*VBy+VBz*VBz=Vel*Vel
Това е някак общо взето, но не мога да го реша с познанията си по математика.
За да реша този проблем, ще трябва да намеря нормалата към равнината, минаваща през вектора на скоростта и купола. Поставете обекта "прицел" в позицията на купола и завъртете "отгоре" по тази нормала. Преобразувайте всички данни в координатната система "aimer", като се отървете от едно измерение, решете системата от 3 уравнения с 3 неизвестни: т.е.
Vx-вземете от първия, Vy от втория. Заместете в третото и решете уравнението, намерете t от него, заменете го в 1 и 2, намерете вектора на скоростта на куршума, който превеждате от системата "прицел" в глобални и стреляйте. Въпреки че не мога да реша такова опростено уравнение. Има 2 квадрата от сумата за разкриване, нямам достатъчно внимание!
А в реалния живот задачите за прицелване се решават някак чрез интеграли, доколкото знам.
P.S. Не виждам снимката с формулите.
Re: AI кули
ziat 30 октомври 2009 г. 19:40 ч
Реших го чрез принудително добавяне на 0,5 секунди (наречете го X). Зависи от размера на корабите (доколкото разбрах, но не експериментирах повече, може би се получих правилно при втория опит). и 0,5 секунди е добре за размерите, които използвам. В резултат на това постигнах това, което искам, конкретно в тази игра, която. направи
Говорейкинаписа: тъп съм.
Ето как щеше да изглежда, ако не беше онази прекрасна функция, която насочваше пистолета към зададените координати. Така че вместо да изчислявам векторите, изчислявам новата координата на обекта + прилагам тази принудителна корекция.
Получавам нови координати, използвайки целевата скорост, разложена на три оси. умножено по времето, необходимо на куршума да достигне целта. Последното го получих по калкулация и кней I и плюс 0,5.
Тествах го с приятел и изглежда работи, тези попадения в целта са стабилни, поне докато не се опитат да избягват огъня (но е трудно да се води насочен огън по оръдието). Въпреки че го тествах сам с приятели и може би те не са изгледали нещо.
При интерес мога да публикувам демонстрация утре с тази кула. Между другото, би било полезно, защото го правя в прекрасна изолация) и приятелите ми вече са уморени от тестване. (трудно е да се публикува за публично тестване, защото вместо повечето модели има паралелпипеди, кубчета и топки и малко хора се интересуват от това) и точно сега правя факта, че след максималния овладявам блендера и правя нормални модели.
Re: AI кули
ziat 30 октомври 2009 г. 22:39 ч
Изглежда, че разбирам какво става. може и без Х-а да струва
Изрових едно листче, на което изчислих времето. Разбрах, че броим за местни координати (и дори не съвсем местни). когато между посоката на оръдието и осите, по които е изчислено, скоростта е под прав ъгъл. И така използвах Питагоровата теорема
И във формулата работя в глобални оси, когато ъгълът между оста ще се различава от директния.
Доколкото си спомням, тогава формулата ще бъде малко по-различна от тази на Питагор. възможна неточност поради това. И вижте, колкото по-далеч е ъгълът от 90 градуса, толкова по-голяма ще бъде неточността. утре тогава ще се отклоня отмоделиране и тестване с кубчета.