Intelligence artificielle voiture
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
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
Re: Intelligence artificielle voiture
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.
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.
Re: Intelligence artificielle voiture
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:
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);
}
Re: Intelligence artificielle voiture
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.
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.
Re: Intelligence artificielle voiture
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.
J'ai pensé à créer un nouveau path[] lorque que ma voiture touche le collider du dernier point de passage.
Re: Intelligence artificielle voiture
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.
Essaye de pondre un truc avec les directives que je t'ai données dans mon message précédent, pour voir.
Créer un nouveau path ne changera rien à ton problème de gestion de la vitesse, et puis c'est "cracra" comme méthode.
Essaye de pondre un truc avec les directives que je t'ai données dans mon message précédent, pour voir.
Re: Intelligence artificielle voiture
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.
Et je n'arrive toujours pas a faire faire plusieurs tours a ma voiture IA.
Re: Intelligence artificielle voiture
Ok, je vais essayer de te rédiger une procédure un peu plus claire... mais demain
Re: Intelligence artificielle voiture
C'est gentil merci.
Re: Intelligence artificielle voiture
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 :
Ici ça suivra parfaitement le chemin tout en orientant progressivement l'objet.
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);
}
}
}
}
Re: Intelligence artificielle voiture
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.
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.