[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: [MY - AL] Mouvement gameObject

Message par Armand » 19 Mars 2019 11:11

Ok parfait ! ;)

L'histoire des 3 secondes c'est une solution que j'avais trouvée ... Mais qui n'est clairement pas ce qu'il me faut car je m'écarte trop du "temps réél".

Ok je vois donc je dois stocker les coordonées a un moment X puis a un moment Y et effectuer le mouvement du point A vers B en x millisecondes, et ces x millisecondes correspondent au temps entre l'envoie de la coordonée a et b ?

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

Re: [MY - AL] Mouvement gameObject

Message par boubouk50 » 19 Mars 2019 11:12

exactement
"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: [MY - AL] Mouvement gameObject

Message par Armand » 19 Mars 2019 11:47

Ok ca marche ! Merci c'est bien plus clair maintenant ;)

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

Re: [MY - AL] Mouvement gameObject

Message par Armand » 20 Mars 2019 16:06

Je me trouve confronté à un autre problème désormais :/

En untilisant la fonction Lerp() que voici :

Code : Tout sélectionner

transform.position = Vector3.Lerp(
new Vector3(transform.position.x, transform.position.y, transform.position.z), newPos, 0.001F);
Le bateau bouge effectivement de facon lente et il n'y a plus cet effet de lag.
En revanche, ce code est appelé dans la fonction Update(), donc une fois toutes les frames.

Sauf que je présume que le bateau n'a pas eu le temps d'effectuer son mouvement à 100% vu que 1 frame est inférieur à 0.001F.

Donc il commence à le bouger du point A vers B, n'a pas le temps de terminer son mouvement, et là la fonction Update() est appelée à nouveau

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

Re: [MY - AL] Mouvement gameObject

Message par boubouk50 » 20 Mars 2019 16:29

Fonctionnement de la fonction Lerp:
Lerp (a, b, t) -> interpolation de a vers b en fonction de t compris entre 0 et 1
Pour des vecteurs de position, tu as donc ceci:
Pour t = 0, tu obtiens la position a et pour t=1 tu obtiens la position b. Pour toute autre valeur de t, tu as une position intermédiaire entre a et b selon la fonction f(t) = a (1-t) + bt.

Ici, tu fixes t mais tu ne fixes pas a, car la position de ton bateau varie. Donc elle semble marcher alors qu'en fait tu ne fais que réduire l'écart entre a et b. Tu perds également la notion de temps.

a et b doivent rester fixes et t varier avec le temps pour que lorsque t=0 tu sois au début, et t=1 tu sois au bout du timing défini, i.e. le temps entre deux envois du socket.

Code : Tout sélectionner

t += Time.deltaTime; //ajout du temps entre deux updates
transform.position = Vector3.Lerp(positionDeDepart, positionDArrivee, t/tempsTotal);
Ainsi, lorsque t = 0, tu seras à la position de départ, et lorsque t aura atteint le temps de translation (celui entre les deux envois du socket), t vaudra 1.
Lorsque tu reçois un nouveau jeu de position, tu mets à jour la position de départ par celle actuelle et la position d'arrivée par celle reçue et enfin tu réinitialises t à 0.
"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: [MY - AL] Mouvement gameObject

Message par Armand » 21 Mars 2019 10:36

Que représente le temps total ? C'est le temps d'une frame c'est bien ca ?
Actuellement je divise par 1 ...

Voici l'appel de ma fonction dans le Update() :

Code : Tout sélectionner

y = (float)Network.wave.h;
MoveTanker(y,currentPos);
t = 0;
Voici ma fonction :

Code : Tout sélectionner

void MoveTanker(float y, Vector3 oldPos)
    {
        print("Y:" + Math.Round((decimal)y,2));
        print("CURRENT:" + Math.Round((decimal)transform.position.y,2));
        newPos = new Vector3(transform.position.x, y, transform.position.z);
        print("FUTUR POS:" + Math.Round((decimal)newPos.y, 2));
        t += Time.deltaTime;
        transform.position = Vector3.Lerp(oldPos, newPos, t / 1);
        print("NEWPOS:" + Math.Round((decimal)transform.position.y, 2));

    }

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

Re: [MY - AL] Mouvement gameObject

Message par boubouk50 » 21 Mars 2019 10:50

Le temps total est le temps entre deux envois du socket.
D'un côté, tu envoies des données toutes les X millisecondes.
De l'autre, il faut donc que tu interpoles ces données pendant ces X millisecondes pour recréer le même mouvement dans le même délai.
"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
boubouk50
ModoGenereux
ModoGenereux
Messages : 6185
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [MY - AL] Mouvement gameObject

Message par boubouk50 » 21 Mars 2019 11:03

Concernant le code, ce n'est pas bon.
Il faut réinitialiser dans une fonction et déplacer dans l'Update (). newPos et oldPos ne varient pas. Ils représentent la position de départ et d'arrivée. (je les avais appelés positionDeDepart et positionDArrivee)
Lors de la réception des données:
- t=0f
- tempsTotal = temps reçu
- positionDeDepart = positionDArrivee
- positionDArrivee= position reçue

Code : Tout sélectionner

positionDeDepart = positionDArrivee;
positionDArrivee.y = (float)Network.wave.h;
t=0f;
tempsTotal = ;//récupérer le temps entre deux envois (il est préférable que ce soit wave.h qui le donne)
 
Dans l'Update (), ce que je t'avais déjà écrit:

Code : Tout sélectionner

t += Time.deltaTime; //ajout du temps entre deux updates
transform.position = Vector3.Lerp(positionDeDepart, positionDArrivee, t/tempsTotal);
"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: [MY - AL] Mouvement gameObject

Message par Armand » 21 Mars 2019 11:53

Ok, une chose m'échappe.

La fonction permettant de réinitialliser le timer, ainsi que les pos doit bien être appelé elle aussi dans l'Update() ? Juste avant le :

Code : Tout sélectionner

 t += Time.deltaTime; //ajout du temps entre deux updates
        transform.position = Vector3.Lerp(positionDeDepart , positionDArrivee, t / tempsTotal );

De la sorte :

Code : Tout sélectionner

    void Update()
    {
        resetPos();
        MoveTanker();
    }
    void resetPos()
    {
        positionDeDepart = positionDArrivee;
        positionDArrivee.y = (float)Network.wave.h;
        t = 0F;
        tempsTotal = // code à venir;
    }
    void MoveTanker()
    {

        t += Time.deltaTime; //ajout du temps entre deux updates
        transform.position = Vector3.Lerp(positionDeDepart, positionDArrivee, t / tempsTotal);
    }
    

De plus mon socket envoie une donnée toutes les 60 ms, de ce fait je risque d'avoir un effet de lag non ?
Car si le Lerp doit s'effectuer sur une durée de 60ms cela veut dire que le mouvement sera plutôt rapide ...

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

Re: [MY - AL] Mouvement gameObject

Message par boubouk50 » 21 Mars 2019 12:03

Oula non, pas dans l'Update (), sinon tu réinitialises à chaque calcul.
Question: est-ce toi qui récupère les données ou est-ce que tu les reçois? (à savoir si tu as la main mise sur le rafraichissement des données).
Si tu les reçois, alors lors d'une réception tu réinitialises et passe à la position suivante.
Si tu les récupères, alors c'est plus simple car tu peux gérer toi même le timing. Mais dans les 2 cas, l'affexctation des données doit se faire en dehors de l'Update (). L'Update () doit uniquement calculer les positions intermédiaires.

Concernant la rapidité, comme tu fais un calcul dépendant du framerate, il s'effectuera toujours à la même vitesse.
Désolé, pour moi c'est très clair et simple. Faudrait que je schématise peut-être pour t'expliquer différemment.
"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

Répondre

Revenir vers « Scripting »