[RESOLU] [MY - AL] Mouvement gameObject

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Avatar de l’utilisateur
Armand
Messages : 50
Inscription : 10 Jan 2019 12:06
Localisation : Toulouse

Re: [RESOLU][MY - AL] Mouvement gameObject

Message par Armand » 25 Mars 2019 17:32

Salut ! Je me permets de réouvrir le sujet, j'espère que celà est bien autorisé par les règles du forum ;)

Je me trouve donc confronté à un second souci toujours au sujet du mouvement de mon bateau.
Ce coup-ci je cherche à le faire bouger sur son axe de roulis, donc le fait qu'il tangue de droite à gauche.

J'ai donc reproduis le même fonctionnement que précèdemment mais avec un mouvement de rotation et non pas de position.

J'ai donc ajouté dans ma fonction resetPos() le fait de reset également les valeurs de rotation :

Code : Tout sélectionner

static void resetPos()
    {
        positionDeDepart = positionDArrivee;
        rotateDeDepart = rotateDeFin;

        positionDArrivee.y = (float)wave.h;
        rotateDeFin.z = (float)wave.rolls;

        t = 0F;
        tempsTotal = 10F/* code à venir */;
        print("RESET DONE");
    }
Ensuite dans mon gameLoop Update() j'apelle la fonction suivante :

Code : Tout sélectionner

    void RollBoat()
    {
        transform.rotation = Quaternion.Lerp(
            new Quaternion(transform.rotation.x, transform.rotation.y, transform.rotation.z, 1),
            new Quaternion(transform.rotation.x, transform.rotation.y, (float)Network.wave.rolls, 1), 1);

    }
Le souci étant que si je remplace (float)Network.wave.rolls par 4.0F, alors là, le bateau se trouve en rotation.z = 151,...
Est-ce donc pas la bonne fonction que j'utilise ?


Merci d'avance ;)

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6208
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [RESOLU][MY - AL] Mouvement gameObject

Message par boubouk50 » 25 Mars 2019 17:53

La fameuse rotation... Quaternion et Angle d'Euler, relation houleuse...
Si tu donnes des angles de rotation, ne passe que par ceux-ci. Cela vaut mieux. Les quaternions, quand on est pas familier avec, mieux vaut les laisser.
Je te conseille donc d'utiliser le Vector3 eulerAngles du transform pour affecter la rotation.
"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
Armand
Messages : 50
Inscription : 10 Jan 2019 12:06
Localisation : Toulouse

Re: [RESOLU][MY - AL] Mouvement gameObject

Message par Armand » 27 Mars 2019 09:38

Ok parfait celà fonctionne merci bien !
Et en plus je peux également gérer en même temps la rotation sur les 3 axes ;)

Avatar de l’utilisateur
Armand
Messages : 50
Inscription : 10 Jan 2019 12:06
Localisation : Toulouse

Re: [RESOLU][MY - AL] Mouvement gameObject

Message par Armand » 02 Avr 2019 10:20

Salut me revoici ! ^^

Je cherche désormais a faire avancer mon bateau à l'aide des touches du clavier.
Et celà à l'aide d'une variable d'accélération qui incrémente au cours du temps, et décrément également au cours du temps lorsque la touche est relâchée.

Jusqu'a présent le mouvement du bateau se faisait à l'aide de cela:

Code : Tout sélectionner

transform.position = Vector3.Lerp(Network.getPositionDeDepart(), Network.getPositionDArrivee(), t / tempsTotal);
Et j'aimerai ajouter le mouvement vers l'avant

Code : Tout sélectionner

transform.position = Vector3.Lerp(Network.getPositionDeDepart(), Vector3.forward * (accel * 100), t / tempsTotal);
Avec cette méthode j'ai comme l'impression qu'il y a conflit entre l'appel des deux fonctions Lerp.
Aurais-tu une solution ?

J'ai également essayé à l'aide d'un RigidBody mais encore une fois il y a conflit entre les 2.
Vu que j'ai toujours ma fonction resetPos() qui réinitialise les coordonnées à chaque réception de data.

Code : Tout sélectionner

    static void resetPos()
    {
        positionDeDepart = positionDArrivee;
        rotateDeDepart = rotateDeFin;
        positionDArrivee.y =(float)wave.h;
        rotateDeFin.z = (float)wave.roulis;
        t = 0F;
        tempsTotal = 0.06F/* code à venir */;
    }

Merci d'avance ! ;)

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6208
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [RESOLU][MY - AL] Mouvement gameObject

Message par boubouk50 » 02 Avr 2019 10:35

Je ne suis pas sûr de comprendre, tellement ça me parait évident qu'il y ait conflit.
Tu modifies 2 fois la position, l'une est fixe (donnée par le réseau) l'autre est calculée. La seconde prend forcément le dessus puisque tu as une affectation. Dans l'idée, ton bateau ne peut pas être à deux positions à la fois. Je te conseille de revoir l'objectif de déplacement, mais tu ne peux pas lui donner une position prédéfinie ET lui calculer une seconde position.
Qui plus est, le second Lerp ne veut strictement rien dire, puisque tu interpoles entre une position et un vecteur de translation.
Explique-moi plutôt l'idée/l'objectif à atteindre car il me semble impossible en l'état.
"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
Armand
Messages : 50
Inscription : 10 Jan 2019 12:06
Localisation : Toulouse

Re: [RESOLU][MY - AL] Mouvement gameObject

Message par Armand » 02 Avr 2019 10:45

Ok, donc mon objectif est tout simple, je cherche a faire avancer en avant mon bateau à l'aide des touches clavier, et également en arrière, de plus je dois pouvoir le faire tourner à droite et à gauche, toujours grâce au clavier.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6208
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [RESOLU][MY - AL] Mouvement gameObject

Message par boubouk50 » 02 Avr 2019 11:05

Dans ce cas, tu ne peux plus passer par le réseau pour lui donner une position (mis à part une position de départ), il sera pilotable en temps-réel donc il ne peut pas être piloter par le réseau en même temps.
Je n'arrive pas à voir le projet dans son entièreté du coup, ça me paraît mal foutu...
Si tu veux déplacer ton bateau, tu ne dois pas raisonner en terme de position mais de déplacement donc de trajectoire.
Pour les touches claviers, tu dois passer par la classe Input, plus précisément Input.GetKey () qui te permet de récupérer à chaque instant l'état d'une touche (appuyée ou non).
Ensuite, si ton bateau possède un rigidbody et est géré par la physique, tu devrais plutôt passer par celui-ci plutôt que par son transform. Tu devras donc jouer avec les forces (AddForce, AddRelativeForce, AddTorque, etc)
Je suis sur que tu peux trouver facilement sur ce forum comment utiliser les forces, voire sur le net comment développer une conduite de bateau.
"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
Armand
Messages : 50
Inscription : 10 Jan 2019 12:06
Localisation : Toulouse

Re: [RESOLU][MY - AL] Mouvement gameObject

Message par Armand » 03 Avr 2019 10:03

Pour le moment la fonction de déplacement du bateau ne fait que influer l'axe Y, pourtant j'envoie bien un Vector3 donc l'axe x,y et z.
L'axe x, et z est toujours égale à 0.

J'aimerai donc modifier ces variables à la volée, donc modifier l'axe x et Z du Vecteur à l'aide du clavier.
Dans ma fonction resetPos() je modifies le vecteur comme cela :

Code : Tout sélectionner

        positionDArrivee.y = (float)wave.h;
J'aimerai donc faire quelque chose comme ca :

Code : Tout sélectionner

        positionDArrivee.x = //mon code

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6208
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [RESOLU][MY - AL] Mouvement gameObject

Message par boubouk50 » 03 Avr 2019 10:32

Dans ce cas, tu peux d'abord faire le pilotage avec un AddForce (physique) ou un Translate (transform) puis affecter ensuite le y de ton bateau.
Si tu utilises AddForce, il faudra bloquer la vélocité en y par contre.

Pour le Translate (), cela donnera ça:

Code : Tout sélectionner

transform.Translate (transform.forward * (accel * 100) * Time.deltaTime);
Regarde le lien de la doc, tu as beaucoup de manière d'utiliser le Translate.
"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
Armand
Messages : 50
Inscription : 10 Jan 2019 12:06
Localisation : Toulouse

Re: [RESOLU][MY - AL] Mouvement gameObject

Message par Armand » 04 Avr 2019 08:57

Ok, j'ai un rendu à peu près plutôt correct mais je peux apercevoir les points d'interpolation.


J'ai donc déclaré 2 variables dans ma classe Tanker_script :

Code : Tout sélectionner

    public static Vector3 pos;
    public static double posZ = 0F;
Dans la fonction Update() je décide donc de faire avancer le bateau à l'aide du "Translate()", puis je stock sa coordonnée z une fois le mouvement effectué.

Code : Tout sélectionner

    void Update()
    {
        setInputs(Input.GetAxisRaw("Vertical"), Input.GetAxisRaw("Horizontal"));
        transform.Translate(Vector3.forward * (accel) * Time.deltaTime);
        pos = transform.position;
        posZ = pos.z;
        MoveTanker();

    }
Ma fonction MoveTanker() elle si tu te rappelles bien, remet le Vecteur3 à 0 à chaque réception de socket, sauf l'axe y qui lui devient égale a la data envoyé par la com réseau.
De ce fait, je fais la même chose pour l'axe z à l'aide de la variable posZ

Code : Tout sélectionner

    static void resetPos()
    {
       
        positionDeDepart = positionDArrivee;
        rotateDeDepart = rotateDeFin;
        positionDArrivee.y = (float)wave.h;
        positionDArrivee.z = (float)tanker_script.posZ ;
        print("POSZ:" + tanker_script.posZ);
        rotateDeFin.z = (float)wave.roulis;
        rotateDeFin.x = (float)wave.rotate;
        t = 0F;
    }
Avec tout cela, mon bateau bouge dans un premier temps à l'aide de la fonction Translate, puis à nouveau avec la fonction MoveTanker()

J'ai également remarqué que si je mettais en commentaire mon appel à la fonction MoveTanker() dans Update(),
alors là le bateau avance correctement et sans effet de "lag", cela me parait donc logique que l'effet de lag que j'obtiens est dû au fait d’effectuer 2 mouvements sur le bateau.

Aurais-tu une idée de comment lisser le mouvement ? Car comme dis précédemment je peux observer les points d'interpolation.

Merci d'avance ;)

Répondre

Revenir vers « Scripting »