Аи турели

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

Re: Аи турели

Сообщение Zaicheg 05 ноя 2009, 09:46

Zaicheg писал(а):DrawLine отображается в Game, если включить там кнопочку Gizmos.

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

Re: Аи турели

Сообщение gnoblin 06 ноя 2009, 14:28

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

Re: Аи турели

Сообщение Kann 04 дек 2009, 03:26

Подниму немного темку, так как я тоже уперся в вопрос корректного попадания в цель если она движется, те формулы что вы тут пишите, может и правильные... чес сказать я их не понял и сам скрипт так же =) но решил этот вопрос по моему проще,в независимости от дальности или угла, у меня попадания практически 100% ну само сабой если цель не меняет свое направление пока летит ракета...
Код: Выделить всё
var distance = Vector3.Distance(transform.position , target.position);// высчитываем дистанцию до объекта
         var Vp = distance/100;// получаем время необходимое ракете для преодоления дистанции
          S =  Vp * controller.velocity.x;// считаем какое расстояние преодолеет цель
          Z = Vp * controller.velocity.z;
var instantiatedProjectile : Rigidbody = Instantiate (projectile, transform.position, transform.rotation);
         direction = Vector3(target.transform.position.x+S, target.transform.position.y,target.transform.position.z+Z)- transform.position;
instantiatedProjectile.velocity = direction.normalized * Speed;

Kann
Старожил
 
Сообщения: 553
Зарегистрирован: 05 ноя 2009, 14:06

Re: Аи турели

Сообщение Tolking 04 дек 2009, 10:11

Давай проверим

Мы (0,0,0)
Цель(0,0,100), скорость (100,0,0)

distance = 100// высчитываем дистанцию до бъекта
Vp = 1// получаем время необходимое ракете для преодоления дистанции (непонятно почему делим на 100)
S = 100// считаем какое расстояние преодолеет цель
Z = 0;

direction = (100,0,100)
instantiatedProjectile.velocity = direction.normalized * Speed; А чему равно Speed? Почему делили на 100, а умножаем на Speed? Если Speed=100, то никак ракета не попадет в цель. Ибо геометрия! Если ракета и попадает в цель, то только не из-за этого скрипта. Видимо в скрипте полета ракеты "самонаведение" заложено.
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2716
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: Аи турели

Сообщение Kann 04 дек 2009, 13:36

объясняю,
Vp=distance/100 - полученную дистанцию между 2мя объектами делим на скорость нашей ракеты для вычисления времени необходимого ракете для преодоления расстояния
S=Vp*velocity.x - здесь считаем какое растояние по оси X преодолеет наша цель пока летит наша ракета(velocity - скорость нашей цели)
Y..
Z... тут по желанию если нужно высчитать по другим осям.
direction = Vector3(target.x+S,y,z) указываем направление на нашу цель + прибавляем к X нашу поправку S
direction.normalized * Speed - нормализуем вектор+ придаем ему скорость для нашей ракеты равной 100
для эксперимента можете использовать FPStutorial для этого в скрипте RocketLauncher проведите вышеприведенные изменения, получите скорость передвижения контролера Player по осям x и z (если нужно поправте скорость разворота робота) и живым от туда не уйдете =)
Kann
Старожил
 
Сообщения: 553
Зарегистрирован: 05 ноя 2009, 14:06

Re: Аи турели

Сообщение waruiyume 08 май 2011, 20:24

Здравствуйте! Пилю поворот турели на точку.
Что вышло:
HTML код для вашего блога :
Код: Выделить всё
<script language='javascript' type="text/javascript"> document.write("<iframe marginheight='0' src='http://unity3d.ru/distribution/player.php?url=http://dl.dropbox.com/u/23279033/turret.unity3d&w=640&h=480&t=true&preview=1' height='"+(480+30)+"' width='640' frameborder='0' scrolling='no'></iframe>"); </script>

Синтаксис:
Используется javascript
var tower:Transform;
private var tower_pivot:Transform;
tower_pivot=tower.parent;
private var tower_ang:float;

var gun:Transform;
private var gun_pivot:Transform;
gun_pivot=gun.parent;
private var gun_ang:float;

var target_point:Vector3;
private var local_target_point:Vector3;

var yLimit:float=180;
var xLimit:float=45;

private var xl:Quaternion;
xl = Quaternion.Euler(xLimit,0,0);
private var xl_i:Quaternion;
xl_i = Quaternion.Euler(-xLimit,0,0);
xLimit=xl.x;

private var yl:Quaternion;
yl = Quaternion.Euler(0,yLimit,0);
private var yl_i:Quaternion;
yl_i = Quaternion.Euler(0,-yLimit,0);
yLimit=yl.y;

var ySpeed:float=5;
var xSpeed:float=5;


private var ray : Ray;
private var cam:Camera;
cam=Camera.main;
private var hit:RaycastHit;


function Update ()
{
       
    ray = cam.ScreenPointToRay (Input.mousePosition);
    if(Physics.Raycast (ray,hit))
    {
                target_point=hit.point;
       
                Debug.DrawLine (tower_pivot.position,target_point, Color.red);
                Debug.DrawLine (gun_pivot.position,target_point, Color.green);
        }
               
        local_target_point=tower_pivot.InverseTransformDirection(tower.position-target_point);
        local_target_point.y=0;
        tower_ang=Vector3.Angle(Vector3.forward,local_target_point)*Mathf.Sign(local_target_point.x)+180;
        tower.localRotation.eulerAngles.y=Mathf.LerpAngle (tower.localRotation.eulerAngles.y,tower_ang,Time.deltaTime*ySpeed);
       
        if (tower.localRotation.w<0&&tower.localRotation.y>yLimit)
        {
                tower.localRotation=yl_i;
        }
        else if (tower.localRotation.w>0&&tower.localRotation.y>yLimit)
        {
                tower.localRotation=yl;
        }
               
        local_target_point=gun_pivot.InverseTransformDirection(gun_pivot.position-target_point);
        local_target_point.x=0;
        gun_ang=Vector3.Angle(Vector3.forward,local_target_point)*
        Mathf.Sign(local_target_point.z)*Mathf.Sign(local_target_point.y)+180;
        gun.localRotation.eulerAngles.y=0;
        gun.localRotation.eulerAngles.z=0;
        gun.localRotation.eulerAngles.x=Mathf.LerpAngle (gun.localRotation.eulerAngles.x,gun_ang,Time.deltaTime*xSpeed);
               
        if (gun.localRotation.w<0&&gun.localRotation.x>xLimit)
        {
                gun.localRotation=xl_i;
        }
        else if (gun.localRotation.w>0&&gun.localRotation.x>xLimit)
        {
                gun.localRotation=xl;
        }
}
 

Работает, но сильно по индуски все это :), может кто пнет в нужном направлении.
Заранее спасибо!
У вас нет доступа для просмотра вложений в этом сообщении.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Аи турели

Сообщение Paul Siberdt 08 май 2011, 21:03

Поищите по форуму, я уже постил раза два скрипт турели...
Разбирайтесь сами :p :

Синтаксис:
Используется javascript
function TrackTurret ( _turret : Transform,  _target : Vector3, _tracking : float ){
  TrackTurret( _turret, null, _target, _tracking, 0.0 );
}

function TrackTurret ( _turret : Transform, _gun : Transform, _target : Vector3, _tracking : float, _limit : float ){
  var vTargetPosLocal : Vector3 = _turret.InverseTransformPoint(_target); // Target position in my local space
  vTargetPosLocal.y = 0.0;     
// Target position local horizontal projection

  var angle : float = Vector3.Angle(vTargetPosLocal, Vector3.forward);
  if(_gun){
    if ( angle < 30 ) TrackGun(_gun, _target, _tracking * 2, _limit );
      else  TrackGun(_gun, _turret.TransformPoint(Vector3(0.0, 0.0, 5.0)), _tracking * 2, _limit );
// Debug.DrawRay (_gun.position, _turret.forward*10, Color.gray);
  }
       
  _tracking *= Common.tool.gameTimeScale * Time.deltaTime;
  if ( angle > 0.1 )
    _turret.Rotate(0, Mathf.Sign(vTargetPosLocal.x) * (( angle > _tracking )?_tracking:angle), 0, Space.Self);
}

function TrackGun ( _gun : Transform, _target : Vector3, _tracking : float, _limit : float ){
  var vTargetPosLocal : Vector3 = _gun.InverseTransformPoint(_target); // Target position in my local space
  vTargetPosLocal.x = 0.0; // Target position local horizontal projection
  var angle : float = Vector3.Angle(vTargetPosLocal, Vector3.forward);
  var angle_res : float = _gun.localEulerAngles.x;
  _tracking *= Common.tool.gameTimeScale * Time.deltaTime;
  if ( angle > 0.1 ) {
    angle_res   -= Mathf.Sign(vTargetPosLocal.y) * (( angle > _tracking )?_tracking:angle);
    if(Mathf.Cos(angle_res * Mathf.Deg2Rad) > Mathf.Cos( _limit * Mathf.Deg2Rad )) _gun.localEulerAngles.x = angle_res;
  }
}



Вариант вызова (копипастанул с проекта, не обращайте внимания на странные префиксы и переменные :p ):
Синтаксис:
Используется javascript
  if ( cS.locatorTurret ) {
    Global.use.TrackTurret ( cS.locatorTurret, cS.locatorGun, vTargetPos + vPrediction, tracking_cur, trackingLimit );
// Debug.DrawRay (cS.ScalelocatorTurret.position, cS.locatorTurret.forward * 10, Color.gray);
// Debug.DrawRay (cS.locatorGun.position, cS.locatorGun.forward * 10, Color.white);
  }
  if ( cS.locatorRadar ){
    Global.use.TrackTurret ( cS.locatorRadar, vRadarTarget, tracking_cur * 5.0 );
  }


Да, там трэкинг орудия завязан на трэкинге башни и возвращается в дефолтную позицию, если угол башни до цели меньше чего-то там... все это дело можно переправить под свои нужды :)

Ха.. кстати, у вас-то все то же самое. В скрипте нет сенсора цели, я просто вешаю отдельную коротинку с проверкой дистанции до игрока (для мобов) и сферическим триггером и регистратором целей (для игрока)

Ну и оружие, когда механизм трэкинга говорит, что Dot находится в пределах погрешности наведения, трассирует луч в цель и, при верном тэге препятствия, струляет.
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: Аи турели

Сообщение waruiyume 08 май 2011, 21:08

Спасибо! $-)
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Аи турели

Сообщение zoon 08 май 2011, 21:46

waruiyume писал(а):Спасибо! $-)


Чем в этом разбираться (кстати, где и как вычисляется vPrediction? :) ) - достаньте себе книжку "Programming Game AI by Example"(http://www.amazon.com/Programming-Game- ... 1556220782) - там есть ответы на все ваши вопросы и даже более того.
Джаггер
Evo
Аватара пользователя
zoon
UNIт
 
Сообщения: 58
Зарегистрирован: 24 май 2010, 08:27

Re: Аи турели

Сообщение Paul Siberdt 08 май 2011, 23:19

Prediction, и даже более того, для вас вычисляется там же, то есть - в "Programming Game AI by Example" :D
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Пред.

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

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

Сейчас этот форум просматривают: Google [Bot] и гости: 2


cron