Page 2 sur 5

Re: [MY - AL] Mouvement gameObject

Publié : 19 Mars 2019 11:11
par Armand
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 ?

Re: [MY - AL] Mouvement gameObject

Publié : 19 Mars 2019 11:12
par boubouk50
exactement

Re: [MY - AL] Mouvement gameObject

Publié : 19 Mars 2019 11:47
par Armand
Ok ca marche ! Merci c'est bien plus clair maintenant ;)

Re: [MY - AL] Mouvement gameObject

Publié : 20 Mars 2019 16:06
par Armand
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

Re: [MY - AL] Mouvement gameObject

Publié : 20 Mars 2019 16:29
par boubouk50
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.

Re: [MY - AL] Mouvement gameObject

Publié : 21 Mars 2019 10:36
par Armand
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));

    }

Re: [MY - AL] Mouvement gameObject

Publié : 21 Mars 2019 10:50
par boubouk50
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.

Re: [MY - AL] Mouvement gameObject

Publié : 21 Mars 2019 11:03
par boubouk50
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);

Re: [MY - AL] Mouvement gameObject

Publié : 21 Mars 2019 11:53
par Armand
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 ...

Re: [MY - AL] Mouvement gameObject

Publié : 21 Mars 2019 12:03
par boubouk50
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.