Intelligence artificielle voiture

Pour les scripts écrits en Javascript (UnityScript). :!: Obsolète :!:
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
mike_muse
Messages : 46
Inscription : 29 Mars 2015 17:07

Intelligence artificielle voiture

Message par mike_muse » 29 Mars 2015 17:16

Bonjour à tous,

voilà je viens à vous car j'ai un souci au niveau de mon code pour faire mon intelligence artificielle sur une voiture dans Unity 3D (version 4.3.2).

Voilà mon code dans un premier temps:

Code : Tout sélectionner


var PathPoint: Transform[];
var path: Transform[];
var speedIA: float = 50;
var CarIA: GameObject;
private var currentPathPoint: int;

static var minutesIA: int;
static var secondesIA: int;
static var centiemeIA: int;

static var timeIA: float;
static var timeTour1IA: float;
static var timeTour2IA: float;

static var countTourIA: int;
var ActiveNombreTourIA: GameObject;

var departIA: boolean;

var wheelFR: WheelCollider;
var wheelFL: WheelCollider;
var wheelBR: WheelCollider;
var wheelBL: WheelCollider;

var wheelFRtrans: Transform;
var wheelFLtrans: Transform;
var wheelBRtrans: Transform;
var wheelBLtrans: Transform;

var maxSpeedForSteerAngle : float = 150.0;
var steerAngleAtMaxSpeed : float = 10.0;
var steerAngleAtLowSpeed : float = 25.0;

function Start()
{
    departIA = false;
    countTourIA = 0;
  	StartFollowPath();
}

function Awake()
{
    PathPoint[0] = transform;
}

function Update()
{
    IAdepart();
    RegardIa();
}

function OnTriggerEnter(other: Collider)
{
    if(other.gameObject.tag == "NombreTourIA")
    {
        countTourIA++;
        other.gameObject.SetActive(false);
        
        if(countTourIA == 2)
        {
            timeTour1IA = timeIA;
        }
        
        if(countTourIA == 3)
        {
            timeTour2IA = timeIA - timeTour1IA;
        }
    }
    
    if(other.gameObject.tag == "ActiveNombreTourIA")
    {
        ActiveNombreTourIA.gameObject.SetActive(true);
    }
}

function IAdepart()
{
    if(CarController.depart == true)
    {
        departIA = true;
    }
    if(departIA)
    {
        // timer IA
        speedIA = 50f;
        
        timeIA = timeIA + 1 * Time.deltaTime;
        minutesIA = timeIA / 60;
        secondesIA = timeIA % 60;
        centiemeIA = (timeIA*100)%100;
        
        //vitesse voiture IA en fonction de la difficulté.
        
        /*if(NiveauxDifficulte.difficulty == 1)
         {
         speedIA = 18;
         }
         else if(NiveauxDifficulte.difficulty == 2)
         {
         speedIA = 20;
         }
         else if(NiveauxDifficulte.difficulty == 3)
         {
         speedIA = 22;
         }*/
	}
    if(!departIA)
    {
       	speedIA = 0f;
    }
}
    
function RegardIa()
{
    // mouvement roues
    
    var zone: Vector3 = PathPoint[currentPathPoint].position;
    var velocity = rigidbody.velocity;
	
    wheelFLtrans.Rotate(wheelFL.rpm/60*360*Time.deltaTime, 0, 0);
    wheelFRtrans.Rotate(wheelFR.rpm/60*360*Time.deltaTime, 0, 0);
    wheelBLtrans.Rotate(wheelBL.rpm/60*360*Time.deltaTime, 0, 0);
    wheelBRtrans.Rotate(wheelBR.rpm/60*360*Time.deltaTime, 0, 0); 
    
    wheelFRtrans.localEulerAngles.y = wheelFR.steerAngle - wheelFRtrans.localEulerAngles.z;
    wheelFLtrans.localEulerAngles.y = wheelFL.steerAngle - wheelFLtrans.localEulerAngles.z;
    
    //wheelFR.steerAngle = currentSteerAngle;
    //wheelFL.steerAngle = currentSteerAngle;
    
    var speedFactor = rigidbody.velocity.magnitude/maxSpeedForSteerAngle;
    var currentSteerAngle = Mathf.Lerp(steerAngleAtLowSpeed, steerAngleAtMaxSpeed, speedFactor);
    
    if(currentPathPoint < PathPoint.length)
    {
        // deplacement voiture
        
        if((zone - transform.position).magnitude < 1)
        {
            currentPathPoint++;
        }
    }
    else
    {
        if(1)
        {
            currentPathPoint = 0;
        }
        else
        {
            velocity = Vector3.zero;
        }
    }
    
    rigidbody.velocity = velocity;
    transform.LookAt(zone);
}




function StartFollowPath() 
{
    var ht : Hashtable = Hashtable(); 
	ht.Add("path", path); 
	ht.Add("easetype", "linear"); 
	ht.Add("speed", speedIA); 
	iTween.LookTo(CarIA, path, 2);
    iTween.MoveTo(gameObject, ht);
}
Le souci est que ma voiture ne regarde pas le prochain point de passage, elle regarde au loin quelquechose que je ne sais meme pas ce que c'est.
Il me met une erreur pour mon LookTo que je ne comprend pas. Il me dit qu'il me faut une propriété looktarget mais meme avec la doc je ne comprend pas.
Grace a ma fonction RegardIA(), ma voiture regarde le prochain point mais elle tourne un peu trop brutalement.

Avez vous une solution? merci beaucoup. En esperant que ma question est compréhensible.

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: Intelligence artificielle voiture

Message par Alesk » 29 Mars 2015 18:04

Au lieu de faire regarder en direction du prochain point (qui est toujours fixe) fais regarder vers un point calculé dynamiquement en avant sur ton chemin, et qui avance en même temps que ta voiture.

mike_muse
Messages : 46
Inscription : 29 Mars 2015 17:07

Re: Intelligence artificielle voiture

Message par mike_muse » 29 Mars 2015 18:05

Un empty attaché à ma voiture?

Merci pour ta réponse

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: Intelligence artificielle voiture

Message par Alesk » 29 Mars 2015 18:11

Non, surtout pas attaché à ta voiture !
Il doit être autonome, mais comme tu sais entre quels points se trouve déjà ta voiture, tu peux en déduire une position en avant sur le même chemin.
Et puis tu n'as même pas besoin d'un game object, tu as juste besoin de calculer une position sous la forme d'un Vector3.

mike_muse
Messages : 46
Inscription : 29 Mars 2015 17:07

Re: Intelligence artificielle voiture

Message par mike_muse » 29 Mars 2015 18:15

Donc si je comprend bien, je fais avancé de la meme maniere mon empty et je fais regarder ma voiture sur l'empty ?

désolé pour calculer une position je suis pas sur de savoir comment faire

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: Intelligence artificielle voiture

Message par Alesk » 29 Mars 2015 18:54

Le mieux est encore de te faire une fonction qui te permette de trouver la position sur ton chemin en fonction d'une distance par rapport au point de départ.
Pour chaque point du chemin, tu fais un array en parallèle qui va contenir la distance de ce point vis à vis du point de départ.
Avec ça, tu seras capable de déterminer la distance parcourue par ta voiture et donc aussi de déterminer une position plus loin en avant sur le chemin.

Connaissant les deux points entre lesquels se trouve actuellement ta voiture, tu récupère les distances qui y sont associées, et avec une simple interpolation tu retrouves la distance parcourue à la position actuelle de ta voiture.

Une fois que tu as cette distance, tu y ajoutes l'écart supplémentaire pour placer ton point à viser devant.
Avec cette nouvelle distance, tu fais une boucle sur tous les points du chemin (en partant de celui qui se trouve juste derrière la voiture, que tu connais déjà) et tu choppes le premier qui a une distance de parcours supérieure à celle de ton point à viser.
Et là, il ne te reste plus qu'à refaire une interpolation entre ce waypoint et celui qui le précède pour trouver la position 3D du point à viser.

Simple non ? :mrgreen:

mike_muse
Messages : 46
Inscription : 29 Mars 2015 17:07

Re: Intelligence artificielle voiture

Message par mike_muse » 29 Mars 2015 20:26

heu... je sais que j'ai un cerveau pas trop mauvais mais là... :shock:

ce que j'ai essayé:

Creation d'un empty devant la voiture avec suivi des points de passage.
Ma voiture regarde l'empty...

je dois etre bete je pense mais mon empty va bien plus vite que ma voiture. je met les deux code.

code de mon empty:

Code : Tout sélectionner

var path: Transform[];
var htObject : Hashtable = Hashtable();

function Start()
{
	FollowMarkersObject();
}

function FollowMarkersObject()
{
	htObject.Add("path", path); 
	htObject.Add("easetype", "linear"); 
	htObject.Add("speed", IA.speedIA); 
    iTween.MoveTo(gameObject, htObject);
}

Code : Tout sélectionner

var path: Transform[];
static var speedIA: float = 50;
var Objet: Transform;

var ht : Hashtable = Hashtable();

static var minutesIA: int;
static var secondesIA: int;
static var centiemeIA: int;

static var timeIA: float;
static var timeTour1IA: float;
static var timeTour2IA: float;

static var countTourIA: int;
var ActiveNombreTourIA: GameObject;

var departIA: boolean;

var wheelFR: WheelCollider;
var wheelFL: WheelCollider;
var wheelBR: WheelCollider;
var wheelBL: WheelCollider;

var wheelFRtrans: Transform;
var wheelFLtrans: Transform;
var wheelBRtrans: Transform;
var wheelBLtrans: Transform;

var maxSpeedForSteerAngle : float = 150.0;
var steerAngleAtMaxSpeed : float = 10.0;
var steerAngleAtLowSpeed : float = 25.0;

function Start()
{
    departIA = false;
    countTourIA = 0;
    StartFollowPath();
}

function Update()
{
    IAdepart();
    RegardIa();
}

function OnTriggerEnter(other: Collider)
{
    if(other.gameObject.tag == "NombreTourIA")
    {
        countTourIA++;
        other.gameObject.SetActive(false);
        
        if(countTourIA == 2)
        {
            timeTour1IA = timeIA;
        }
        
        if(countTourIA == 3)
        {
            timeTour2IA = timeIA - timeTour1IA;
        }
    }
    
    if(other.gameObject.tag == "ActiveNombreTourIA")
    {
        ActiveNombreTourIA.gameObject.SetActive(true);
    }
}

function IAdepart()
{
    if(CarController.depart == true)
    {
        departIA = true;
    }
    if(departIA)
    {
        speedIA = 50f;
        
        timeIA = timeIA + 1 * Time.deltaTime;
        minutesIA = timeIA / 60;
        secondesIA = timeIA % 60;
        centiemeIA = (timeIA*100)%100;    
    }

    if(!departIA)
    {
       	speedIA = 0f;
    }
}
    
function RegardIa()
{
    // mouvement roues
    
    wheelFLtrans.Rotate(wheelFL.rpm/60*360*Time.deltaTime, 0, 0);
    wheelFRtrans.Rotate(wheelFR.rpm/60*360*Time.deltaTime, 0, 0);
    wheelBLtrans.Rotate(wheelBL.rpm/60*360*Time.deltaTime, 0, 0);
    wheelBRtrans.Rotate(wheelBR.rpm/60*360*Time.deltaTime, 0, 0); 
    
    wheelFRtrans.localEulerAngles.y = wheelFR.steerAngle - wheelFRtrans.localEulerAngles.z;
    wheelFLtrans.localEulerAngles.y = wheelFL.steerAngle - wheelFLtrans.localEulerAngles.z;
       
    var speedFactor = rigidbody.velocity.magnitude/maxSpeedForSteerAngle;
    var currentSteerAngle = Mathf.Lerp(steerAngleAtLowSpeed, steerAngleAtMaxSpeed, speedFactor);

    transform.LookAt(Objet);
}

function StartFollowPath() 
{ 
	ht.Add("path", path); 
	ht.Add("easetype", "linear"); 
	ht.Add("speed", speedIA); 
        iTween.MoveTo(gameObject, ht);
}









Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: Intelligence artificielle voiture

Message par Alesk » 29 Mars 2015 20:32

Je n'avais pas fais gaffe que tu utilisais iTween pour gérer le déplacement (ce que je t'ai décrit c'est en gros le boulot que fait itween)

Dans ton cas il faut que l'empty bouge à la même vitesse que la voiture, mais qu'il parte quelques secondes avant elle, pour prendre de la distance.

mike_muse
Messages : 46
Inscription : 29 Mars 2015 17:07

Re: Intelligence artificielle voiture

Message par mike_muse » 29 Mars 2015 20:37

Oui c'est pour ca que j'ai placé mon empty juste devant ma voiture pour partir avant la voiture. Mais mon empty va plus vite que ma voiture. Pourtant j'ai mis la meme vitesse.

Autre petit souci, je souhaite bloqué la vitesse de la voiture au demarrage suivant un compte à rebours.

Sur ma propre voiture ca fonctionne parfaitement mais sur l'IA ca bug. Il me bloque la voiture au demarrage mais elle n'accelere pas quand le compte à rebours est fini.

tu as deja mon code de l'IA juste avant. Que faut il changer pour que ca fonctionne ?

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: Intelligence artificielle voiture

Message par Alesk » 29 Mars 2015 22:04

Pour le coup de l'empty qui va plus vite, à mon avis c'est lié au fait que ta voiture se déplace avec le rigid body (ce qui va entrainer de la friction et donc un ralentissement) alors que l'empty bouge sans contraintes.
C'est pour ça aussi qu'il vaut mieux placer l'empty par rapport à la position actuelle de la voiture, plutôt que de les laisser se balader tous les deux sur le même chemin sans autre lien. (et on en revient à ma proposition initiale)

Pour le coup du faux départ, ça semble lié à ta variable "CarController.depart", c'est là qu'il faut creuser à mon avis...

Verrouillé

Revenir vers « (Js) Javascript »