{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
Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: {DB-AL} Roulis d un avion

Message par Alesk » 01 Oct 2018 15:33

As-tu consulté intégralement les liens que je t'ai donnés ?

Time.deltaTime donne le temps écoulé depuis la dernière exécution de la fonction update et ce n'est jamais une valeur fixe, donc ce que ce changement de valeur est normal.
Ce n'est pas ça qui provoque du lag.

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

Re: {DB-AL} Roulis d un avion

Message par samuel.brunner » 01 Oct 2018 17:12

OK merci

je vais finir de regarder tout ça, j ai quand même appris pas mal de chose rien qu avec cette histoire de roulis

En ce qui concerne TIme.deltaTime, je ne sais pas trop, ça ne saccade plus, je pense que cela venait de la camera qui était mal programmée

J ai une bête camera fixée a l avion et pas le moindre lag

Finalement je me retrouve avec un code hyper simple

Code : Tout sélectionner

transform.position += transform.forward * speed * Time.deltaTime;

        speed -= transform.forward.y * 20.0f * Time.deltaTime;       
        
        // Less speed if you climb, more if you go down            

        // Roulis
 
        if (transform.rotation.eulerAngles.z > 20 && transform.rotation.eulerAngles.z < 180)
           {
            transform.position -= transform.right * 1.0f * speed / 400;
        }
        if (transform.rotation.eulerAngles.z > 180 && transform.rotation.eulerAngles.z < 340)
        {
            transform.position += transform.right * 1.0f * speed / 400;
        }
Up

J ai entièrement fait le code, maintenant il y a la résistance de l air, la gravite, la portance des ailes, et la poussée des moteurs

Code : Tout sélectionner

        transform.position += transform.forward * vitesseJet * Time.deltaTime;

        transform.Rotate(Input.GetAxis("Vertical"), 0.0f, -Input.GetAxis("Horizontal"));

        vitesseJet = rb.velocity.magnitude;

        portanceAiles = vitesseJet / 10;

        if (portanceAiles >= 10)
        { portanceAiles = 10.0f;
        }

        if (vitesseJet >= 300)
        {
            vitesseJet = 300.0f;
        }

        rb.AddRelativeForce(Vector3.forward * thrust); // En avant
        rb.drag = AirResistance; // resistance de l air
        rb.AddForce(-transform.up * gravity); // vers le bas
        rb.AddForce(transform.up * portanceAiles);        // vers le haut
        

        // rb.AddRelativeForce(-Vector3.forward * AirResistance);

        // throttle

        if (thrust < 100)
        {
            if (Input.GetButtonDown("throttle+"))
            {
                thrust = thrust + 20.0f;
            }
        }

        if (thrust > 0)
        {
            if (Input.GetButtonDown("throttle-"))
            {
                thrust = thrust - 20.0f;
            }
        }

    }
Bien sur pour faire une vrai simulation il va falloir que je me lance dans le calcul des vecteurs, c est assez compliqué a expliquer mais je vais devoir bloquer les commandes de l avion selon certains vecteurs pour qu on ne pousse pas faire un 180 a plein vitesse, ou par exemple, quand on change de direction, on augmente un vecteur dans un direction et on diminue dans l autre

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

Re: {DB-AL} Roulis d un avion

Message par Alesk » 02 Oct 2018 10:11

:super:

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

Re: {DB-AL} Roulis d un avion

Message par djulio74 » 03 Oct 2018 13:31

pas mal, comme quoi parfois le simple est tout a fait fonctionnel.
la simulation physique des objets est assez complexe bien que souvent simplifiable. cela dépend du but recherché : simulation ou arcade.

si tu veux pousser un peu plus la simulation, une notion est a prendre en compte : les effort d'un fluide (ici l'air) sur un objet en mouvement (ici ton avion) ne sont pas linéaire mais fonction du carré de la vitesse.
par exemple : portance = x * V² , ou x est un coefficient sans dimension et V la vitesse de l'objet, et le vecteur portance perpendiculaire au vecteur vitesse.

Pourrais tu aussi mettre ton code complet si possible (le dernier), ici on dirait que tu modifie la position du transform, puis applique des forces a son rigidBody, ce qui n'est pas très recommandé. c'est soit l'un soit l'autre.

Dans ton dernier code :

Code : Tout sélectionner

rb.drag = AirResistance; // resistance de l air
il n'est pas utile normalement de le définir a chaque frame. "AirResistance" devrait être un coefficient fixe propre a l'avion, différent pour chaque avions.

Code : Tout sélectionner

rb.AddForce(-transform.up * gravity); // vers le bas
cela n'as pas lieu d’être normalement. ton rigidBody a une masse, donc unity gère déjà la gravité. de plus transform.up est propre a ton Gameobject, donc si ton avion vole a la verticale, transform.up deviens un vecteur horizontal, ou si ton avion vole a l'envers ( cas d'une vrille), transform.up est bien vertical, mais dirigé vers le haut....
a la limite ton code devrait etre :

Code : Tout sélectionner

rb.AddForce(-Vector3.up * gravity); 
Pour avoir beaucoup codé sur les forces et les mouvements ( simulation voiture), je trouve très utile d'avoir un visuel sur les forces que l'on cherche à appliquer, visualiser la direction et la valeur, avec des "debug.DrawRay", je t'encourage a le faire .

______________________________________________________________
\_______________________ 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 » 06 Oct 2018 21:26

Merci djulio74,

rb.drag = AirResistance; // resistance de l air
il n'est pas utile normalement de le définir a chaque frame. "AirResistance" devrait être un coefficient fixe propre a l'avion, différent pour chaque avions.
Oui c est logique, en plus la variable AirResistance est totalement inutile puisque on peut voir rb.drag dans l inspecteur

rb.AddForce(-transform.up * gravity); // vers le bas
cela n'as pas lieu d’être normalement. ton rigidBody a une masse, donc unity gère déjà la gravité. de plus transform.up est propre a ton Gameobject, donc si ton avion vole a la verticale, transform.up deviens un vecteur horizontal, ou si ton avion vole a l'envers ( cas d'une vrille), transform.up est bien vertical, mais dirigé vers le haut....
Je t avoue qu en regardant ce code je ne comprend même pas la signification, en plus a chaque foie je confonds vector3.up et tansform.up

Au final c était pour essayer d appliquer differentes force,
en avant, selon la puissance des moteurs
en arriere selon la résistance de l air
en haut, pour la portance des ailes, et simuler un décrochage quand on vole trop bas
en bas, la gravitee

Sinon, pour la portance je me demandais comment faisait les avions, et surtout les jets, ils décollent a 200 km/h , mais une foie a 1000km/h, avec la portance des ailes, ils doivent carrément pas arriver a voler a plats, je sais qu il y a une réponse toute simple car dans les simu on vol a plat

Dans mon code, a la base il y a une gravitee de 10 vers le bas
A partir de x km/h , portance ailes passe a 10 et l avion va tout droit
Ce qui fait que si on vole trop lentement, on tombe
C est pas vraiment de la simulation mais une petite astuce

+Mon code en mousse

Code : Tout sélectionner

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

public class FlyControler2 : MonoBehaviour {

    float speed = 0.0f;
    public float thrust = 1;
    public Rigidbody rb;
    public float gravity;
    public float portanceAiles;
    public float AirResistance;
    public float vitesseJet;


    // Use this for initialization
    void Start () {

        rb = GetComponent<Rigidbody>();
    }
	
	// Update is called once per frame
	void Update () {

        Debug.Log("thrust : " + thrust);

        transform.position += transform.forward * vitesseJet * Time.deltaTime / 200.0f;

        transform.Rotate(Input.GetAxis("Vertical"), 0.0f, -Input.GetAxis("Horizontal"));

        vitesseJet = rb.velocity.magnitude;

        portanceAiles = vitesseJet / 10f;

        if (portanceAiles >= 10f)
        { portanceAiles = 10f;
        }

        if (vitesseJet >= 300)
        {
            vitesseJet = 300;
        }

        rb.AddRelativeForce(Vector3.forward * thrust); // En avant
        rb.drag = AirResistance; // resistance de l air
        rb.AddForce(-transform.up * gravity); // vers le bas
        rb.AddForce(transform.up * portanceAiles);        // vers le haut

       // if (transform.rotation.eulerAngles.z > 20 && transform.rotation.eulerAngles.z < 180)
       // {
       //   transform.position -= transform.right * 1.0f * vitesseJet / 80;
        //}
        //if (transform.rotation.eulerAngles.z > 180 && transform.rotation.eulerAngles.z < 340)
       // {
       //     transform.position += transform.right * 1.0f * vitesseJet / 80;
       // }



        // rb.AddRelativeForce(-Vector3.forward * AirResistance);

        // throttle

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

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

    }
}

Code : Tout sélectionner

rb.AddRelativeForce(Vector3.forward * thrust); // En avant
Quand je vois cette ligne, je me demande comment l avion fait pour demarrer
A t=0 , Vector3.forward doit être a 0, donc qu importe le thrust l avion en devrait pas bouger

Nouveau code d après tes remarques

Code : Tout sélectionner

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

public class FlyControler2 : MonoBehaviour {

    public float thrust = 1;
    public Rigidbody rb;
    public float portanceAiles;
    public float x;


    // Use this for initialization
    void Start () {

        rb = GetComponent<Rigidbody>();
    }
	
	// Update is called once per frame
	void Update () {

        Debug.Log("thrust : " + thrust);

        transform.position += transform.forward * rb.velocity.magnitude * Time.deltaTime / 200.0f;

        transform.Rotate(Input.GetAxis("Vertical"), 0.0f, -Input.GetAxis("Horizontal"));

        portanceAiles = Mathf.Sqrt(rb.velocity.magnitude) * x;


        if (rb.velocity.magnitude >= 300)
        {
            // rb.velocity.magnitude = 300; // impossible car en lecture seule
        }

        rb.AddRelativeForce(Vector3.forward * thrust); // En avant
        rb.AddForce(Vector3.up * portanceAiles);        // vers le haut


        // throttle

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

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

    }
}

Code : Tout sélectionner

// transform.position += transform.forward * rb.velocity.magnitude * Time.deltaTime / 200.0f;
ce bout de code, je crois qu il ne sert a rien

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

Re: {DB-AL} Roulis d un avion

Message par djulio74 » 07 Oct 2018 12:17

Je t avoue qu en regardant ce code je ne comprend même pas la signification, en plus a chaque foie je confonds vector3.up et tansform.up
oui il va falloir lire un peu de doc, et te familiariser avec ces données, qui te seront utiles , et archi-présente, quelque soit ton projet.
Vector3up = vector3(0,1,0), et ce dans la référence world. un Vecteur unitaire dirigé a la vertical, dans le monde. indépendant de tout objet.
transform.up = un vecteur vertical aussi dirigé vers le haut, mais dans la référence du transform, donc gameObject., dnc varie si ton objet bouge. il est propre a celui ci.
Sinon, pour la portance je me demandais comment faisait les avions, et surtout les jets, ils décollent a 200 km/h , mais une foie a 1000km/h, avec la portance des ailes, ils doivent carrément pas arriver a voler a plats, je sais qu il y a une réponse toute simple car dans les simu on vol a plat
pour la portance elle est étudiée pour qu'a vitesse de croisière, l'avion plane ( ni monte ni descend). pour le décolage a plus faible vitesse, l'avion se cabre, ce qui augmente considérablement la portance.

Pour ton code final, encore une fois je te vois mélanger des transform et rigidBody. il faut éviter ça au maximum selon moi.
faut faire soit tout en modifiant les valeurs de position rotation du transform, soit déplacer, donner une rotation en donant des force et torque.

edit :
Quand je vois cette ligne, je me demande comment l avion fait pour demarrer
A t=0 , Vector3.forward doit être a 0, donc qu importe le thrust l avion en devrait pas bouger
du coup dans ton cas, remplace Vector3.forward par transform.forward. De plus si l'avion commence a avancer car que ce soit l'un ou l'autre, c'est toujours un vecteur unitaire, donc non null avec pour magnitude ( longueur) = 1.
c'est rb.Velocity qui est le vecteur vitesse, donc null si l'avion n'avance pas.


Perso, j'étais comme toi au début, a rajouter petit a petit des lignes de code, plus ou moins a taton pour essayer d'avoir les effet escompté. tu vas vite te retrouver a ne plus t'y retrouver justement dans ton code. Mais forcé de constater qu'il est meilleur, en amont, de bien étudier les avions dans ton cas. quelles forces s'appliquent, pourquoi, où, dans quelle direction..etc. Google sera ton meilleur amis. Analyse, décortique...

Commet vole un avion?
pourquoi il prend du roulis quand je tire le manche a droite ou gauche?
quand il prend du roulis, pourquoi je dois compenser en tirant le manche pour maintenir l'altitude?
- quelles sont les commandes d'un avion? ( manche, gaz, pedal..) et leurs fonction?

un avion a des ailes, certes, mais aussi volet, gouverne..etc. chaque élément a son importance, exerce sa propre force sur l'avion, en un point précis.
Tu as une bonne approche dans l'ensemble, c'est vrai mais tu doit être plus au point sur certaines notions avant je pense:
- les vecteurs
- les forces (AddForce, AddrelativeForce, AddTorque.. etc.)
- les repères ( world, local..)
- les notion (velocity, forward, up, magnitude.. etc)

Je referais ton code dans l'aprem, en essayant de bien l'annoter pour t'expliquer le pourquoi du comment. ;)
et si t'as des questions, hésite pas.

______________________________________________________________
\_______________________ 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 » 07 Oct 2018 14:14

Woua je suis trop content :super:

Code : Tout sélectionner

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

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

        if (Input.GetAxis("Horizontal") != 0 || Input.GetAxis("Vertical") != 0) // Stop la rotation quand on ne presse pas de touche
            rb.angularDrag = 0.8F;
        else
            rb.angularDrag = 5;
Visiblement tu as édité ton post entre temps ou je n avais pas lu en entier, mais je voulais montrer le nouveau code qui me permet de tourner

Oui c est exactement ça, je prends des bouts de code a gauche et a droite, mais c est ma manière d apprendre, si au final je finis comme toi a faire de gigantesques maps procédurales pourquoi pas faire les mêmes erreurs :hello:

Le truc qui me casse la tete c est de faire tourner l avion, qu il conserve ses forces en changeant de direction
Pour l instant quand on tourne, disons a droite, l avion se tourne vers la droite, mais glisse sur la gauche

Dans la réalité, ce sont les ailes qui empêchent de glisser vers la gauche , tandis si on tourne uniquement avec le palonnier on glisse

Il y a aussi l angle maximum auquel on peut tourner, la vitesse qui va se réduire, etc

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

Re: {DB-AL} Roulis d un avion

Message par djulio74 » 07 Oct 2018 15:10

bien ton dernier code, enfin tu n'utilise que du rigiBody, et plus de mélange transform/rigidbody. :super:

déjà pour les commandes qu'utilise tu? tout clavier? un gamePad? un vrai controleur ( manche + gaz + palonier)?
Le AngularDrag (drag aussi) devrait être une valeur fixe, et ne pas jouer avec pour pour compenser un mouvement.
Au pire tu defini Drag = 2.0f. et augment juste la valeur turn :

Code : Tout sélectionner

float turn = -Input.GetAxis("Horizontal")*2.0f;
par exemple.

Mais au risque d’être chiant, fais 2-3 recherche google sur les force appliquée a un avion tu verra que : ton "turn" est aussi fonction du carrée de la vitesse ( si l'avion n'avance pas, tu peux toucher toute les commande rien ne se passera) par exemple.

Aussi, tout objet a une inertie ( plus ou moins difficile de le mettre en mouvement/rotation) qui est en fonction de sa masse et de la répartition de la masse par rapport au centre de gravité. et c'est un élément très important dans le maniement d'un avion.
Oui c est exactement ça, je prends des bouts de code a gauche et a droite, mais c est ma manière d apprendre
c'est très bien, je pense on fait tous ça, ou on l'as tous fait. ;) l'important est pouvoir comprendre justement ces bout de code qu'on prend a droite a gauche. Par exemple si je te donne mon code pour ma génération de map, c'est génial ça va marcher pour toi, mais si tu ne le comprend pas tu va pas pouvoir l'adapter à tes besoins. ;)

Si tu veux bien, donne le code Complet pour ton avion, que je le test et t'en donne des conseils + explication si je 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 » 07 Oct 2018 16:37

Ok, c est bien moins compliqué qu avant

Voici mon code en entier

Code : Tout sélectionner

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

public class FlyControler2 : MonoBehaviour {

    public float thrust;
    public Rigidbody rb;
    private float portanceAiles;
    public float x; // Coefficiant de portance des ailes
    public float torque;
    // Use this for initialization
    void Start () {

        rb = GetComponent<Rigidbody>();
        rb.mass = 1.0f;
        rb.drag = 1.0f;
        rb.angularDrag = 2.0f;
        torque = 1;
        thrust = 1;
}
	
	// Update is called once per frame
	void Update ()
    {

        Debug.Log("thrust : " + thrust);
        Debug.Log("rb.velocity : " + rb.velocity);
        Debug.Log("rb.velocity.magnitude : " + rb.velocity.magnitude);

        float turn = -Input.GetAxis("Horizontal") * 2;
        rb.AddTorque(transform.forward * torque * turn);

        float pitch = Input.GetAxis("Vertical") * 2;
        rb.AddTorque(transform.right * torque * pitch);

        portanceAiles = Mathf.Sqrt(rb.velocity.magnitude) * x;

        rb.AddRelativeForce(transform.forward * thrust * 10);  // En avant
        rb.AddForce(Vector3.up * portanceAiles);        // vers le haut


        // throttle

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

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

    }
}
Ah oui, pour l instant j ai juste un clavier

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

Re: {DB-AL} Roulis d un avion

Message par djulio74 » 07 Oct 2018 19:30

Je suis en train de regarder ton code. Je te posterai ma "version" commentée demain je pense. Mais ce que je peux déja dire :
pour un rigidbody, les valeurs ont toute une unité, il est important d'avoir une cohérence.
- mass => poids en kg donc rb.mass = 1.0f => avion qui pese 1 seul kg.
- AddForce=> force en Newton(N) . 1kg = 9.81N.
- AddTorque => couple en N.m => 10N.m eviron 1kg au bout d'un bras de levier d'un mètre.
- unité => un mètre. transform.position = Vector3(0,1,0) => positionne ton transform a 1m au dessus du niveau 0.
- Velocity => Vecteur3 vitesse du rigiddbody, en m/s.

Donc que tout soit cohérent : dimension de l'avion, son poid.. pour avoir une échelle : un prefab cube : 1 m. x 1 m. x 1 m. un plane : 10 m x 10 m.

Edit :

Autre remarque je pense tu t'es mélanger : Mathf.Sqrt => Square root => raciné carée. Mathf.Sqrt(4) = 2.
dans ton cas pour la portance :

Code : Tout sélectionner

portanceAiles =rb.velocity.magnitude * rb.velocity.magnitude * x;

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Répondre

Revenir vers « (C#) CSharp »