{DB-AL} Roulis d un avion

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
djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: {DB-AL} Roulis d un avion

Message par djulio74 » 08 Oct 2018 09:11

Voilà, en essayant au mieux de rester dans ton approche, j'ai tenté de modifier/corriger en expliquant les changement :

Code : Tout sélectionner

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

public class FlyControler2 : MonoBehaviour {

    public float thrust; 			// position manche de gaz//
    public Rigidbody rb;			// rigidBody de l'avion //
    private float portanceAiles;	// portance//
    public float x; 				// Coefficiant de portance des ailes
    public float torque;			// torque longitudinal => roulis de l'avion//
	public float pitch;				// torque latéral => cabrage de l'avion//
	public float speed;				// vitesse de l'avion - world repère//
	public float RelativeSpeed; 	// vitesse de l'avion - local repere//

    void Start () {
		
		// recupération du component Rigidbody de l'avion//
        rb = GetComponent<Rigidbody>();
		
		// assigne la masse de l'avion //
		// !!!! la masse doit etre cohérente, elle est en klogramme !!!! //
        rb.mass = 1.0f;
		
		// assigne une pseudo resistance a l'air pour la position//
        rb.drag = 1.0f;
		
		// assigne une psudo resistance a l'air pour la rotation//
        rb.angularDrag = 2.0f;

	}
	

	void Update () {
		
		
		Vector3 speedV3 = rb.velocity;	// => vecteur vitesse de l'avion ( world coordonnées) //		
		speed = speedV3.magnitude * 3.6f; // => vitesse de l'avion en km/h  => 1m/s = 3.6 km/h (world Coordonnée)//
		
		
		Vector3 RelativeSpeedV3 = Vector3.Project(rb.velocity, transform.forward); // vitesse de l'avion dans l'axe forward de l'avion//
		RelativeSpeed = RelativeSpeedV3.magnitude*3.6f; // vitesse de l'avion en km/h ( local coordonées), celle relevée par la sonde Pitot par exemple //
		
		// affichage de speedV3 et RelativeSpeedV3 en debug ( pense a activer "Gizmos" en haut a droite de la fenetre Game) //
			Debug.DrawRay( transform.position, speedV3/50.0f , Color.blue);  		// Debug/trace une ligne bleue pour représenter speedV3 //
			Debug.DrawRay( transform.position, RelativeSpeedV3/50.0f, Color.red); 	// Debug/trace une ligne rouge pour représenter RelativeSpeedV3 //
		
		
	// ======= TORQUE => prise de roulis de l'avion ======= //
		
		// principalement du a l'action des volets sur les ailes.
		// il est évident que si l'avion n'avance pas ( RelativeSpeed = 0), l'actionnement des volet n'as aucun effet
		// donc Torque dépend de la vitesse relative de l'avion (Relative Speed)//
		
		float SpeedSpeed = RelativeSpeed*RelativeSpeed; // on stock le carré de la vitesse, ça nous servira plusieurs fois//		
        torque = -Input.GetAxis("Horizontal") * 0.0005f * SpeedSpeed; // définition de torque
       
		
		// ==== PITCH => prise d'angle de l'avion (cabrage) ==== // 
		// principalement du a l'action des volets sur la queue de l'avion.
		// tout comme Torque, si RelativeSpeed = 0, les volet n'ont aucun effet sur l'avion
		// donc Pitch dépend aussi de la vitesse relative de l'avion (Relative Speed)//
        pitch = Input.GetAxis("Vertical") * 0.0005f * SpeedSpeed; // définition de pitch
        
		
	// ======= PORTANCE  ======= //
		// la portance est provoqué par la différence de pression au dessus et au dessous de l'aile//
		// l'aile bombé sur le haut provoque l'accélération de l'air au dessus de celle -ci//
		// ce qui crée une dépression au dessu de l'aile, elle est "aspirée" vers le haut//
		// Donc tout comme torque et pitch, fonction du carré de la vitesse (SpeedSpeed)//		
        portanceAiles = SpeedSpeed * x ;
		
		
	// ====== THROTTLE ====== //
		// manette des gaz //
		// ton raisonnement est bon, mais les "palier" sont trop espacé. tu as 0%, 20%, 40%, 60%, 80%, 100%
		// mais rien entre les deux, c'est pas assez progressif
		// Donc au lieu de GetButtonDown (=true seulement a la fame ou tu presse le bouton
		// utilise GetButton (=true a chaque frame ou le bouton est enfoncé	
		
		// on est dans une void Update, qui signifie qu'elle s'execute a chaque frame.
		// si ton jeux tourne a 30 FPS, Void Update s'execute 30 x par seconde, s'il tourne a 1000 FPS, 1000x par seconde.
		// par exemple  thrust = thrust + 1.0f :
		//			=> a 30 FPS : thruste passe de 0 a 30 en une seconde ( on a ajouté 30 x 1.0f en une seconde 	
		//			=> a 1000 FPS : thruste passe de 0 a 1000 en une seconde ( on a ajouté 1000 x 1.0f en une seconde
		// pour que l'augmentation soit toujours la même, on utilise Time.deltaTime : 
		// donc  thrust = thrust + 1.0f * Time.deltaTime :
		// 			=> a 30 FPS ou 1000 FPS, thrust passera toujours de 0 à 1 en une seconde, quelque soit le framerate/
	

		if (Input.GetButtonDown("throttle+")) {  	// => tant qu'on appuye sur la commande, on augmente thrust//
                thrust += 15.0f * Time.deltaTime; 	// identique a :  thrust = thrust + 15.0f * Time.deltaTime;
													// si on appuye pendant 1s sur throttle+, on aura ajouté 15 a thrust
				Debug.Log("thrust : " + thrust); 	// on debug la valeur de throttle uniquement lorque l'on change celle-ci//
        }
		if (Input.GetButtonDown("throttle-")) {  	// => tant qu'on appuye sur la commande, on augmente thrust//
                thrust -= 15.0f * Time.deltaTime; 	// identique a :  thrust = thrust - 15.0f * Time.deltaTime;			
				Debug.Log("thrust : " + thrust); 	// on debug la valeur de throttle uniquement lorque l'on change celle-ci//
        }		
		
		thrust = Mathf.Clamp(thrust ,0.0f, 100.0f);	// on limite la valeur de thrust pour la forcer à rester entre 0.0 et 100.0		
		
	// ===== TON PRECEDENT CODE ===== //
		//if (thrust < 101)
		//{
		//if (Input.GetButtonDown("throttle+"))
		//    {
		//        thrust = thrust + 20.0f;
		//		Debug.Log("thrust : " + thrust);
		//    }
		//}

		//if (thrust > 1)
		//{
		//	if (Input.GetButtonDown("throttle-"))

		//		thrust = thrust - 20.0f;
		//		Debug.Log("thrust : " + thrust);
		//	}
		//}		
		
	// ====== APPLICATION DES FORCES et TORQUE ====== //
		// thrust s'applique le long de l'axe Forward de l'avion//
		// portanceAiles s'applique sur l'axe Up de l'avion//
		// on peut donc combiner ces forces :
		
		Vector3 ForceTotal = (transform.forward * thrust *100.0f ) + (transform.up * portanceAiles);		
		
		// torque est un couple autour de l'axe forward de l'avion
		// pitch est un couple le long de l'axe right de l'avion
		// on peut donc combiner ces couple : 
		
		Vector3 TorqueTotal = (transform.forward * torque) + (transform.right  * pitch);
		
		// on peut donc appliquer tout ça au rigidBody.
		// le fait d'avoir combiner les forces est pour l'optimisation, donc pas obligtoire
		// mais il est mieux d'appliquer une fois un rigidbody.AddForce plutot que 10x 10 forces différentes.
		// Encore une fois on utilise Time.deltaTime, pour la même raison que avant. pour palier aux différence de frameRate.		
		
		rb.AddForce( ForceTotal*Time.deltaTime);
		rb.AddTorque( TorqueTotal*Time.deltaTime);
		
		// ces deux lignes au dessus remplacent donc les 4 de ton précédent code :
		//rb.AddForce(transform.forward * thrust * 10.0f);  // En avant
        //rb.AddForce(transform.up * portanceAiles);        // vers le haut
		//rb.AddTorque(transform.forward * torque);
		//rb.AddTorque(transform.right  * pitch);

    }
}
Si t'as des questions sur ce que j'ai modifié, hésite pas a me demander. ;-)
Ton code est fonctionnel ( même avant mes retouche), mais d’après ton autre sujet ( d'ailleurs tu devrait tout combiner tes demandes dans un seul poste pour plus de simplicité pour tout le monde), tu cherche a faire quelque chose de réaliste. Hors ici tu est dans une simulation de vol assez simplifiée, et c'est pas une critique faut bien commencer par quelque chose, je doute pas que tu va petit a petit améliorer tout ça. :super:
Ce que je te conseil pour bien avancer :
- définir des valeurs réelle : taille, poids..etc ( pas facile de simuler de la physique avec de l'a peu près)
- prend le temps de faire des recherche google sur les principe de vol des avions ( un sujet complexe et passionnant, ce ne sera pas une perte de temps c'est certains)
- fait quelques test avec unity sur le maniement des forces/torque/vecteur pour bien te familiariser ( "Help" => "Scripting Référence" est un grand allier)

Encore une fois si t'as des questions, il y aura toujours quelqu'un pour y répondre. ;-)

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

samuel.brunner
Messages : 92
Inscription : 28 Mars 2018 01:26
Localisation : Alpes - Suisse

Re: {DB-AL} Roulis d un avion

Message par samuel.brunner » 09 Oct 2018 18:34

Wow, c est le jour et la nuit

Avec mon code, l avion conservait sa vitesse, ce qui donnais l impression de glisser, comme dans l espace

Avec ton code, je peux faire un 180, sa reste réaliste, on a vraiment l impression de voler dans de l air

Je pensais qu il me manquait une force, qui résistait a l air quand on tourne, mais ce n était pas ça le problème, de plus l quand on tournait, l avion tombait sur le sol

J ai transformé ton code pour qu il ressemble au miens et toujours pas cet effet de flottement

Code : Tout sélectionner

 rb.AddForce(transform.forward * PuissanceUtilMoteur);
        rb.AddForce(transform.up * portanceAiles );
Bref, j ai passé l après midi a me casser la tete avec ce code avant de voir que tu avais posté, mais j ai aussi pus faire quelques recherches sur la physiques des avions

Image

T = Simplement la puissance des moteurs, que l on fait varier avec trottle, la manette des gaz
P = Masse de l avion, pas besoin de l ajouter car elle est gérer par le rigidbody
Rz = Portance de l aile, selon la masse volumetrique de l air, le coefficient de portance et la surface de l avion
Rx = Gerer par la fonction Drag du rigidbody, on pourra l augmenter selon l angle d incidence de l aile

J ai changé Input.GetButtonDown pour Input.GetButton, et quelque nom de variable, plus ajout de la masse, de la puissance réel des moteurs, du calcul de la portance


attention le nom du script est FlyControler4

Code : Tout sélectionner

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

public class FlyControler4 : MonoBehaviour
{
                                    // Credit : Merci djulio74 pour le code
    public float throttle; 			// position manche de gaz//
    public Rigidbody rb;			// rigidBody de l'avion //
    public float portanceAiles;	    // portance//
    public float PuissanceMaxMoteur = 49420.0f;   // Poussee des moteurs et N
    public float PuissanceUtilMoteur;  // Poussee des moteurs selon trottle
    public float torque;            // torque longitudinal => roulis de l'avion//
    public float pitch;             // torque latéral => cabrage de l'avion//
    public float speed;             // vitesse de l'avion - world repère//
    public float RelativeSpeed; 	// vitesse de l'avion - local repere//

    public float CoeffPortAiles = 0.3f; // Coefficiant de portance des ailes, o.3 pour un MIG
    public float MassVolAir = 1.225f; // Varie selon l altitude
    public float SurfaceAlaire = 38; // Surface des ailes (??) en m2
    public float IncidenceAiles; // angle de l aile par rapport au vent relatif

    void Start()
    {

        // recupération du component Rigidbody de l'avion//
        rb = GetComponent<Rigidbody>();

        // assigne la masse de l'avion //
        // !!!! la masse doit etre cohérente, elle est en klogramme !!!! //
        rb.mass = 10900f;

        // assigne une pseudo resistance a l'air pour la position//
        rb.drag = 1.0f;

        // assigne une psudo resistance a l'air pour la rotation//
        rb.angularDrag = 2.0f;

    }


    void Update()
    {


        Vector3 speedV3 = rb.velocity;  // => vecteur vitesse de l'avion ( world coordonnées) //		
        speed = speedV3.magnitude * 3.6f; // => vitesse de l'avion en km/h  => 1m/s = 3.6 km/h (world Coordonnée)//


        Vector3 RelativeSpeedV3 = Vector3.Project(rb.velocity, transform.forward); // vitesse de l'avion dans l'axe forward de l'avion//
        RelativeSpeed = RelativeSpeedV3.magnitude * 3.6f; // vitesse de l'avion en km/h ( local coordonées), celle relevée par la sonde Pitot par exemple //

        // affichage de speedV3 et RelativeSpeedV3 en debug ( pense a activer "Gizmos" en haut a droite de la fenetre Game) //
        Debug.DrawRay(transform.position, speedV3 / 50.0f, Color.blue);         // Debug/trace une ligne bleue pour représenter speedV3 //
        Debug.DrawRay(transform.position, RelativeSpeedV3 / 50.0f, Color.red);  // Debug/trace une ligne rouge pour représenter RelativeSpeedV3 //


        // ======= TORQUE => prise de roulis de l'avion ======= //

        // principalement du a l'action des volets sur les ailes.
        // il est évident que si l'avion n'avance pas ( RelativeSpeed = 0), l'actionnement des volet n'as aucun effet
        // donc Torque dépend de la vitesse relative de l'avion (Relative Speed)//

        float SpeedSpeed = RelativeSpeed * RelativeSpeed; // on stock le carré de la vitesse, ça nous servira plusieurs fois//		
        torque = -Input.GetAxis("Horizontal") * 0.1f * SpeedSpeed; // définition de torque


        // ==== PITCH => prise d'angle de l'avion (cabrage) ==== // 
        // principalement du a l'action des volets sur la queue de l'avion.
        // tout comme Torque, si RelativeSpeed = 0, les volet n'ont aucun effet sur l'avion
        // donc Pitch dépend aussi de la vitesse relative de l'avion (Relative Speed)//
        pitch = Input.GetAxis("Vertical") *0.1f * SpeedSpeed; // définition de pitch


        // ======= PORTANCE  ======= //
        // la portance est provoqué par la différence de pression au dessus et au dessous de l'aile//
        // l'aile bombé sur le haut provoque l'accélération de l'air au dessus de celle -ci//
        // ce qui crée une dépression au dessu de l'aile, elle est "aspirée" vers le haut//
        // Donc tout comme torque et pitch, fonction du carré de la vitesse (SpeedSpeed)//		
        
        portanceAiles = 0.5f * MassVolAir * CoeffPortAiles * SpeedSpeed * SurfaceAlaire ;

        // ====== THROTTLE ====== //
        // manette des gaz //
        // ton raisonnement est bon, mais les "palier" sont trop espacé. tu as 0%, 20%, 40%, 60%, 80%, 100%
        // mais rien entre les deux, c'est pas assez progressif
        // Donc au lieu de GetButtonDown (=true seulement a la fame ou tu presse le bouton
        // utilise GetButton (=true a chaque frame ou le bouton est enfoncé	

        // on est dans une void Update, qui signifie qu'elle s'execute a chaque frame.
        // si ton jeux tourne a 30 FPS, Void Update s'execute 30 x par seconde, s'il tourne a 1000 FPS, 1000x par seconde.
        // par exemple  thrust = thrust + 1.0f :
        //			=> a 30 FPS : thruste passe de 0 a 30 en une seconde ( on a ajouté 30 x 1.0f en une seconde 	
        //			=> a 1000 FPS : thruste passe de 0 a 1000 en une seconde ( on a ajouté 1000 x 1.0f en une seconde
        // pour que l'augmentation soit toujours la même, on utilise Time.deltaTime : 
        // donc  thrust = thrust + 1.0f * Time.deltaTime :
        // 			=> a 30 FPS ou 1000 FPS, thrust passera toujours de 0 à 1 en une seconde, quelque soit le framerate/


        if (Input.GetButton("throttle+"))
        {   // => tant qu'on appuye sur la commande, on augmente thrust//
            throttle += 15.0f * Time.deltaTime;   // identique a :  thrust = thrust + 15.0f * Time.deltaTime;
                                                // si on appuye pendant 1s sur throttle+, on aura ajouté 15 a thrust
            Debug.Log("thrust : " + throttle); 	// on debug la valeur de throttle uniquement lorque l'on change celle-ci//
        }
        if (Input.GetButton("throttle-"))
        {   // => tant qu'on appuye sur la commande, on augmente thrust//
            throttle -= 15.0f * Time.deltaTime;   // identique a :  thrust = thrust - 15.0f * Time.deltaTime;			
            Debug.Log("thrust : " + throttle); 	// on debug la valeur de throttle uniquement lorque l'on change celle-ci//
        }

        throttle = Mathf.Clamp(throttle, 0.0f, 100.0f); // on limite la valeur de thrust pour la forcer à rester entre 0.0 et 100.0		

        PuissanceUtilMoteur = PuissanceMaxMoteur * throttle;

        // ====== APPLICATION DES FORCES et TORQUE ====== //
        // thrust s'applique le long de l'axe Forward de l'avion//
        // portanceAiles s'applique sur l'axe Up de l'avion//
        // on peut donc combiner ces forces :

        Vector3 ForceTotal = (transform.forward * PuissanceUtilMoteur * 100.0f) + (transform.up * portanceAiles);

        // torque est un couple autour de l'axe forward de l'avion
        // pitch est un couple le long de l'axe right de l'avion
        // on peut donc combiner ces couple : 

        Vector3 TorqueTotal = (transform.forward * torque) + (transform.right * pitch);

        // on peut donc appliquer tout ça au rigidBody.
        // le fait d'avoir combiner les forces est pour l'optimisation, donc pas obligtoire
        // mais il est mieux d'appliquer une fois un rigidbody.AddForce plutot que 10x 10 forces différentes.
        // Encore une fois on utilise Time.deltaTime, pour la même raison que avant. pour palier aux différence de frameRate.		

        rb.AddForce(ForceTotal * Time.deltaTime);
        rb.AddTorque(TorqueTotal * Time.deltaTime);

        // ces deux lignes au dessus remplacent donc les 4 de ton précédent code :
        //rb.AddForce(transform.forward * thrust * 10.0f);  // En avant
        //rb.AddForce(transform.up * portanceAiles);        // vers le haut
        //rb.AddTorque(transform.forward * torque);
        //rb.AddTorque(transform.right  * pitch);

    }
}
Disons que ce post, c est plus pour la physics de l avion, le reste, animation, terrain, modeling, je post sur mon WIP
Dernière édition par samuel.brunner le 09 Oct 2018 19:07, édité 1 fois.

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: {DB-AL} Roulis d un avion

Message par djulio74 » 09 Oct 2018 18:49

Avec mon code, l avion conservait sa vitesse, ce qui donnais l impression de glisser, comme dans l espace
Avec ton code, je peux faire un 180, sa reste réaliste, on a vraiment l impression de voler dans de l air
pour ça, oui je l'ai pas précisé, Mais quand tu appliquait la force de la portance, tu déclarait

Code : Tout sélectionner

rb.AddForce( Vectro3.up * portance)
hors Vector3.up est propre au monde, donc quand l'avion tournait, la portance était toujours appliquée a la vertcale du monde, hors elle est verticale par rapport a l'avion, j'ai donc modifié en :

Code : Tout sélectionner

rb.AddForce( transform.up * portance)
En tout cas bien, a fait de bonnes recherches apparemment. :super:

par contre juste pour pinailler, dans Void start() ,, tu as :

Code : Tout sélectionner

PuissanceMaxMoteur = 49.42f * 1000;
ce qui t'oblige a modifier le code pour modifier la puissance max disponible. efface cette ligne et défini plutôt au début du script a la place de :

Code : Tout sélectionner

 public float PuissanceMaxMoteur;
par

Code : Tout sélectionner

 public float PuissanceMaxMoteur = 49420.0f ;
comme ça directement depuis l'inspector, tu pourra modifier la puissance max dispo sans toucher au code.
// Poussee des moteurs et kg/n
la poussé en exprimé soit en kg, soit en N, c'est une force.

bah écoute avec plaisir que j'essayerai de donner des conseils en physique si je le peux! ;-)

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

samuel.brunner
Messages : 92
Inscription : 28 Mars 2018 01:26
Localisation : Alpes - Suisse

Re: {DB-AL} Roulis d un avion

Message par samuel.brunner » 09 Oct 2018 18:58

Je te jure mon avion glisse bien que j ai remplacer les vector3 par des transform

Code : Tout sélectionner

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

public class FlyControler3 : MonoBehaviour {

    
    public Rigidbody rb;
    public float Portance;
    private float PuissanceMoteur; //Poussee des moteurs
    public float Traction; //Force qui pousse en avant l avion
    public float throttle; //de 0 a 100 utilisation de la puissance des moteurs

    public float CoeffPortAiles = 0.3f; // Coefficiant de portance des ailes, o.3 pour un MIG
    public float MassVolAir = 1.225f; // Varie selon l altitude
    public float SurfaceAlaire = 38; // Surface des ailes en m2
    public float IncidenceAiles; // angle de l aile par rapport au vent relatif

    // Use this for initialization
    //
    //
    //
    //

    void Start () {

        rb = GetComponent<Rigidbody>();
        rb.mass = 10900f;
        rb.drag = 1.0f;
        rb.angularDrag = 2.0f;
        PuissanceMoteur = 49.42f * 1000; // en kl/n donc multiplier par 1000
}
	
	// Update is called once per frame
	void Update ()
    {
        Debug.Log("rb.velocity : " + rb.velocity);
        Debug.Log("rb.velocity.magnitude : " + rb.velocity.magnitude);

        float turn = -Input.GetAxis("Horizontal") * rb.velocity.magnitude *60;
        rb.AddTorque(transform.forward * turn);

        float pitch = Input.GetAxis("Vertical") * rb.velocity.magnitude * 30;
        rb.AddTorque(transform.right * pitch);

        //Force de Portance // vers le haut

        Portance = Mathf.Sqrt(rb.velocity.magnitude) * CoeffPortAiles * MassVolAir * 0.5f;
        rb.AddForce(transform.up * Portance);

        //Calcul de la traction

        Traction = throttle * PuissanceMoteur;

        rb.AddRelativeForce(transform.forward * Traction);  // En avant
        


        // throttle

        if (throttle < 101)
        {
            if (Input.GetButtonDown("throttle+"))
            {
                throttle = throttle + 20f;
            }
        }

        if (Traction > 1)
        {
            if (Input.GetButtonDown("throttle-"))
            {
                throttle = throttle - 20f;
            }
        }

    }
}
Maj, je viens de trouver le coupable, c est rb.AddRelativeForce(transform.forward * Traction);
Il faut le remplacer par rb.AddForce(transform.forward * Traction)

Voila voila merci en tout cas

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: {DB-AL} Roulis d un avion

Message par djulio74 » 09 Oct 2018 19:03

ton avion glisse toujours car oui tu as changé par des transform, mais aussi tu utilise AddRelativeForce, et moi AddForce. ;)
je te laisse checker la doc pour voir la différence entre les deux.
dans ton cas précis c'est
AddRelativeForce(Vector3.up * portance) OU AddForce(transform.up* portance).
;-)

(tu as édité pendant que j'écrivais ^^)

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Répondre

Revenir vers « (C#) CSharp »