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

C++ Discussion :

Triangulation d'un polygone 3D complexe


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 152
    Points : 61
    Points
    61
    Par défaut Triangulation d'un polygone 3D complexe
    Bonjour,

    Je cherche à convertir des polygones 3D en triangles pour pouvoir les afficher dans un viewer.

    Mon polygone est constituer d'une liste de points, et je voudrais savoir si il existe une lib en C++, voir une fonction OpenGL qui me retourne la liste des points résultant de la conversion du polygone en triangle.

    Je suis souvent tombé sur l'algorithme de Delaunay mais j'avoue ne pas savoir si cela conviendrai à mon problème .

    Merci de votre aide.

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Recherche sur le forum : trianguler triangulation
    google + trianguler triangulation
    Citation Envoyé par wiki
    La triangulation d'un polygone convexe est triviale et se calcule en un temps linéaire, par exemple en partant d'un sommet et en ajoutant des arêtes avec tous les autres sommets.

  3. #3
    Membre actif Avatar de Twindruff
    Inscrit en
    Janvier 2005
    Messages
    216
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 216
    Points : 237
    Points
    237
    Par défaut
    Tu peux faire ça directement en OpenGL avec glu, regarde la doc de gluTessCallback. L'index de la doc est ici.

  4. #4
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    La triangulation de Delaunay est très bien. Voir la bibliothèque CGAL.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 152
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par Twindruff Voir le message
    Tu peux faire ça directement en OpenGL avec glu, regarde la doc de gluTessCallback. L'index de la doc est ici.
    Bonjour,

    je suis justement en train de tester cette méthode. J'ai définie les différentes fonction et Callback, seulement je n'arrive pas à récupérer le résultat.

    Je me suis basé sur ce tuto

    Je me doute que le résultat de la tesselation est contenue dans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private:
     
    GLUtesselator * tobj; // the tessellation object
    Le probleme est que je n'arrive pas activer la moindre méthode ou acceseur de mon tobj.
    J'ai trouvé ca structure ici

    Je rappel que je souhaite récupéré les sommets des triangles, et non pas afficher le résultat grâce à OpenGL.

    Merci pour le coup de main.

    /*EDIT*/

    J'ai oublié de préciser que lorsque je regarde GLU.h, la classe GLUtesselator est définie de la façon suivante :
    class GLUtesselator;

    Ce qui est très éloigné de la déclaration pointé par mon lien précédent.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 152
    Points : 61
    Points
    61
    Par défaut
    En lisant la doc bien en détail, j'ai compris que le resultat était stocké dans
    dataOut de la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void myCombine( GLdouble coords[3], VERTEX *d[4],
                    GLfloat w[4], VERTEX **dataOut )
    Il ne me reste plus qu'a trouver un moyen de remonter ce dataOut (je ne suis pas du tout spécialiste des callback)

    Merci pour la doc donc.

  7. #7
    Membre actif Avatar de Twindruff
    Inscrit en
    Janvier 2005
    Messages
    216
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 216
    Points : 237
    Points
    237
    Par défaut
    Alors attention ici tobj n'est pas un objet au sens C++, tu n'as pas de new ou d'accesseur c'est seulment un pointeur que tu transmets aux fonctions de tessellation.
    Et aussi je crois que tu n'as pas compris l'utilité des fonctions callbacks, le principe c'est que tu définis plusieurs fonctions que glu va appeler pour te transmettre le résultat de la triangulation. En gros tu donnes une forme à glu en utilisant gluTessVertex et lui il appelle tes fonctions pour te dire le résultat. Tu as trois fonction (callback) importantes à définir, tBegin, tVertex et tEnd (c'est des noms que j'ai choisis).
    La fonction tBegin(prim) sera appelée quand il commence à te donner une primitive de type prim (triangle, ...).
    La fonction tVertex(data) est appelée pour te donner un vertex.
    Et tEnd quand la primitive est finie.

    donc par exemple tu pourrais faire quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void CALLBACK tBegin(GLenum prim)
    { 
    	glBegin(prim);
    }
     
    void CALLBACK tVertex (void *data)
    { 
    	glVertex3dv((GLdouble*)data);
    }
     
    void CALLBACK tEnd ()
    { 
    	glEnd();
    }
    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
    16
    17
    18
    19
    20
    21
    22
    GLUtesselator *tobj = gluNewTess();
     
    // dire à tobj quelles callbacks il doit appeler
    gluTessCallback(tobj, GLU_TESS_BEGIN, tBegin);
    gluTessCallback(tobj, GLU_TESS_VERTEX, tVertex);
    gluTessCallback(tobj, GLU_TESS_END, tEnd);
     
     
    gluTessBeginPolygon(tobj, NULL); 
    gluTessBeginContour(tobj); 
     
    // boucle sur les vertex de ta forme
    for(...)
    {
    	v = <vertex i de ta forme>
    	gluTessVertex(tobj, (GLdouble*)v, data);
    	// le dernier paramètre est passé à ta callback tVertex
    }
     
    gluTessEndContour(tobj); 
    gluTessEndPolygon(tobj); 
    gluDeleteTess(tobj);
    L'intérêt de passer par des callbacks c'est qu'il n'y a pas de structure de donnée intermédiaire où le résultat de la triangulation serait stocké, c'est streamé, et ça t'apporte beaucoup de souplesse.

    Avec ce choix de callback tu vois qu'on affiche directement le résultat mais il serait plus malin de sauver le résultat si cette chose doit être affichée plusieurs fois.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 152
    Points : 61
    Points
    61
    Par défaut
    Merci, c'est un peu plus clair maintenant.

    Cependant j'ai sauvegardé le résultat car je ne souhaite pas l'afficher directement.

    Merci pour les explications

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

Discussions similaires

  1. Triangulation de polygones sans intersection
    Par justherv10 dans le forum Traitement d'images
    Réponses: 4
    Dernier message: 22/03/2011, 13h24
  2. [2D] Transformer un polygone complexe en triangle
    Par Kewlcool dans le forum Développement 2D, 3D et Jeux
    Réponses: 11
    Dernier message: 11/12/2008, 21h20
  3. triangulation d'une matrice complexe
    Par lili81 dans le forum Mathématiques
    Réponses: 9
    Dernier message: 14/06/2008, 15h12
  4. [LOD] Polygons complexes
    Par Mucho dans le forum OpenGL
    Réponses: 4
    Dernier message: 20/10/2006, 14h30
  5. Triangulation de Polygones
    Par seb_lisha dans le forum DirectX
    Réponses: 1
    Dernier message: 01/07/2003, 12h40

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