[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

[RESOLU] [MY - AL] Mouvement gameObject

Message par Armand » 18 Mars 2019 11:54

Bonjour à tous !

Voici mon problème :

- J'ai un bateau que je fais bouger sur l'axe verticale (y) à l'aide de données envoyées par socket.
- Je récupère correctement ces données, et j'arrive a faire bouger le bateau avec.

Le souci est que le mouvement du bateau tous les frames donne une impression de téléportation de celui-ci.
Je cherche donc à "lisser" le mouvement du bateau.

J'ai essayé de update le mouvement que toutes les 3 secondes aulieu de chaque frame mais cela n'est pas réaliste ...

J'espère avoir été clair ;)

Merci d'avance,



Voici mon code permettant d'update seulement toutes les 3 secondes :

Code : Tout sélectionner

    void FixedUpdate()
    {
        if (Time.time >= nextUpdate)
        {
            nextUpdate = Mathf.FloorToInt(Time.time) + 3;
            MoveBoat();
        }
     }
     
    void MoveBoat()
    {
        newPos = new Vector3(transform.position.x, (float)Network.wave.h, transform.position.z);
        transform.position = newPos;
    }
     
     
 ! Message de : Max
Merci de modifier ton message pour lui donner un titre.
Dernière édition par Armand le 18 Avr 2019 11:33, édité 3 fois.

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

Re: [MY - AL] Mouvement gameObject

Message par boubouk50 » 18 Mars 2019 12:30

Bonjour,
Le "souci" est que tu donnes une position à chaque mise à jour. Il faudrait plutôt donner une direction ou un input pour que le programme calcule lui même la position.
Vois cela comme ça:
Comme pour un programme normal, ton bateau possède un contrôleur de déplacement interprétant des données entrantes: vitesse, direction (minimum). Ce calcul, effectué à chaque frame, permet un retour visuel fluide des mouvements, car même lorsqu'il n'y a pas de données entrantes il calcule quand même le déplacement.
Ici, il n'a accès qu'aux positions donc est soumis aux mises à jour des données et au framerate. Tu as donc une sensation de lag.
Maintenant, je ne sais pas ce que tu peux envoyer depuis ton socket, mais il faut que le bateau se gère tout seul, via les données envoyées par ce socket, et qu'il puisse se gérer seul lorsque ces données sont manquantes ou en retard.
"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 » 18 Mars 2019 12:54

Je comprends parfaitement ce que tu dis, et en soit je l'avais compris avant de posté ce message.

Je me suis donc mal exprimé, je sais pourquoi j'ai cette sensation de lag et c'est totalement logique.

Je cherche donc plus une solution, tu me parles d'Input, mais ceci n'est valable qu'avec les Input clavier non ?

Car j'envoie par socket un object qui contient différentes proprietées telles que la vitesse, l'acceleration la hauteur du navire, etc.
Par la suite je me sert de ces variables pour le mouvement du bateau.

J'ai pensé a cela :

- get la position du bateau
- attendre 3 secondes
- get la futur position via l'objet envoyé
- bouclé le mouvement du bateau par pas de 1

De ce fait je ne fais pas bouger le bateau d'une position x à y mais je le fais bouger jusqu'a ce que x soit égale à y.

C'est peut être un peu flou ^^

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

Re: [MY - AL] Mouvement gameObject

Message par boubouk50 » 18 Mars 2019 14:39

Ça me semble encore confus.
Un Input n'est jamais qu'une donnée entrante. Elle peut être n'importe quoi. Ne connaissant pas ton projet, je ne peux pas vraiment savoir ce qui est réalisable ou non de ton côté. (Surtout l'envoi de données)
En fait, si tu envoies une position toutes les 3 secondes, ton bateau aura 3 secondes de retard.
C'est pour cela que je pensais plutôt donner les informations de vitesse et d'orientation. En contre-partie, cette solution ne placera pas exactement le bateau au bon endroit car les informations intermédiaires seront interprétées.
En suivant ton cheminement, il te faut donner la position suivante et le temps mis pour y arriver. Ainsi tu peux recréer le déplacement correct pour que ton bateau soit synchronisé. Je pense que c'est peut être cette donnée que tu as omise.
Pour déplacer ton bateau de posA à posB en X millisecondes, tu peux passer par une interpolation linéaire.
"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 » 18 Mars 2019 15:04

En suivant ton cheminement, il te faut donner la position suivante et le temps mis pour y arriver. Ainsi tu peux recréer le déplacement correct pour que ton bateau soit synchronisé. Je pense que c'est peut être cette donnée que tu as omise.
En effet je n'avais pas du tout pensé à cela, le fait d'avoir une variable "temps"

En matière de développement pure cela donnerait quoi approximativement ?

Peut-être que je pourrai essayer avec le AddRelativeForce du RigidBody ou avec le transform.Translate() ?

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

Re: [MY - AL] Mouvement gameObject

Message par boubouk50 » 18 Mars 2019 16:31

Si tu fixes les déplacements, alors l'emploi de la physique est totalement inapproprié. La physique répond au besoin d'interaction avec le monde ce qui n'a rien à faire ici dans ton cas.

Je te propose d'expliquer clairement ton besoin. Pas ton problème, mais ce que tu veux faire, le but de ton jeu, de ton idée, sans parler développement. Tel qu'expliqué, pour l'instant ce que je comprends, c'est un visualisateur virtuel. Tout est déjà défini ailleurs, tu ne fais que réinjecter les données pour voir le résultat. Sans contexte, je suis un peu entrain de donner des pistes qui ne sont pas forcément les bonnes.
"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 » 18 Mars 2019 16:58

Ok ca marche.

Donc voici le but de mon jeu enfin si on peut appeler ca un jeu ^^ :

J'ai donc un modèle 3D d'un bateau.
Celui-ci est placé sur un plan d'eau.
J'ai donc pour objectif de faire du temps rééel.

Il faut que je déplace mon bateau sur plusieurs axes. Pour le moment je cherche simplement a le faire bouger sur l'axe verticale.

J'ai donc un objet qui est envoyé par socket UDP qui contient la hauteur (wave.h)

Et je veux donc que mon bateau ai comme hauteur la valeur envoyée par wave.h
L'objet que j'envoie n'a JAMAIS les memes valeurs.

Au tout début j'utilisais

Code : Tout sélectionner

transform.postion()
mais comme dis précèdemment cela donne un effet de LAG.

Merci d'avance

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

Re: [MY - AL] Mouvement gameObject

Message par boubouk50 » 18 Mars 2019 17:31

J'ai rien compris. C'est du gruyère ton explication. Il manque tellement d'infos intermédiaires. Tu n'es pas sur Twitter, t'es pas limité en caractères. Donc vas-y, explique moi comme si j'y connaissais rien et si j'étais aveugle.
J'ai donc un modèle 3D d'un bateau.
Celui-ci est placé sur un plan d'eau.
J'ai donc pour objectif de faire du temps réel.
ça c'est ta scène 3D, je suppose? Celle où tu veux que ce bateau bouge?
J'ai donc un objet qui est envoyé par socket UDP qui contient la hauteur
Si jamais tu sors cette phrase à n'importe qui, tu remarqueras l'étonnement et l'incompréhension sur son visage. Explique STP.
Comment contrôles-tu le bateau? C'est quoi cet objet? Pourquoi tu passes par du réseau? Quels sont tes inputs? etc.
Ensuite, la façon dont tu le conçois, je m'en fiche. Il faut que je comprenne ce que tu veux faire et quels sont les moyens pour le faire.
"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 10:35

Ok bon ... Je reprends ^^

Donc, mon projet se constitue en 2 parties :

La première est totalement externe à unity et fonctionne sur un serveur. Elle permet d'effectuer de nombreux calculs en rapport avec mon bateau comme son enfoncement dans l'eau, sa vitesse, son tangage, roulis, etc etc.

Mon objectif est donc d'avoir une visualisation graphique de ces calculs, pour celà j'ai donc une seconde partie qui est sous Unity. Le bateau doit bouger en fonction des données envoyées par le programme de calcul.

J'ai donc créé dans un premier temps un rendu 3D d'un bateau que j'ai ajouté dans ma scène, une fois ca fait, j'ai ajouté un plan d'eau à l'aide de ce repo github (https://github.com/eliasts/Ocean_Community_Next_Gen).

Je dois désormais faire en sorte que ce bateau bouge.
Pour celà j'ai décidé de faire communiquer mon programme de calcul et Unity par socket UDP.

La communication fonctionne de la facon suivante :

> Unity est considéré comme le serveur et est en écoute sur un port bien précis (5001)
> Le programme de calcul lui envoie un objet "serialized" contenant toutes les valeurs citées précédemment, donc vitesse, roulis, etc.
> Le programme de calcul envoie un objet 1 fois toutes les 60ms, mon but est d'avoir une visualisation sous Unity en temps réel ou presque.
> Une fois l'objet recu par Unity, je le deserialize et transforme en un objet de type "waves".

> Ma classe "waves" a exactement la même structure que celle envoyée par le programme de calcul.
La voici :

Code : Tout sélectionner

[Serializable]
public class waves
{
    public double a { get; set; }
    public double l { get; set; }
    public double st { get; set; }
    public double v { get; set; }
    public double nx { get; set; }
    public double ny { get; set; }
    public double rotate { get; set; }
    public double dpl { get; set; }
    public double roulis { get; set; }
    public int oscillation { get; set; }
    public int rolls { get; set; }
    public double h { get; set; }
    public double rud_angle { get; set; }
    public double rpm { get; set; }
}
Je dois donc maintenant faire bouger mon bateau à l'aide des données contenues dans cet objet.


Par exemple si monObjet.hauteur = 10
Alors dans ce cas-là mon bateau doit se trouver en position.y = 10

Pour le moment je fais bouger mon objet de la facon suivante :

Code : Tout sélectionner

public Vector3 newPos;
newPos = new Vector3(newPos.x, (float)Network.wave.h, newPos.z);
transform.position = newPos;
Comme on peut le voir dans le code ci-dessus j'ai une classe "Network" qui assure donc le processus de communication décris précédemment.

Le souci étant qu'avec cela mon bateau a un effet de lag, car j'apelle ce code dans le gameLoop d'Unity, la fonction FixedUpdate()

J'espère avoir été clair ce coup-ci ;)
Merci pour ton aide.

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

Re: [MY - AL] Mouvement gameObject

Message par boubouk50 » 19 Mars 2019 10:59

Ok, c'est mieux, merci.
Le souci, c'est la compensation rafraichissement à 60ms (+/-16fps) -> On était pas à 3 secondes?
Il faut effectuer les calculs intermédiaires pour la fluidité. Et le seul moyen que je vois c'est l'interpolation des données. Il te faudrait donc travailler sur 2 données entrantes pour le calcul: la précédente et celle en cours. Il te faut aussi le temps entre les deux car il ne sera pas exactement de 60ms à chaque fois, ou alors il faut le fixer.
"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 »