[RESOLU] [MY - AL] Mouvement gameObject
Re: [MY - AL] Mouvement gameObject
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 ?
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 ?
- boubouk50
- ModoGenereux
- Messages : 6268
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: [MY - AL] Mouvement gameObject
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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Re: [MY - AL] Mouvement gameObject
Ok ca marche ! Merci c'est bien plus clair maintenant
Re: [MY - AL] Mouvement gameObject
Je me trouve confronté à un autre problème désormais
En untilisant la fonction Lerp() que voici :
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
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);
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
- boubouk50
- ModoGenereux
- Messages : 6268
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: [MY - AL] Mouvement gameObject
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.
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.
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);
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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Re: [MY - AL] Mouvement gameObject
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() :
Voici ma fonction :
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;
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));
}
- boubouk50
- ModoGenereux
- Messages : 6268
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: [MY - AL] Mouvement gameObject
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.
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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
- boubouk50
- ModoGenereux
- Messages : 6268
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: [MY - AL] Mouvement gameObject
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
Dans l'Update (), ce que je t'avais déjà écrit:
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)
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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Re: [MY - AL] Mouvement gameObject
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 :
De la sorte :
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 ...
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 ...
- boubouk50
- ModoGenereux
- Messages : 6268
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: [MY - AL] Mouvement gameObject
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.
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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation