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

Algorithmes et structures de données Discussion :

Calcul de la matrice d'inertie d'un modèle 3D


Sujet :

Algorithmes et structures de données

  1. #1
    Membre averti Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Points : 417
    Points
    417
    Par défaut Calcul de la matrice d'inertie d'un modèle 3D
    Bonjour à tous
    Il s'agit la d'une question ouverte : Comment calculer la matrice d'inertie d'un modèle 3D ?
    Sachant que j'ai plusieurs données en entrée possible :
    - Le fichier .x du modèle 3D
    - La tétraèdrisation de delaunay du modèle 3D
    - Le sphere tree du modèle 3D

    Je peux déjà calculer le volume de manière exacte avec la tétraèdrisation, je connais la masse et la masse volumique (on suppose que le solide est homogène)

    J'ai déjà essayé :
    - D'utiliser le dernier niveau du sphere tree. J'ai calculé la matrice d'inertie de chaque sphère, les aient déplacées toutes au même point, puis sommées. Le résultat est désastreux car les sphères peuvent se chevaucher beaucoup.
    - De ne mettre que l'identité comme matrice d'inertie . Le moteur physique déplace tout ce petit monde comme si c'était des boules, et je pense que je passe à côté de certaines choses intéressantes. (enfin c'est naze d'avoir un moteur physique qui fait ses calculs en tenant compte des moments d'inerties et de les mettre à 1)

    Merci d'avance
    Première grosse démo en construction :
    http://bitbucket.org/rafy/exo2/

  2. #2
    Membre habitué Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Points : 157
    Points
    157
    Par défaut
    Bon, j'ai lu en diagonal ce que tu as noté...

    Quelques définitions (cf. wikipedia) pour mettre les choses aux points:
    L'inertie d'un corps est sa propriété de conserver une vitesse constante (ou de rester immobile) lorsqu'aucune force externe ne s'y applique, ou que les forces qui s'y appliquent s'équilibrent. Le moment d'inertie est l'équivalent rotationnel de l'inertie.

    Le moment d'inertie d'un corps par rapport à un axe (vu que c'est une rotation) se calcule est égale à la somme de chacune de tes masses multipliées par la distance au carré entre cette masse et ton axe. La formule peut s'exprimer sous la forme d'un produit vectoriel: http://fr.wikipedia.org/wiki/Moment_d%27inertie

    La matrice d'inertie est un outil mathématique utilisé pour décrire les efforts d'inertie appliqués à un solide. La méthode de calcul est disponible ici: http://fr.wikipedia.org/wiki/Matrice_d%27inertie

    Tu verras que certains éléments sont égales aux moments d'inerties et d'autres sont les produits de ceux-ci.

    Rodrigue

  3. #3
    Membre averti Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Points : 417
    Points
    417
    Par défaut
    ben en fait je sais calculer les moments d'inertie avec les formules.... Mais ça ne me sert pas dans ce cas la hein....
    Genre avec un lapin, ben le terme noté A dans la matrice (intégrale des (y^2 + z^2) dm), je ne vois pas comment je peux le calculer... je ne connais pas l'équation de la surface définissant le lapin...
    Ce que je voudrai c'est une méthode autre qu'en passant par ces intégrales...
    Première grosse démo en construction :
    http://bitbucket.org/rafy/exo2/

  4. #4
    Membre habitué Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Points : 157
    Points
    157
    Par défaut
    Genre avec un lapin, ben le terme noté A dans la matrice (intégrale des (y^2 + z^2) dm), je ne vois pas comment je peux le calculer... je ne connais pas l'équation de la surface définissant le lapin...
    Ce que je voudrai c'est une méthode autre qu'en passant par ces intégrales...
    Cela n'a rien à voir avec la surface du lapin! Je t'explique...

    Prenons un exemple simple: mettons que tu aies un corps rigides composé de 3 masses notées:
    - mi, mj, mk
    toutes positionnées respectivement en:
    - (xi, yi, zi),
    - (xj, yj, zj),
    - (xk, yk, zk),

    et que tu souhaites calculer l'inertie de ce corps par rapport à l'axe (x0,y0,z). D'accord?

    On te dit que le moment d'inertie de ce corps par rapport à l'axe (x0,y0,z) est égale à la somme de chacune de tes masses multiplié par le carré de la distance séparant la masse de l'axe:

    Moment d'inertie(x0,y0,z) = mi * sqrt((xi - x0)^2 + (yi - y0)^2) + mj * sqrt((xj - x0)^2 + (yj - y0)^2) + mk * sqrt((xk - x0)^2 + (yk - y0)^2)


    sqrt:= racine carrée (Pythagore pour calculer la distance)

    Donc pour ton lapin, je ne suppose que tu ne connais que les volumes de tes tétraèdres et que tu prends comme hypothèse que ça masse volumique est constante.
    1) Calculer la masse de chacun de tes volumes: masse volumique x volume -> mi
    2) Calculer la distance le centre de gravité de chacun de tes volumes à l'axe qui t'intéresse
    3) Faire la somme de tout ça (il s'agit d'une intégrale discrète)

    Mom.Inertie = \sum_{i=0^{n} m_i \; . \; d_i^2

    Tu remarqueras que pour avoir une grande inertie, on va essayer de mettre de la matière le plus loin possible de l'axe. C'est pour ça que les pieds de table sont creux ou que les cadres de vélo O'Neil en Alu sont vraiment gros. Avec moins de matière, on peut obtenir la même inertie (résistance à la flexion dans ce cas-ci). Essaye de calculer l'inertie d'un cylindre (cf. article moment d'inertie sur wikipedia).

    Une petite vidéo illustrant l'inertie:
    http://fr.video.yahoo.com/watch/2011147

    Encore une remarque:
    Quand on te dit \int (y^2 + z^2) dm: en fait il s'agit de calculer l'inertie par rapport à l'axe des x. Tu comprends? (y^2 + z^2) c'est la distance séparant la masse dm de l'axe (x,0,0)

    Bonne journée
    Rodrigue

  5. #5
    Membre averti Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Points : 417
    Points
    417
    Par défaut En résumé
    (Je sais exactement ce que c'est qu'une matrice d'inertie hein... J'ai fais pas mal de méca quand même. ^^ Mais bon ça peut aider certaines personnes qui lisent ce post à comprendre)

    Faire ce que tu décris ça revient à dire que chaque tétraedre est en fait assimilé à un point de masse égalle à la masse volumique * volume du tétraedre. Puis on calcul la matrice d'inertie du modèle en disant que le modèle est l'assemblage de ces points.... Ca doit être une bonne approximation.
    Il est possible que ça soit une solution.
    J'avais pensé à un truc dans le genre mais au lieu de dire que les tétraèdres étaient des points massique, alors je voulais calculer la matrice d'inertie d'un tétraedre..... Mais ça c'est chaud aussi ^^
    Je vais essayer de voir ce que me donne cette technique.
    J'ai un modeleur 3D qui me donne la matrice d'inertie d'un modèle. Je vais faire un modèle, l'exporter calculer la matrice avec cette méthode et comparer les résultats....

    Je ne met pas le tag résolu tout de suite, si d'autres personnes veulent ajouter / modifier des choses...
    Première grosse démo en construction :
    http://bitbucket.org/rafy/exo2/

  6. #6
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 638
    Points
    7 638
    Par défaut
    Citation Envoyé par Rafy Voir le message
    Faire ce que tu décris ça revient à dire que chaque tétraedre est en fait assimilé à un point de masse égalle à la masse volumique * volume du tétraedre. Puis on calcul la matrice d'inertie du modèle en disant que le modèle est l'assemblage de ces points.... Ca doit être une bonne approximation.
    [...]
    Je vais essayer de voir ce que me donne cette technique.
    J'ai un modeleur 3D qui me donne la matrice d'inertie d'un modèle. Je vais faire un modèle, l'exporter calculer la matrice avec cette méthode et comparer les résultats....
    Si tu as beaucoup d'écart, essaye de tétraèdriser tes tétraèdres, si ils sont "gros" (entre guillemets, vu que c'est relatif...).
    Normalement en diminuant la taille des unités de volume, tu devrais limiter la valeur du terme dû à l'inertie propre des volumes.
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  7. #7
    Membre habitué Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Points : 157
    Points
    157
    Par défaut
    (Je sais exactement ce que c'est qu'une matrice d'inertie hein... J'ai fais pas mal de méca quand même. ^^ Mais bon ça peut aider certaines personnes qui lisent ce post à comprendre)
    Voilà, ça servira aux autres

    alors en ce qui concerne le calcul de la matrice d'inertie d'un tétraèdre, je pense que tu peux commencer par calculer la matrice d'inertie d'un parallépipède qui enbloge ton tétraèdre puis tu soutrais les matrices d'inertie des tétraèdres droits pour revenir à ton tétraèdre d'origine (c'est juste une additivité au niveau des intégrales).... je ne sais pas si je suis clair là

    Une fois que tu est capable de calculer la matrice d'inertie d'un tétraèdre doit à ce moment là c'est "finger in the noise!"
    Rodrigue

  8. #8
    Membre averti Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Points : 417
    Points
    417
    Par défaut
    alors en ce qui concerne le calcul de la matrice d'inertie d'un tétraèdre, je pense que tu peux commencer par calculer la matrice d'inertie d'un parallépipède qui enbloge ton tétraèdre puis tu soutrais les matrices d'inertie des tétraèdres droits pour revenir à ton tétraèdre d'origine (c'est juste une additivité au niveau des intégrales).... je ne sais pas si je suis clair là
    Hum je ne vois pas trop ce que tu veux dire par "tétraedres droit".
    Mais toujours est-il que le tétraedre dont je veux calculer la matrice d'inertie, est quelconque. Si je met un parallèlépipède autour, il ne sera pas aligné sur les axes x, y, z. Il faudra donc faire un changement de repère.
    Une fois qu'on a le parallèlépipède dans un repère correcte, ben c'est pas fini car la matrice d'un tétraedre, même régulier, ben il n'existe pas de formule :p
    Je soutiens que c'est pas facile quand même .
    Première grosse démo en construction :
    http://bitbucket.org/rafy/exo2/

  9. #9
    Membre habitué Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Points : 157
    Points
    157
    Par défaut
    Comme il s'agit d'un problème intéressant, j'ai fait quelque recherche sur internet.
    Je pense qu'avant de pouvoir calculer la matrice d'inertie d'un tel élément, il faut déjà être capable de calculer son volume. Bon directement, je pense aux intégrales, voici un excellent lien avec un exemple concernant un tétraèdre:
    http://books.google.be/books?id=dFxz...sult#PPA303,M1

    En fouillant encore, je suis retombé sur la formule de Héron qui permet de calculer l'aire d'un triangle quelconque à partir de la longueur de ses côtés... Pour l'intégrale c'est pratique, tu sommes des volumes infinitésimaux égales à la surface de triangles quelconque S par dh un acroissement élémentaire suivant la hauteur de ton tétraèdre...
    http://fr.wikipedia.org/wiki/Formule_de_H%C3%A9ron

    Une fois que tu sais faire ça (p-e par un autre moyen), tu recommences le même calcul mais là en pondérant par x^2, y^2 ou x*y, etc. pour calculer ta matrice d'inertie.

    Je suis certain qu'une telle formule doit exister dans des cours d'éléments finis!

    Sur wikipedia on dit:
    Pour les tétraèdres [modifier]

    Le volume d'un tétraèdre est donné en fonction de la longueur de ses arêtes par le déterminant de Cayley-Menger.
    Rodrigue

  10. #10
    Membre habitué Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Points : 157
    Points
    157
    Par défaut
    Buchholz, R. H. "Perfect Pyramids." Bull. Austral. Math. Soc. 45, 353-368, 1992. http://www.geocities.com/teufel_pi/p...ctpyramids.pdf.
    Rodrigue

  11. #11
    Membre habitué Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Points : 157
    Points
    157
    Par défaut
    Voilà, désolé pour les posts en rafale mais je pense que j'ai trouvé:
    http://number-none.com/blow/inertia/bb_inertia.doc

    Bon amusement, tiens nous au courant !
    Rodrigue

  12. #12
    Membre averti Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Points : 417
    Points
    417
    Par défaut Pour le volume...
    Ben en fait pour le calcul du volume du modèle c'est bon, je pouvait déjà le faire avant. Comme j'ai la tétraèdrisation de mon modèle 3D, calculer le volume d'un tétraèdre c'est pas dur... Il suffit de faire la somme des volumes des tétraedres de la tétraedrisation...
    Je vais surement coder le calcul de la matrice d'inertie ce weekend, je donnerai les premiers résultats surement durant la semaine prochaine....
    Première grosse démo en construction :
    http://bitbucket.org/rafy/exo2/

  13. #13
    Invité
    Invité(e)
    Par défaut Brian Mirtich
    Ce problème a déjà été très bien traité par Brian Mirtich en 1995.

    Il a écrit un code qui calcule la position du centre de gravité d'un maillage ainsi que les 3 moments d'inertie et les 3 produits d'inerties par rapport au centre de gravité et à ses axes locaux.

    En entrée du programme, il faut juste avoir un maillage (triangulaire ou non) et connaitre la masse volumique du maillage (si la masse volumique vaut 1.0, le code calcule les moments quadratiques ).

    Vous pouvez récupérer le code de Brian Mirtich ici : http://www.cs.berkeley.edu/~jfc/mirtich/massProps.html il s'appelle "Fast and Accurate Computation of Polyhedral Mass Properties", c'est un petit programme en C qui fonctionne avec des maillages au format "Polyhedron", c'est une sorte de format .off facile à créer.

    Après, pour que son code C soit plus facile à utiliser, je l'ai porté en Python pour Blender.
    Dans Blender il suffit d'ouvrir un maillage, de le sélectionner (clic droit dans Blender) et d'appeler le code de Brian Mirtich par le menu "Object / Scripts" de Blender... Elle est pas belle, la vie ?

    Le script pour Blender est ici, ainsi que sa notice d'utilisation en pdf...
    Dernière modification par Invité ; 25/12/2008 à 14h13. Motif: Ajout url

  14. #14
    Membre habitué Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Points : 157
    Points
    157
    Par défaut
    Merci pour ton aide kaji! J'ai lu en diagonal l'article (j'ai des erreurs sur certaines pages lorsque je l'ouvre avec gsview), on aurait pu le trouver hum

    J'ai lu le code source fournis, c'est assez court. Il suffit de modifier la fonction void readPolyhedron(char *name, POLYHEDRON *p) {...}
    pour l'adapter à son format de fichier (refactoring).

    Bon WE
    Rodrigue

Discussions similaires

  1. Calcul de la matrice d'inertie d'un modèle 3D
    Par Rafy dans le forum Physique
    Réponses: 0
    Dernier message: 15/06/2008, 09h47
  2. Calcul sur des matrices
    Par Ptinéwik dans le forum MATLAB
    Réponses: 2
    Dernier message: 21/01/2008, 10h37
  3. Calcul d'une matrice dans une boucle for
    Par david_Montreal dans le forum MATLAB
    Réponses: 7
    Dernier message: 11/07/2007, 17h17
  4. [Maths] Calcul de la matrice de projection
    Par HanLee dans le forum Développement 2D, 3D et Jeux
    Réponses: 3
    Dernier message: 03/07/2007, 01h52
  5. Calcul de la matrice Hessienne
    Par pseudocode dans le forum Traitement d'images
    Réponses: 15
    Dernier message: 02/05/2007, 18h18

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