{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
samuel.brunner
Messages : 92
Inscription : 28 Mars 2018 01:26
Localisation : Alpes - Suisse

{DB-AL} Roulis d un avion

Message par samuel.brunner » 28 Sep 2018 21:48

Bonjour

Lorsque mon avion roule sur la gauche ou la droite, il doit normalement commencer a se déplacer sur l axe x, en aussi descendre un peu en y

Code : Tout sélectionner

 if (transform.rotation.z > 10)
        {
            transform.position = new Vector3(transform.position.x - 1,
                            transform.position.y -0.5,
                            transform.position.z);
        }
Impossible de récupérer cette variable avec transform.rotation.z qui reste a 0 tout le temps

Image

Merci a bientot

Avatar de l’utilisateur
Liven
Messages : 268
Inscription : 30 Nov 2017 01:48

Re: {DB-AL} Roulis d un avion

Message par Liven » 29 Sep 2018 00:41

Contrairement aux valeur indiquées dans l'inspector, dans le code on récupère tout ce qui est rotation sous forme de quaternion (c'est une sorte de vector4 si tu veux) donc le z de "rotation" ne correspond pas du tout au z de l'inspector.

Lorsqu'on a besoin, on peut convertir ce quaternion en vector3 avec des formules comme ici : https://docs.unity3d.com/ScriptReferenc ... Euler.html (ou autre faut que tu test), mais dans la mesure du possible, s'il ne s'agit que d'opérations de rotation il vaut mieux travailler directement sur les Quaternions (en utilisant les formules appropriées, c'est pas comme le vector3 de la position que tu peux facilement modifier à la main).

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

Re: {DB-AL} Roulis d un avion

Message par samuel.brunner » 29 Sep 2018 19:55

Merci

J ai fait une recherche sur cette fonction, je n ai pas compris grand chose mais bon, j arrive a faire une comparaison

Code : Tout sélectionner

        // Roulis

        if (transform.rotation.eulerAngles.z > 10 && transform.rotation.eulerAngles.z < 180)
            {
            transform.position += Vector3.left;
        }

Code : Tout sélectionner

transform.position = new Vector3(transform.position.x - 1,
                transform.position.y - 0.3f,
                transform.position.z);
Avec les 2 code c est le même bug, dans un sens ça marche,

si je roule sur la gauche mon avion par sur la gauche

Mais je fais demis tour et que je roule a gauche je pars sur la droite

J ai essayé de rajouter gomeobject , pour que cela soit par rapport a l objet et non au monde mais rien ne change

Code : Tout sélectionner

if (transform.rotation.eulerAngles.z > 10 && transform.rotation.eulerAngles.z < 180)
            {
            gameObject.transform.position = new Vector3(gameObject.transform.position.x - 1,
                gameObject.transform.position.y - 0.3f,
                gameObject.transform.position.z);
        }

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 » 29 Sep 2018 20:23

Salut,

Tu t'y prends "très mal" ;)
Là tu fais toutes tes transformations en worldspace, donc ça ne tient absolument pas compte de la rotation de ton objet.

Il faut utiliser les vecteurs directeurs du transform pour s'orienter et se déplacer relativement à la direction actuelle.

transform.forward te donnera le vecteur unitaire "vers l'avant"
transform.right te donnera le vecteur unitaire "vers la droite"
transform.up te donnera le vecteur unitaire "vers le haut"

donc si tu veux te déplacer en avant par exemple :

Code : Tout sélectionner

transform.position += transform.forward * speed * Time.deltatime;
Si tu veux cumuler plusieurs vecteurs directeurs, tu peux, mais il faudra utiliser leur somme normalisée au final pour que ça respecte bien ta valeur de vitesse.

Code : Tout sélectionner

Vector3 direction = transform.up + transform.forward;

transform.position += direction.normalized * speed * Time.deltatime;
Quelques sources utiles :
https://docs.unity3d.com/Manual/VectorCookbook.html
https://unity3d.com/fr/learn/tutorials/ ... ctor-maths
https://www.youtube.com/watch?v=thjLEDDoE08
https://www.youtube.com/watch?v=8YwL3LVxzv4

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

Re: {DB-AL} Roulis d un avion

Message par samuel.brunner » 29 Sep 2018 21:53

Merci

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 14:08

C est bizard car

Code : Tout sélectionner

transform.position += transform.forward * 0.01f * speed;
ne cause pas le même bug, l avion avance toujours en avant qu import la rotation
The blue axis of the transform in world space.

Manipulate a GameObject’s position on the Z axis (blue axis) of the transform in world space. Unlike Vector3.forward, Transform.forward moves the GameObject while also considering its rotation.

When a GameObject is rotated, the blue arrow representing the Z axis of the GameObject also changes direction. Transform.forward moves the GameObject in the blue arrow’s axis (Z).

For moving the GameObject on the Z axis while ignoring rotation, see Vector3.forward.
Il devrait y avoir un transform.down, ca me simplifierai la vie

La je suis en train de faire des tests avec rigidbody et un throttle
Dernière édition par samuel.brunner le 01 Oct 2018 14:32, édité 1 fois.

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 14:10

C'est bien le même transform que tu déplaces et que tu fais pivoter ?

Pourquoi ce 0.01f et pas Time.deltatime ?

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 14:33

Bonjour

J ai ajouté dans le message précédant pourquoi transform.forward marche

https://docs.unity3d.com/ScriptReferenc ... rward.html
Pourquoi ce 0.01f et pas Time.deltatime ?
Cela fait saccader l animation

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 14:52

Je ne comprends pas ce que tu racontes... ça fonctionne ou ça ne fonctionne pas ?

Ensuite, il FAUT utiliser Time.deltatime dans la fonction update pour que les déplacements soient corrects, ça ne PEUT PAS faire saccader l'animation. Ton problème est ailleurs.

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 15:13

Alors

J ai remis Time.deltaTime dans la fonction update et ça ne saccade plus, super

J ai testé plein truc et j avais mal lu ton post d hier

Bref la c est le gros bordel j espère démêler tout ça avant ce soir :nono:

up; a non Time.deltaTime fait lagger mon avion, il varie de 0.016 a 0.02

up2 ; voila que ca ne bug plus

j ai du changer ton code car mon avion partait vers le haut tout seul

Code : Tout sélectionner

Vector3 direction = transform.up * 0.0f + transform.forward;

        transform.position += direction.normalized * speed * Time.deltaTime;

        speed -= transform.forward.y * 20.0f * Time.deltaTime;
Pour l instant cela marche, j ai plus qu a essayer de placer une variable a coter de transform.up

Up3 : Voila le code final qui correspond a ma question, quand on tourne a gauche, un dérive sur la gauche et vers le bas

Code : Tout sélectionner

  // Roulis
 
        if (transform.rotation.eulerAngles.z > 20 && transform.rotation.eulerAngles.z < 180)
           {
            
            transform.position = new Vector3(transform.position.x,
                transform.position.y - 1f,
                transform.position.z);
                transform.position -= transform.right * 1.0f;
        }
        if (transform.rotation.eulerAngles.z > 180 && transform.rotation.eulerAngles.z < 340)
        {
            transform.position = new Vector3(transform.position.x,
                transform.position.y - 0.2f,
                transform.position.z);
            transform.position += transform.right * 1.0f;
        } 
Up 4 ; Au final, tout cela était inutile, voici un code simplifié

Code : Tout sélectionner

 // Roulis
 
        if (transform.rotation.eulerAngles.z > 20 && transform.rotation.eulerAngles.z < 180)
           {
            transform.position -= transform.right * 1.0f;
        }
        if (transform.rotation.eulerAngles.z > 180 && transform.rotation.eulerAngles.z < 340)
        {
            transform.position += transform.right * 1.0f;
        } 
Up 5 ; Effet de portance des ailes

Code : Tout sélectionner

Vector3 direction = transform.up * portancevirage + transform.forward;

        transform.position += direction.normalized * speed * Time.deltaTime;

        speed -= transform.forward.y * 20.0f * Time.deltaTime;

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

        }

        if (transform.rotation.eulerAngles.z < 20 || transform.rotation.eulerAngles.z > 340)
        {
            portancevirage = 0.0f;
        }
Dernière édition par samuel.brunner le 01 Oct 2018 16:48, édité 8 fois.

Répondre

Revenir vers « (C#) CSharp »