Bonjour,
J'ai un problème très similaire. Ma toupie évolue correctement et avec les bonnes valeurs. J'ai vérifié les valeurs en affichant la position de la toupie en format texte après chaque pas de temps. Sauf que quand je dessine la même toupie avec le graphisme, elle tourne de manière désordonnée et s'éloigne du centre jusqu'à disparaître de l'écran. Je ne comprends pas quelle est la raison de ce comportement de la toupie et comment y remédier. Par contre, en affichant les valeurs d'évolution en parallèle de l'affichage graphique, j'ai remarqué que vers la fin de la simulation certaines valeurs des vecteurs deviennent négatives... Je ne comprends pas à quoi cela peut être dû, est-ce que c'est lié à la divergence de l'intégrateur Euler Cromer ? Je tiens à préciser que j'ai bien mis un modulo 2pi, ce n'est donc pas la cause de ce soucis.
Merci d'avance
Je ne comprends pas à quoi cela peut être dû, est-ce que c'est lié à la divergence de l'intégrateur Euler Cromer ?
Cela y ressemble en tout cas. Essaye de tourner avec un plus petit pas de temps dans GLWidget, là où tu redémarres le chronomètre.
Attention à la façon dont tu prends le modulo également, car il peut retourner des valeurs négatives, par exemple "std::fmod(-5.1,3)" donne "-2.1".
J'ai essayé, mais ma toupie a toujours le même comportement. Ce que je ne comprends pas est qu'elle tourne mais elle s'éloigne en même temps du centre (elle ne fait pas que une rotation sur elle-même), alors que pourtant dans la méthode, je fais seulement tourner les axes et je ne lui fais faire aucune translation. Je ne comprends pas d'où ça peut venir, j'ai vérifié en mettant un cout que la fonction translate n'était pas appelée et ce n'est effectivement pas le cas.
Donc, quand tu dessines ta Toupie (avec VueOpenGL), tu n'utilises ni "translate" ni "scale"? Simplement "rotate"? As-tu bien pensé à appeler QMatrix4x4::setToIdentity() avant de faire des rotations?
Assure toi également que ta caméra est fixe, et que ce n'est pas elle qui s'éloigne par erreur.
Salut,
je ne sais pas si tu as résolu ton problème, mais j'ai eu le même. Quand j'ai réessayé avec un intégrateur Newark ou Runge-Kutta d'ordre 4, tout allait bien.
Julius Girardin
Une réponse globale à ce genre de problèmes :
c'est possible que ceci soit du à un pas d'intégration trop grand.
Affichez le pas d’intégration que vous utilisez (par exemple en affichant la variable dt dans GLWidget::timerEvent()) et ajustez le ratio entre le temps réel mesuré et ce dt (le ratio est à 1000.0 dans l'exemple donné mais ce n'est certainement pas assez grand) : visez d'avoir un dt similaire (ou plus petit) à celui utilisé dans les exemples testés en mode texte (dt = 0.01)