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

  1. #1
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    mars 2013
    Messages
    60
    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 : 60
    Points : 63
    Points
    63

    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 du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    mars 2013
    Messages
    60
    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 : 60
    Points : 63
    Points
    63

    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
    24 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : mai 2008
    Messages : 24 160
    Points : 177 098
    Points
    177 098
    Billets dans le blog
    47

    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 du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    mars 2013
    Messages
    60
    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 : 60
    Points : 63
    Points
    63

    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 du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    mars 2013
    Messages
    60
    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 : 60
    Points : 63
    Points
    63

    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
    24 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : mai 2008
    Messages : 24 160
    Points : 177 098
    Points
    177 098
    Billets dans le blog
    47

    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 du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    mars 2013
    Messages
    60
    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 : 60
    Points : 63
    Points
    63

    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 du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    mars 2013
    Messages
    60
    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 : 60
    Points : 63
    Points
    63

    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

Discussions similaires

  1. Réponses: 77
    Dernier message: 04/01/2010, 04h41
  2. Réponses: 5
    Dernier message: 04/01/2008, 09h55
  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, 21h04
  4. Réponses: 7
    Dernier message: 29/06/2006, 08h54
  5. msaccess a provoqué une erreur dans KERNEL32.dll
    Par massol joel dans le forum Access
    Réponses: 12
    Dernier message: 03/04/2006, 14h32

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