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

Re: Intelligence artificielle voiture

Message par mike_muse » 29 Mars 2015 23:07

Pour la vitesse de l'empty, visiblement cela semble réglé même si j'ai un doute que je vais réussir à modifier sa vitesse en fonction de la difficulté choisi mais je vais essayé quand même.

Avant j'utilisais un pathfinding pour mon IA mais depuis que j'utilise itween, la voiture IA ne tient plus compte du carcontroller.depart... pas très compréhensible mais je vais essayé de creuser.

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

Re: Intelligence artificielle voiture

Message par mike_muse » 30 Mars 2015 19:45

Bonjour à tous,

Voilà nouveau petit souci avec le code iTween, ma voiture ne veut pas faire un tour complet. Elle s'arrete au dernier point de passage de mon circuit et donc ne fait meme pas un tour complet.
Or voilà je souhaite faire 3 tours.

Merci à ceux qui aurait une idée.

Pour rappel voilà mon code IA:

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)
    {
        // timer IA
        speedIA = 50;
        
        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 = 0;
    }
}
    
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;
    
    //wheelFR.steerAngle = currentSteerAngle;
    //wheelFL.steerAngle = currentSteerAngle;
    
    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 » 30 Mars 2015 20:44

Franchement, à ta place, je n'utiliserais pas iTween ;)
Je doute que ça soit assez souple pour s'adapter précisément à ce que tu veux faire.
Tu aurais un bien meilleur contrôle en gérant toi-même les interpolations le long du chemin.

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

Re: Intelligence artificielle voiture

Message par mike_muse » 31 Mars 2015 11:21

je sais bien mais je ne sais pas faire ça.

J'ai pensé à créer un nouveau path[] lorque que ma voiture touche le collider du dernier point de passage.

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

Re: Intelligence artificielle voiture

Message par Alesk » 31 Mars 2015 14:55

C'est justement parce que tu ne sais pas faire que c'est intéressant ! Surtout que ce genre de chose est relativement simple, et te seras utile à l'avenir ;)
Créer un nouveau path ne changera rien à ton problème de gestion de la vitesse, et puis c'est "cracra" comme méthode. :mrgreen:

Essaye de pondre un truc avec les directives que je t'ai données dans mon message précédent, pour voir.

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

Re: Intelligence artificielle voiture

Message par mike_muse » 03 Avr 2015 16:44

Oui je comprend mais le souci aussi c'est que je comprend pas bien le principe en fait.

Et je n'arrive toujours pas a faire faire plusieurs tours a ma voiture IA.

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

Re: Intelligence artificielle voiture

Message par Alesk » 03 Avr 2015 19:26

Ok, je vais essayer de te rédiger une procédure un peu plus claire... mais demain ;)

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

Re: Intelligence artificielle voiture

Message par mike_muse » 03 Avr 2015 20:26

C'est gentil merci.

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

Re: Intelligence artificielle voiture

Message par Alesk » 04 Avr 2015 13:19

Yop !

Donc voici comment faire pour connaître une position à un point donné sur le chemin en fonction de la distance parcourue :

Il faut faire une boucle sur tous les waypoints et accumuler la distance qui les sépare jusqu'à dépasser la distance parcourue.
Là tu sais entre quels waypoints tu te trouves. Il ne reste plus qu'à interpoler entre ces deux point pour trouver la position exacte.
Pour trouver le ratio d'interpolation entre les deux waypoints, il suffit de soustraire la distance parcourue jusqu'au premier point à la distance recherchée, puis de diviser par la distance entre les deux waypoints.

à partir de là tu pourras facilement trouver n'importe quelle position sur le chemin en fonction de la distance parcourue.
Voici un exemple :

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class followpath : MonoBehaviour {

	public Transform[] waypoints;
	public float speed = 1;
	public float lookAhead = 2;

	private float totalDistance = 0f;

	private Transform _transform;

	private float moveDistance = 0f;


	void Start () {
		_transform = this.transform;
		_transform.position = waypoints[0].position;
		ComputeTotalDistance();
	}
	

	void Update () {

		// accumulation de la distance parcourue
		moveDistance += speed * Time.deltaTime;

		// positionnement à cette distance
		_transform.position = GetPositionAtDistance(moveDistance);

		// orientation à la distance parcourue plus décalage en avant
		Vector3 lookAtPosition = GetPositionAtDistance(moveDistance+lookAhead);
		_transform.LookAt(lookAtPosition);

		Debug.DrawLine(_transform.position+Vector3.up * 0.1f,lookAtPosition+Vector3.up * 0.1f,Color.green);
	}


	// donne la position correspondant à une distance parcourue sur le chemin
	public Vector3 GetPositionAtDistance(float d){

		float accumulation = 0;
		float ecart = 0;
		int count = waypoints.Length;
		Vector3 position = waypoints[0].position;

		if(totalDistance == 0) ComputeTotalDistance();

		// récupération de la distance parcourue sur l'équivalent d'un seul tour afin de limiter à une seul boucle si jamais plusieurs tours ont été effectués
		d = d % totalDistance;

		// recherche des waypoints encadrants cette distance
		for(int i = 0;i < count;i++){

			int j = (i+1) % count;
			ecart = Vector3.Distance (waypoints[i].position , waypoints[j].position);

			if(accumulation + ecart > d){

				float ratio = (d - accumulation) / ecart;

				position = Vector3.Lerp(waypoints[i].position,waypoints[j].position,ratio);
				break;
			}

			accumulation += ecart;
		}

		return position;
	}

	void ComputeTotalDistance(){
		totalDistance = 0;
		int count = waypoints.Length;
		for(int i = 0;i < count;i++){
			int j = (i+1) % count;
			totalDistance += Vector3.Distance (waypoints[i].position , waypoints[j].position);
		}

	}
	
	void OnDrawGizmos(){
		
		if(waypoints != null){
			int i,j = 0;
			int count = waypoints.Length;
			for(i=0;i<count;i++){
				j = (i+1) % count;
				Gizmos.DrawLine(waypoints[i].position,waypoints[j].position);
			}
		}
		
	}
}

Ici ça suivra parfaitement le chemin tout en orientant progressivement l'objet.

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

Re: Intelligence artificielle voiture

Message par mike_muse » 04 Avr 2015 18:17

merci j'ai essayé ton programme en adaptant en js. Mais il ne s'oriente pas du tout. Je vais voir pourquoi. En attendant je ne comprend pas un truc.

J'ai mon empty et ma voiture qui sont a la meme vitesse, j'ai mis mon empty devant ma voiture assez eloigné mais mon empty au demarrage de ma course ralenti pour attendre la voiture et cela provoque bien sur un bug dans l'orientation de ma voiture. Je ne comprend pas pourquoi.

Verrouillé

Revenir vers « (Js) Javascript »