Аи турели

Форум для всего, что связано с ИИ.

Аи турели

Сообщение ziat 24 окт 2009, 19:11

В данный момент работаю над аи турели.
Пытаюсь разобраться со стандартным скриптом аи из туториала, чтобы двинуться дальше

Столкнулся с забавной проблемой:
Код: Выделить всё
var attackRange = 30.0;
var shootAngleDistance = 10.0;
var target : Transform;

function Start ()
{
   if (target == null && GameObject.FindWithTag("Player"))
   target = GameObject.FindWithTag("Player").transform;
}
function Update ()
{
   if (target == null)
   return;
   // Rotate towards target
   var targetPoint = target.position;
   var targetRotation = Quaternion.LookRotation (targetPoint - transform.position, Vector3.up);
   transform.rotation = Quaternion.Slerp(
      transform.rotation, targetRotation, Time.deltaTime * 2.0);
// If we are almost rotated towards target - fire one clip of ammo
   var forward = transform.TransformDirection(Vector3.forward);
   var targetDir = target.position - transform.position;
   //if (Vector3.Angle(forward, targetDir) < shootAngleDistance)
   //SendMessage("Fire");
   Debug.DrawLine( transform.position, Vector3.forward*20, Color.red);

}

(скрипт был немного модифицирован, тк он нужен только чтобы понять)

Как задать только одну плоскость вращения?(турель будет состоять из двух частей, одна осуществляет поворот, другая наклон)
Просто насколько я понял из скрипта мы и задавали ей только одну плоскость, но турель отслеживает цель и по вертикали.

Ещё нормально что свои дебаг линии я вижу только после нажатия кнопки "стоп" и то в течение секунды?
ziat
UNITрон
 
Сообщения: 199
Зарегистрирован: 07 окт 2009, 21:28
  • Сайт

Re: Аи турели

Сообщение gnoblin 24 окт 2009, 22:18

Как задать только одну плоскость вращения?

Возвращать исходное значение поворота по одной оси в самом конце.

Ещё нормально что свои дебаг линии я вижу только после нажатия кнопки "стоп" и то в течение секунды?

Ненормально.
(В окне Game они видны и не должны быть, если что)
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Аи турели

Сообщение ziat 25 окт 2009, 14:25

только так?
И как это реализовать


А насчёт линий зачем они тогда нужны если их не видно в окне гейм? Каждый раз строить проект?
ziat
UNITрон
 
Сообщения: 199
Зарегистрирован: 07 окт 2009, 21:28
  • Сайт

Re: Аи турели

Сообщение Neodrop 25 окт 2009, 14:55

Они для того, чтобы в окне Scene наблюдать.
Если хочется в Game дебажить, стоит написать свой вариант отображения лучей.
Через класс GL или используя LineRenderer
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Аи турели

Сообщение Zaicheg 25 окт 2009, 18:10

DrawLine отображается в Game, если включить там кнопочку Gizmos.
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: Аи турели

Сообщение ziat 25 окт 2009, 21:39

Спс

решил таки с плоскостями не мучаться пусть турели будут аля батлстар галактика, а не ЗВ

Код: Выделить всё
var projectile : Rigidbody;
var shootAngleDistance = 10.0;
var bulspeed=700;
var target : Transform;
var reloadTime = 0.5;
var ammoCount = 2000;
private var lastShot = -10.0;

function Start ()
{
   if (target == null && GameObject.FindWithTag("Player"))
   target = GameObject.FindWithTag("Player").transform;
}
function Update ()
{
   if (target == null)
   return;
   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.Pow(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 (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) < shootAngleDistance)
   BroadcastMessage("Fire");
   //Debug.DrawLine( transform.position, transform.position+forward*1000, Color.red);

}
function Fire ()
{
if (Time.time > reloadTime + lastShot && ammoCount > 0)
   {
   var instantiatedProjectile : Rigidbody = Instantiate (projectile, Vector3(transform.position.x,transform.position.y,transform.position.z+20), transform.rotation);
   instantiatedProjectile.velocity = transform.TransformDirection(Vector3(0,0,bulspeed));
   lastShot = Time.time;
   ammoCount-- ;
   }
}


Значит может кому пригодится
Скрипт берёт поправку при наведение на цель беря в учёт скорость цели и скорость снаряда, подставляя вместо реальных координат, координаты расчётные цели
Формула по которой расчитывается координата для одной оси
Изображение
V2- Скорость цели по этой оси
V1-Скорость пули(число)
L -Растояние от турели до цели
(Всё в глобальных координатах)

Примерно тойже методикой можно добавить поправку и для движущихся турелей

Только сам скрипт ещё надо немного доработать при желании) Тк турель сама тупит и продолжает стрелять когда цель вне поля видимости....

И ещё как ограничить вращение турели(как углы так и скорость)?
ziat
UNITрон
 
Сообщения: 199
Зарегистрирован: 07 окт 2009, 21:28
  • Сайт

Re: Аи турели

Сообщение Zaicheg 25 окт 2009, 22:00

ziat писал(а):И ещё как ограничить вращение турели(как углы так и скорость)?

Может я не так понял, но:
http://docs.unity3d.ru/ScriptReference/Mathf.Clamp.html
Пример использования во вращении — MouseLook.cs из стандартного пакета.
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: Аи турели

Сообщение ziat 25 окт 2009, 22:02

ага вроде оно... только тестить аверно буду завтра

Эта поправка мне мозг сегодня съела %) пока придумывал реализацию
ziat
UNITрон
 
Сообщения: 199
Зарегистрирован: 07 окт 2009, 21:28
  • Сайт

Re: Аи турели

Сообщение iqubik 26 окт 2009, 09:21

ziat писал(а):Спс

решил таки с плоскостями не мучаться пусть турели будут аля батлстар галактика, а не ЗВ

Код: Выделить всё
var projectile : Rigidbody;
var shootAngleDistance = 10.0;
var bulspeed=700;
var target : Transform;
var reloadTime = 0.5;
var ammoCount = 2000;
private var lastShot = -10.0;

function Start ()
{
   if (target == null && GameObject.FindWithTag("Player"))
   target = GameObject.FindWithTag("Player").transform;
}
function Update ()
{
   if (target == null)
   return;
   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.Pow(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 (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) < shootAngleDistance)
   BroadcastMessage("Fire");
   //Debug.DrawLine( transform.position, transform.position+forward*1000, Color.red);

}
function Fire ()
{
if (Time.time > reloadTime + lastShot && ammoCount > 0)
   {
   var instantiatedProjectile : Rigidbody = Instantiate (projectile, Vector3(transform.position.x,transform.position.y,transform.position.z+20), transform.rotation);
   instantiatedProjectile.velocity = transform.TransformDirection(Vector3(0,0,bulspeed));
   lastShot = Time.time;
   ammoCount-- ;
   }
}


Значит может кому пригодится
Скрипт берёт поправку при наведение на цель беря в учёт скорость цели и скорость снаряда, подставляя вместо реальных координат, координаты расчётные цели
Формула по которой расчитывается координата для одной оси
Изображение
V2- Скорость цели по этой оси
V1-Скорость пули(число)
L -Растояние от турели до цели
(Всё в глобальных координатах)

Примерно тойже методикой можно добавить поправку и для движущихся турелей

Только сам скрипт ещё надо немного доработать при желании) Тк турель сама тупит и продолжает стрелять когда цель вне поля видимости....

И ещё как ограничить вращение турели(как углы так и скорость)?

Потрясно!! Проверил на бумаге алгоритм, рекспект++)))
В кодах выглядит жутко, понять можно только отдебажив каждую центровую строку.
Чтобы написать и реализовать алгоритм помогла математика + программинг или знакомые + поисковики?)
----------------------
qub edition
Идеальное общество это общество где каждый станет настолько эгоистом, что начнёт понимать, что делая недоброе другому получит тоже в ответ. (око за око, с прощением)
iqubik
UNIт
 
Сообщения: 74
Зарегистрирован: 11 июн 2009, 13:38
Откуда: Stavropol
  • Сайт
  • ICQ

Re: Аи турели

Сообщение ziat 26 окт 2009, 13:30

математика и понимание принципа действия функции...ну и может немного логики и опыта игры в самолётные симуляторы)
Изначально хотел вносить поправку в углы(только в этом случае формула выгляделабы ещё страшнее, ну так и не придумал как сделать)....
Но потом разобрался в функции, понял что она направляет объект в сторону координат, ну и родилась идея а что мешает вместо реальных координат реализовать расчётные...
немного возни с линейкой и каранадшём, вспомнил физику ну и придумал как выразить интересующие координаты через известные величины...
ziat
UNITрон
 
Сообщения: 199
Зарегистрирован: 07 окт 2009, 21:28
  • Сайт

Re: Аи турели

Сообщение iqubik 27 окт 2009, 23:53

Меня заинтересовал этот алгоритм.
К сожалению на бумаге все выглядит замечательно, но в движке алгортм не имеет такой предпологающей силы чтобы действительно попадать в сфера движущуюся с constant force.
Он всегда отстаёт на шаг от положения объекта. Точнее пули летят в место которое есть середина между прицелом и мишенью.
Я думаю, что проблема в непросчете ускорения. И в том что скрипт считает в прошедшем времени, основываясь на заведомо устаревшей информациио положении объекта.
У вас нет доступа для просмотра вложений в этом сообщении.
----------------------
qub edition
Идеальное общество это общество где каждый станет настолько эгоистом, что начнёт понимать, что делая недоброе другому получит тоже в ответ. (око за око, с прощением)
iqubik
UNIт
 
Сообщения: 74
Зарегистрирован: 11 июн 2009, 13:38
Откуда: Stavropol
  • Сайт
  • ICQ

Re: Аи турели

Сообщение Tolking 28 окт 2009, 10:30

Что-то я туплю.

А где вообще вычисление точки встречи, времени полета?

Дано:
VT -ВЕКТОР скорости цели
L -положения цели (вектор)
Vel - скорость пули

Найти ВЕКТОР стрельбы VB

(Считем от-но турели)

Положение цели в момент времени t (Цель не виляет и не меняет скорость) PTt=VT*t+L
Пложение пули в момент времени t PBt=VB*t
Нам нужно чтобы цель и пуля встретились: PTt=PBt. При этом скорость пули (Длина вектора) не должна привышать Vel: VBx*VBx+VBy*VBy+VBz*VBz=Vel*Vel

Это как бы с общем виде, но я не решу это с моими познаниями в математике.

Для того, чтобы решить эту задачу, мне придется найти нормаль к плоскости проходящей через вектор скорости и турель Поставить объект "прицеливатель" в позицию турели и повернуть "верхом" по этой нормали. Перевести все данные в систему координат "прицеливателя", избавившись от одного измерения решить систему 3 уравнений с 3 неизвестными:
т.е
VTx*t+Lx=VBx*t
VTy*t+Ly=VBy*t
VBx*VBx+VBy*VBy=Vel*Vel

Vx-получаешь из первого, Vy из второго. Подставляешь в третье и решаешь уравнение, из него находишь t, его подставляешь в 1 и 2, находишь вектор скорости пули, который переводишь из системы "прицеливателя" в глобальные и стреляешь. :) Хотя и такое упрощенное уравнение я решить не в силе. Там 2 квадратса суммы раскрывать, у меня внимательности не хватит!

А в реальной жизни, задачи на прицеливание решаются через интегралы как-то, на сколько я знаю... :)

P.S. Картинку с формулами я не вижу. :(
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2716
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: Аи турели

Сообщение iqubik 28 окт 2009, 15:08

Tolking писал(а):Что-то я туплю.

А где вообще вычисление точки встречи, времени полета?

Дано:
VT -ВЕКТОР скорости цели
L -положения цели (вектор)
Vel - скорость пули

Найти ВЕКТОР стрельбы VB

(Считем от-но турели)

Положение цели в момент времени t (Цель не виляет и не меняет скорость) PTt=VT*t+L
Пложение пули в момент времени t PBt=VB*t
Нам нужно чтобы цель и пуля встретились: PTt=PBt. При этом скорость пули (Длина вектора) не должна привышать Vel: VBx*VBx+VBy*VBy+VBz*VBz=Vel*Vel

Это как бы с общем виде, но я не решу это с моими познаниями в математике.

Для того, чтобы решить эту задачу, мне придется найти нормаль к плоскости проходящей через вектор скорости и турель Поставить объект "прицеливатель" в позицию турели и повернуть "верхом" по этой нормали. Перевести все данные в систему координат "прицеливателя", избавившись от одного измерения решить систему 3 уравнений с 3 неизвестными:
т.е
VTx*t+Lx=VBx*t
VTy*t+Ly=VBy*t
VBx*VBx+VBy*VBy=Vel*Vel

Vx-получаешь из первого, Vy из второго. Подставляешь в третье и решаешь уравнение, из него находишь t, его подставляешь в 1 и 2, находишь вектор скорости пули, который переводишь из системы "прицеливателя" в глобальные и стреляешь. :) Хотя и такое упрощенное уравнение я решить не в силе. Там 2 квадратса суммы раскрывать, у меня внимательности не хватит!

А в реальной жизни, задачи на прицеливание решаются через интегралы как-то, на сколько я знаю... :)

P.S. Картинку с формулами я не вижу. :(

Вы меня пугаете)))) Я с первой формулы попутал, а теперь я просто в шоке)))))
----------------------
qub edition
Идеальное общество это общество где каждый станет настолько эгоистом, что начнёт понимать, что делая недоброе другому получит тоже в ответ. (око за око, с прощением)
iqubik
UNIт
 
Сообщения: 74
Зарегистрирован: 11 июн 2009, 13:38
Откуда: Stavropol
  • Сайт
  • ICQ

Re: Аи турели

Сообщение ziat 30 окт 2009, 19:40

iqubik писал(а):Меня заинтересовал этот алгоритм.
К сожалению на бумаге все выглядит замечательно, но в движке алгортм не имеет такой предпологающей силы чтобы действительно попадать в сфера движущуюся с constant force.
Он всегда отстаёт на шаг от положения объекта. Точнее пули летят в место которое есть середина между прицелом и мишенью.
Я думаю, что проблема в непросчете ускорения. И в том что скрипт считает в прошедшем времени, основываясь на заведомо устаревшей информациио положении объекта.

Я решил это принудительно добавив 0,5 секунды(назвав его X)... Он зависит от размера кораблей(насколько я понял, но уже не экспериментировал, тк сразу же со второй попытки я попал)...
и 0.5 секунды подходит для тех размеров которые я использую... Как итог добился того что я хочу, конкретно в этой игре которую. делаю

Tolking писал(а):Что-то я туплю.

....


Так бы оно выглядело если бы не было той замечательной функции, которая бы нацеливала пушку на заданные координаты...
Поэтому вместо вычесления векторов я высчитываю новую координату объекта + вношу ту принудетельную поправку...

Новые координаты получаю, используя скорость цели разложеную на три оси....умноженое на время полёта пули до цели...последнюю я получал путём расчёта и кней я и плюсую 0,5....

Я тестировал с другом, и вроде работает, те хиты по цели идут стабильно, покрайней мере до попыток увернуться от огня(но при этом вести прицельный огонь по пушке сложно).... Хотя тестировал сам со знакомыми, и может чего не досмотрели....

Если интересно могу выложить завтра демку, с той турелью....Кстати было бы это полезно, тк делаю в гордом одиночестве) а знакомые уже устали от тестирования.....(выкладывать на публичное тестирование сложно, тк вместо большей части моделек паралелпипеды, кубики и шарики и мало кого интересует подобное) и щас я занимаюсь тем что после макса осваиваю блендер и делаю нормальные модельки....
ziat
UNITрон
 
Сообщения: 199
Зарегистрирован: 07 окт 2009, 21:28
  • Сайт

Re: Аи турели

Сообщение ziat 30 окт 2009, 22:39

Значится кажись понял в чём дело..... возможно даже без Х-а обойдётся

Откопал листочек на котором вычеслял время... Понял, что расчитывал для локальных координат(и даже не совсем локальных)... когда между направлением пушки, и осями на которые расчитывалсь, скорость были прямые углы... И поэтому использовал теорему Пифагора

А в формуле работаю в глобальных осях, когда угол между между осью, будет отличаться от прямого....

Насколько я помню, тогда формула будет несколько отличаться от Пифагора.... возможно неточность из-за этого....
И посмотритеполучается чем дальше угол от 90 градусов, тем больше будет неточность... завтра тогда отвлекусь от моделинга и потестю с кубиками....
ziat
UNITрон
 
Сообщения: 199
Зарегистрирован: 07 окт 2009, 21:28
  • Сайт

След.

Вернуться в Искуственный Интеллект

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


cron