IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XNA/Monogame Discussion :

Une erreur d'arrondi ou de dll ?


Sujet :

XNA/Monogame

  1. #1
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2013
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 72
    Points : 85
    Points
    85
    Par défaut Une erreur d'arrondi ou de dll ?
    Bonjour,

    J'ai refais mon moteur physique et j'ai voulu en faire une dll.
    J'ai réussi à implémenter mes softs et hard constraints pour particules et rigidbodies => ce n'était pas de tout repos

    Du coup, je me suis attaquer à la dernière partie et logiquement la plus simple ( ce n'est que du recopiage grosso modo), implémenter mon moteur de collision qui marche très bien dans ma dll.

    Sauf que, à ma grande surprise, j'ai des gros soucis finalement.

    Dans mon jeu actuel, la détection et la réponse fonctionne très bien. J'utilise la méthode Verlet comme intégration.
    Pour une élasticité de 100%, mon énergie cinétique reste bien inchangée.

    Mais dans ma dll, pour une élasticité de 100%, mon Ec reste bien identique tant que je n'applique pas de force qui viendrait perturber le cycle.

    J'ai fais plusieurs test,j'ai arrondi à 2 chiffres après la virgule ma vélocité, mes positions, mes accélérations. cela fonctionne comme dans le jeu, mais pas tout le temps
    Si je met une gravité à seulement 1 chiffre derrière la virgule, c'est stable assez longtemps, mais avec 2 chiffres, c'est la foire au n'importe quoi dans les 2 secondes qui viennent.
    Dans mon jeu, cela n'a aucune incidence et pourtant tout est implémenter de la même manière, de l'intégration en passant par la détection jusqu'à l'ordre de compilation.


    Je ne comprends vraiment rien à ce qu'il se passe. Erreur d'arrondi, ma dll est-elle en cause?
    En général je m'en sort tout seul lorsqu'il s'agit de réfléchir à un problème d'algo, de logique etc, mais là je suis complétement perdu .

    Merci de votre aide par avance.

  2. #2
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2013
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 72
    Points : 85
    Points
    85
    Par défaut
    D'après mes tests,

    La vitesse restituée après la collision est de 100% -> ok
    L'ancienne vitesse (lorsque le truc bizarre fais des siennes) == velocity - accéleration;

    En fait, il y a la perte de l’accélération sur l'aller-retour, mais pas tout le temps

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 826
    Points : 218 287
    Points
    218 287
    Billets dans le blog
    117
    Par défaut
    Bonjour,

    La mise en DLL révèle surement d'un problème, qui était déjà là dans le code. Par exemple, une variable statique par initialisée, ou une variable non initialisée.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  4. #4
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2013
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 72
    Points : 85
    Points
    85
    Par défaut
    Bonjour,

    J'ai refais un projet sans dll, reprenant uniquement mes classes shapes,body, et mes intégrations/collisions.

    Idem, pas d'erreur du coté des initialisations, puisque sans coeff d'élasticité mes collisions avec ou sans friction fonctionnent parfaitement.
    En revanche, j'ai pu introduire pas mal point de test supplémentaire et finalement j'ai trouvé la cause Enfin, ce n'est pas que cela mais c'est un début.

    Dans mon projet initial ( là où cela "fonctionne parfaitement" bien avec un coeff d'élasticité de 100%), c'est que, par chance finalement, à initialisation mon énergie cinétique Et ma pénétration sont des nombres plutôt "rond", de ce fait même en changeant la gravité( au bon moment lorsque le body s'éloigne de la plateforme), ou en appliquant une impulsion pour mon saut par exemple, mon énergie cinétique reste la même.

    Le soucis apparaît finalement lorsque la vitesse évolue d'une collision à une autre et lorsque l’initialisation ne permet pas une inertie Et une pénétration assez "ronde".

    Du coup j'ai fait des test en intégrant en 2 temps, c'est beaucoup mieux.

    C'est tout de même dingue de s'apercevoir 6 mois après qu'un code qui semblait ne comporter aucun défaut en modifiant plusieurs variables s’avère finalement pas terrible et toujours chanceux à l'init

    Merci du coup de main

  5. #5
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2013
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 72
    Points : 85
    Points
    85
    Par défaut
    Bonjour,

    N'étant pas satisfait du résultat et même si j'ai résolu le problème en faisant comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public void Update(GameTime _gameTime)
    {
         float steps = 5;
         float delta = 1/steps;
     
         for(int =0; i< steps; i++)
         {
              Collide(false); 
              for (int b = 1; b < _count; b++)
              {
                     example.bodyList_[b].Integrate(delta*1);
               }            
         }
         Collide(true); 
    }
    Le booléen passé à la méthode Collide() sert juste a appliqué ou non l'énergie cinétique.
    Est-ce que ce ne serait pas plus propre et plus juste de calculer le TOI?

    Le soucis je l'ai clairement identifié, par example : j'ai normalement 22 boucles pour la chute libre, et sur l'aller-retour c'est que de temps en temps je suis à 43 puis repasse à 44, puis de nouveau 43 pour aller sur 42 boucles.
    Donc on retrouve bien mon erreur équivalente à l'accélération puisque celle-ci ne peut être prise en compte dans la boucle qui manque.

    Merci

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 826
    Points : 218 287
    Points
    218 287
    Billets dans le blog
    117
    Par défaut
    Pourquoi le nombre d'itérations change ? Sur quoi repose t-il ?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  7. #7
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2013
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 72
    Points : 85
    Points
    85
    Par défaut
    Tout repose sur ce schéma principalement.
    Lorsque mon body est en chute libre et qu'il vient entrer en collision avec ma plateforme, on calcule la pénétration.
    On ajoute donc à l'ancienne position et à l'actuelle cette pénétration.
    Vu que j'ai une élasticité de 100%, on rajoute à l'ancienne position l'énergie accumulée avec son coeff d'élasticité.

    Donc à mon avis, le nombre d'itération change lorsqu'il y a collision et que la gravité est de temps en temps prise dans la pénétration et des fois non. Ce qui implique que mon body de temps en temps accéléré et d'autre fois décélère.

    Merci

  8. #8
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2013
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 72
    Points : 85
    Points
    85
    Par défaut
    Bonjour,

    N'étant pas vraiment sûr que se soit ma pénétration qui pose problème ou ma vélocité "sur le moment" qui soit erronée, j'ai changé de méthode pour mon énième test, au lieu de rester sur l'intégration Verlet à 2 pas, je suis passé à la l'intégration Leapfrog, et exactement le même problème, mais il faut attendre le 2ème aller-retour complet avant de voir le problème alors que juste avant je suis à une erreur de 10e-5 près, puis prend 2 fois la gravité dans les dents.

    J'ai fait le test de rajouter uniquement l'énergie cinétique et de se passer de la pénétration avec une élasticité de 100%.
    Méthode Verlet => on ralenti sur un schéma particulier.
    Ec initiale ( premier impact) : 432;
    Ec 2I = 440;
    Ec 3I = 432; ** <==|
    Ec 4I = 427; |
    Ec 5I = 432; |
    Ec 5I = 427; |
    Ec 6I = 420; début du schéma qui se répète ** ==>|
    Ec 7I = 415;
    Cette perte ou gain correspond à ma vélocité*2 selon si ma pénétration est plus ou moins grande que ma vélocité.
    Méthode Leapfrog => on reste identique sur la moyenne des 2 aller-retour, 440,432,440,432.....

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 77
    Dernier message: 04/01/2010, 05h41
  2. Réponses: 5
    Dernier message: 04/01/2008, 10h55
  3. Localiser une erreur d'exécution dans une DLL
    Par papadrago dans le forum C++Builder
    Réponses: 2
    Dernier message: 08/12/2006, 22h04
  4. Réponses: 7
    Dernier message: 29/06/2006, 09h54
  5. msaccess a provoqué une erreur dans KERNEL32.dll
    Par massol joel dans le forum Access
    Réponses: 12
    Dernier message: 03/04/2006, 15h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo