[MY-AL] Vitesse réelle pour véhicules

Pour les scripts écrits en C#
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
Avatar de l’utilisateur
freepl
Messages : 942
Inscription : 20 Mai 2012 19:33
Localisation : salon de provence

[MY-AL] Vitesse réelle pour véhicules

Message par freepl » 17 Déc 2020 12:45

Bonjour

Pour rappel je fais des maquettes routières.
Je veux donc que des vl roulent le long d'un path en leur assignant une vitesse et que celle-ci soit réelle dans le projet

Dans mon script j'utilise cette formule .Le tabList ici correspond à 362 positions le long du path. Ces positions sont espacées de 5 m
(tabtList.Length * mEntrePoint)/(kmhActuel / 3.6f);
La formule devient donc
(362*5)/(130/3.6), ce qui fait une distance de 1 810 m parcourue à 130 km/h en 50 sec.

En chronométrant dans le projet, le temps mis est de 56 secondes.
Est-il possible d'être plus "réaliste" ?
Merci

code complet

Code : Tout sélectionner

using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;


public class TrajetVl : MonoBehaviour {
	public GameObject target_Path;
	public float kmh; // vitesse voulue
	public float kmhActuel; // vitesse reelle
	public float mEntrePoint = 5.0f;
	private float time;
	public float fraction;
	public Transform[] tabtList = new Transform[11];
	public int minTab = 0;
	public Transform detecteur;
	public LayerMask layerPanneau;
	public Collider[] toucheDetecteur;
	public bool coupeDetecteur;
	private Light jourNuit;
	private GameObject eclairage;
	private GameObject eclairageFreins;
	public GameObject clignotantsDroits;
	public GameObject clignotantsGauche;
	private IEnumerator coroutineClignotants;
	
	public InterieurVl interieur;
	
	public void DemrageVl () {
		tabtList = new Transform[11];
		TabDynamique ();
		if (transform.FindChild("Detecteur"))
			detecteur = transform.FindChild("Detecteur").transform;
		
		jourNuit = GameObject.Find("Sky Dome").transform.FindChild("Light").GetComponent<Light>();
		
		//cherche dans ces enfants un object avec le nom Eclairage
		//si existe alors on ajoute l'object portant le nom "Eclairage" dans la variable eclairage
		if (this.transform.FindChild ("Eclairage")) {
			eclairage = this.transform.FindChild ("Eclairage").gameObject;
		}
		
		if (this.transform.FindChild ("Eclairage_Freins")) {
			eclairageFreins = this.transform.FindChild ("Eclairage_Freins").gameObject;
			eclairageFreins.SetActive (false);
		}
		
		if (this.transform.FindChild ("Eclairage_Clignotants_droits")) {
			clignotantsDroits = this.transform.FindChild ("Eclairage_Clignotants_droits").gameObject;
			clignotantsDroits.SetActive (false);
		}
		
		if (this.transform.FindChild ("Eclairage_Clignotants_gauche")) {
			clignotantsGauche = this.transform.FindChild ("Eclairage_Clignotants_gauche").gameObject;
			clignotantsGauche.SetActive (false);
		}
		
		StartCoroutine("WalkThePath");
	}
	
	public void TabDynamique () {
		fraction = 0.1f;
		int count = 0;
		
		for (int i = 0; i < 11; i++) {
			if (minTab+i < target_Path.transform.childCount) {
				tabtList[i] = target_Path.transform.GetChild(minTab+i);
				count++;
			}
		}
		
		if (minTab+8 < target_Path.transform.childCount)
			minTab += 8;
		else
			minTab += count;
	}
	
	public void StopCoroutine () {
		StopCoroutine("WalkThePath");
	}
	
	IEnumerator WalkThePath () {
		while(true){
			time = (tabtList.Length * mEntrePoint)/(kmhActuel / 3.6f);//   (kmhActuel / 3.6f)   avec 3.6f le temps réel est doublé 

			transform.position = iTween.PointOnPath (tabtList, fraction);
			fraction += Time.deltaTime / time;
			if (fraction > 1.0f)
				fraction = 0.0f;
			
			/* modif pour vehicule ou personnage*/
			
			
			if (gameObject.tag == "VEHICULE")
			{
				transform.LookAt(iTween.PointOnPath(tabtList, fraction + 0.05f)); 
			}
			else 
			{
				Vector3 direction =iTween.PointOnPath(tabtList, fraction + 0.05f);
				direction.y = this.transform.position.y;
				transform.LookAt(direction);
			}
			
			
			
			
			
			if (kmhActuel < kmh){
				kmhActuel += 0.7f;// acceleration jusqu'à la vitesse kmh 0.7f
			} else if (kmhActuel > kmh && kmh != 0) {
				kmhActuel -= 0.9f;// decceleration douce 0.9
			} else if (kmh == 0) {
				kmhActuel = 0;// on stoppe brutalement le VL
			}
			
			if (fraction >= 0.9f) //0.9f
				TabDynamique();
			
			GestionDetecteur ();
			GestionLumiere ();
			GestionFreins ();
			
			yield return null;
		}
	}
	
	void GestionDetecteur () {
		if (detecteur != null) {
			if (gameObject.tag == "VEHICULE")
				toucheDetecteur = Physics.OverlapSphere(detecteur.position, 0.75f, layerPanneau);
			else
				toucheDetecteur = Physics.OverlapSphere(detecteur.position, 0.5f, layerPanneau);
			
			if (toucheDetecteur.Length != 0) {
				foreach (var other in toucheDetecteur) {
					if (other.tag == "CoupeDetecteur") {
						coupeDetecteur = other.GetComponent<CoupeDetecteur>().detecteur;
						kmhActuel = 50.0f;// pour degager les croisements
					}
					
					if (other.tag == "CoupeDetecteurAutre") {
						coupeDetecteur = other.GetComponent<CoupeDetecteur>().detecteur;
						kmhActuel = 4.0f;
					}
					
					if (coupeDetecteur == false) {
						if (other.tag == "ModifVitesse") {
							kmh = other.GetComponent<Panneau>().vitesse;
							
							
						} else if (other.tag == "EntreeInstersection") {
							kmh = other.GetComponent<Priorite>().vitesse;
						} else if (other.tag == "VEHICULE") {
							
							if (kmh > other.GetComponent<TrajetVl>().kmh)
								kmh = other.GetComponent<TrajetVl>().kmh;
						} else if (other.tag == "ClignotantsOn") {
							kmh = other.GetComponent<GestionClignotants>().vitesse;
							if (other.GetComponent<GestionClignotants>().trajet == target_Path) {
								ClignotantsOff ();
								if (other.GetComponent<GestionClignotants>().enumClignotants == EnumClignotants.Droites) {
									coroutineClignotants = ClignotantsDroits();
									StartCoroutine (coroutineClignotants);
								} else {
									coroutineClignotants = ClignotantsGauche();
									StartCoroutine (coroutineClignotants);
								}
							}
						} else if (other.tag == "ClignotantsOff") {
							kmh = other.GetComponent<GestionClignotants>().vitesse;
							ClignotantsOff ();
						}
					}
				}
			}
			
			if (kmhActuel == 0 && toucheDetecteur.Length == 0)
				kmhActuel = 30.0f;
			
		}
	}
	
	void GestionLumiere () {
		if (eclairage != null) {
			if (jourNuit.intensity < 0.15f) {
				if (eclairage.activeInHierarchy == false)
					eclairage.SetActive (true);
			}
			else {
				if (eclairage.activeInHierarchy == true)
					eclairage.SetActive (false);
			}
		}
	}
	
	void GestionFreins () {
		if (eclairageFreins != null){
			if (kmhActuel > kmh+3 || kmhActuel == 0) {
				if (eclairageFreins.activeInHierarchy == false)
					eclairageFreins.SetActive (true);
			} else {
				if (eclairageFreins.activeInHierarchy == true)
					eclairageFreins.SetActive (false);
			}
		}
	}
	
	IEnumerator ClignotantsDroits () {
		if (clignotantsDroits != null) {
			while (true) {
				clignotantsDroits.SetActive (true);
				yield return new WaitForSeconds (0.3f);
				clignotantsDroits.SetActive (false);
				yield return new WaitForSeconds (0.3f);
			}
		}
	}
	
	IEnumerator ClignotantsGauche () {
		if (clignotantsGauche != null) {
			while (true) {
				clignotantsGauche.SetActive (true);
				yield return new WaitForSeconds (0.3f);
				clignotantsGauche.SetActive (false);
				yield return new WaitForSeconds (0.3f);
			}
		}
	}
	
	void ClignotantsOff () {
		if (coroutineClignotants != null) {
			StopCoroutine (coroutineClignotants);
			
			if (clignotantsDroits != null)
				clignotantsDroits.SetActive (false);
			if (clignotantsGauche != null)
				clignotantsGauche.SetActive (false);
			
			coroutineClignotants = null;
		}
	}
	
}

Avatar de l’utilisateur
DevAmat
Messages : 360
Inscription : 23 Nov 2016 11:50

Re: [MY-AL] Vitesse réelle pour véhicules

Message par DevAmat » 17 Déc 2020 16:55

Bonjour,

Si je comprends bien, tu calcules la distance entre chaque points, mais lorsque tu parcours tes points tu fais une interpolation entre chaque points pour adoucir la trajectoire, c'est ça?

Avatar de l’utilisateur
freepl
Messages : 942
Inscription : 20 Mai 2012 19:33
Localisation : salon de provence

Re: [MY-AL] Vitesse réelle pour véhicules

Message par freepl » 17 Déc 2020 17:03

Oui.
La trajectoire est ainsi plus fluide.
Le script est basé sur ITWEEN.

Je cherche à avoir le temps de parcours le plus réel possible.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 5542
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: [MY-AL] Vitesse réelle pour véhicules

Message par boubouk50 » 17 Déc 2020 17:10

vitesse = distance / temps
donc en fixant le temps et la distance, tu peux déterminer la vitesse moyenne pour atteindre l'objectif dans le temps imparti.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
DevAmat
Messages : 360
Inscription : 23 Nov 2016 11:50

Re: [MY-AL] Vitesse réelle pour véhicules

Message par DevAmat » 17 Déc 2020 17:19

Dans ces conditions, la solution de boubouk50 est adaptée. Mais cela sera à recalculer à chaque fois que tu modifies le parcours.

Avatar de l’utilisateur
freepl
Messages : 942
Inscription : 20 Mai 2012 19:33
Localisation : salon de provence

Re: [MY-AL] Vitesse réelle pour véhicules

Message par freepl » 17 Déc 2020 17:45

La distance est donnée par le tableau*5m et la vitesse est entrée " manuellement".
Le temps de parcours calculé n'est pas réel. J'ai un écart.
Ma formule mathématique est juste mais c'est le temps de parcours du vl dans l'exécutable ne l'est pas

Edit:
du coup j'ai modifié à la mano le temps en lui ajoutant un coefficient.
Les commentaires donnent les temps théoriques et les temps relevés avec la formule de base et enfin les temps réels obtenus après application du coeff de 0.91.

Code : Tout sélectionner

time = ((tabtList.Length * mEntrePoint)/(kmhActuel / 3.6f)*0.91f);//   original (tabtList.Length * mEntrePoint)/(kmhActuel / 3.6f)   
			/*
			scene 2x2
			362 x 5m = 1 810m 
				130 kmh/h fait 36.1111 mn/s        donc   1 810m à 130km/h  fait  50 sec / 55 sec réelles donc x0.91 pour avoir 50 sec
				110 kmh/h fait 30.5555 mn/s        donc   1 810m à 110km/h  fait  59 sec / 64 sec réelles donc x0.91 pour avoir 59 sec


             scene bi-di
             305 x 5m = 1 525m 
				90 kmh/h fait 25     mn/s        donc   1 525m à 90km/h  fait  61 sec /  66 sec réelles donc x0.91 pour avoir 60 sec
				50 kmh/h fait 13.888 mn/s        donc   1 525m à 50km/h  fait  110 sec/ 117 sec réelles donc x0.91 pour avoir 107 sec

			 */

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 5542
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: [MY-AL] Vitesse réelle pour véhicules

Message par boubouk50 » 18 Déc 2020 09:31

C'est vrai si ta vitesse est constante du début à la fin, mais ce n'est pas le cas puisque tu as une accélération au départ et une décélération à la fin, si j'ai bien compris.

Code : Tout sélectionner

if (kmhActuel < kmh){
				kmhActuel += 0.7f;// acceleration jusqu'à la vitesse kmh 0.7f
			} else if (kmhActuel > kmh && kmh != 0) {
				kmhActuel -= 0.9f;// decceleration douce 0.9
			} else if (kmh == 0) {
				kmhActuel = 0;// on stoppe brutalement le VL
			}
Quand kmhActuel est inférieur à la vitesse voulue, alors time est plus grand (car division par kmhActuel) donc la fraction est plus faible (car division avec time) donc le temps mis est plus long.

Donc soit ta formule est juste (mais ce n'est pas celle que tu crois faire) et tu as le bon temps, soit ta formule est fausse (par rapport à ce que tu veux) et tu penses avoir un mauvais résultat.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
freepl
Messages : 942
Inscription : 20 Mai 2012 19:33
Localisation : salon de provence

Re: [MY-AL] Vitesse réelle pour véhicules

Message par freepl » 18 Déc 2020 10:32

cette accélération/déccélération intervient quand le vl touche un panneau/trigger qui modifie sa vitesse.
Le vl roule à 110, si panneau trigger à 90, alors ralenti
si panneau trigger à 130, accélère
ScreenShot010.jpg
ScreenShot010.jpg (161.72 Kio) Consulté 281 fois
Mais je pensais que le vl partait DIRECTEMENT à la vitesse donnée

Avatar de l’utilisateur
DevAmat
Messages : 360
Inscription : 23 Nov 2016 11:50

Re: [MY-AL] Vitesse réelle pour véhicules

Message par DevAmat » 18 Déc 2020 10:55

Il y a une chose que tu peux faire.
- Tu crées un script qui calcule la vitesse réelle de ta voiture.
Je te mets un exemple de "speedometer":

Code : Tout sélectionner

public class Speedometer : MonoBehaviour
    {
        public Transform TransformComponent = null;

        private double speed;
        private Vector3 startingPosition;
        private Vector3 speedvector;

        void Start()
        {
            if (!TransformComponent)
                TransformComponent = transform;

            startingPosition = transform.position;
        }

        void LateUpdate()
        {
            speedvector = ((transform.position - startingPosition) / Time.deltaTime);
            speed = (speedvector.magnitude) * 3.6; // 3.6 is the constant to convert a value from m/s to km/h, because i think that the speed wich is being calculated here is coming in m/s, if you want it in mph, you should use ~2,2374 instead of 3.6 (assuming that 1 mph = 1.609 kmh)

            startingPosition = transform.position;
        }

        void OnGUI()
        {
            Debug.Log(speed);
            GUI.color = Color.yellow;
            GUI.skin.label.fontSize = 20;
            GUI.skin.button.fontSize = 20;

            GUI.Label(new Rect(0, 0, 200, 40), string.Format("{0:0.00}km", speed));
        }
    }
- tu donnes ta vitesse théorique (le plus facile est qu'elle reste constante au début) et tu regardes ta vitesse réelle grâce au script.
- Ensuite tu fais le ratio entre ta vitesse théorique et la vitesse réelle.
vitesse théorique/vitesse réelle.
- Cela te donne une variable référence donc:
variableDeReference * vitesse théorique = vitesseRéelle de ton objet

Avatar de l’utilisateur
freepl
Messages : 942
Inscription : 20 Mai 2012 19:33
Localisation : salon de provence

Re: [MY-AL] Vitesse réelle pour véhicules

Message par freepl » 18 Déc 2020 11:44

Je teste plus tard et je reviens vers vous.
Merci de ton aide

Répondre

Revenir vers « (C#) CSharp »