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

OpenGL Discussion :

Vive la Tesselation !


Sujet :

OpenGL

  1. #1
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Par défaut Problème de Tesselation
    Bonjour
    Je fait de la 2D sous openGL.
    Je veux afficher des polygones concaves, mais apparement, openGL ne gère que les poly convexes. La solution est d'utiliser la tesselation, sous GLUT, qui permet, si j'ai bien compris, de découper ton polygone concave en triangles.

    Seulement voilà les tutos là dessus se font rares. Je suis bien tombé sur ce site, mais je trouve son contenu vraiment indigeste. Meme après l'avoir lu, je ne comprend toujours pas ce qu'en une CallBack routine, à quoi elle sert, et comment s'en servir...

    Donc si vous avez un bon tuto (en francais, pliiiiize), ou ne serait-ce que des conseils pour dessiner des poly 2D concaves.... je suis preneur !

    Merci

    Martin

  2. #2
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Par défaut
    Il y a plein d'algo pour tesseliser un polygone non troué (concave ou convexe), plus ou moins optimal (strip, fan, ...).
    En particulier, j'utilise ce code dans le logiciel que je developpe donc ca marche bien, par contre les commentaires sont en anglais.
    Tu spécifies un tableau de vecteurs décrivant le contour de ton polygone, la fonction Process de la classe CTriangulation te retourne un tableau contenant, trois par trois les vecteurs décrivant la série de triangles.
    Tu trouveras en fichier joint le code et le header.
    T'cho.
    Fichiers attachés Fichiers attachés

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Par défaut
    Super, je teste demain et je te dis !
    merci !

    ...et bonne fête de la musique

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Par défaut
    Arg

    Efficaces, tes deux classes, faciles à mettre en place, mais... la tessellation, c'est super long !
    J'affiche des cartes géographiques, avec BEAUCOUP de polygones, et parfois des poly complexes (genre 1000 points) pour une rivière, par exemple.

    Y a t'il des programmes plus performants, comme la Tesselation de chez GLUT (ou glu je sais plus), ou des optimisations à faire (genre display lists)

    Merci

    Martin

  5. #5
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Par défaut
    BON
    J'ai pris mon courage à deux mains, je me suis coltiné la doc opengl sur la tessellation en long en large et en travers. Maintenant je comprends comment ça marche, sauf que ça marche pas

    Voici le code qui déclare le GLUtesselator, les fonctions de callbacks et qui dessine.
    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
    23
    24
    25
    26
    void MaForme::paint(wxGLCanvas * gl.....) {
    	// Un ptit polygone concave
    	double poly[5][3] = {   0.2, 0.2, 0,
    				0.8, 0.2, 0,
    				0.8, 0.8, 0,
    				0.5, 0.5, 0,
    				0.2, 0.8, 0 };
     
    	// Création du tesselator
    	GLUtesselator * tobj = gluNewTess();
    	// Définition des fcts callback
    	gluTessCallback(tobj, GLU_TESS_VERTEX, (void (__stdcall *)(void))vertexCallback);
    	gluTessCallback(tobj, GLU_TESS_BEGIN,  (void (__stdcall *)(void))beginCallback);
    	gluTessCallback(tobj, GLU_TESS_END,    (void (__stdcall *)(void))endCallback);
    	gluTessCallback(tobj, GLU_TESS_ERROR,  (void (__stdcall *)(void))errorCallback);
     
    	// Dessin des 5 points du poly.
    	gluTessBeginPolygon(tobj, NULL);
    		gluTessBeginContour(tobj);
    			for(int i=0; i<5; i++)
    				gluTessVertex(tobj, poly[i], poly[i]);
    		gluTessEndContour(tobj);
    	gluTessEndPolygon(tobj);
     
    	gluDeleteTess(tobj);
    }
    Avec un peu plus haut, en global, les fonctions callbacks :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void vertexCallback(GLvoid * vertex){
    	glVertex3dv((GLdouble *) vertex);
    }
    void beginCallback(GLenum which){
    	glBegin(which);
    }
    void endCallback(){
    	glEnd();
    }
    void errorCallback(GLenum errno){
    	int msg = errno;
    }
    Voila, ce n'est qu'un exemple, j'ai essayé de faire au plus simple.
    J'ai deux problèmes :
    - Le plus important, rien ne s'affiche
    - Lorsque je remplace poly par un polygone créé dynamiquement, ça plante après le GLUdeleteTess()

    Merci à toute personne inspirée.

    Martin

  6. #6
    Membre éprouvé Avatar de razmott
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 133
    Par défaut
    Salut !

    Si tu travailles sous Windows, la première chose que je vois, c'est que tes fonctions n'ont pas le symbole CALLBACK. Ton code devient alors :
    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
    void CALLBACK vertexCallback(GLvoid * vertex
    {
        glVertex3dv((GLdouble *) vertex);
    }
    void CALLBACK beginCallback(GLenum which)
    {
        glBegin(which);
    }
    void CALLBACK endCallback()
    {
        glEnd();
    }
    void CALLBACK errorCallback(GLenum errno)
    {
        int msg = errno;
    }
    Déjà tu auras peut-être de meilleur résultat.

    Si tu veux que ton code soit multi-plateforme rajoute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #ifndef CALLBACK
    #define CALLBACK
    #endif
    Bon coding !

    @+

  7. #7
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Par défaut
    C'est bizarre, ce que tu me dis, parce que même sans les "CALLBACK", les fonctions sont quand même appelées (le point d'arrêt est activé).

    Enfin comme rien ne coûte d'essayer, j'ai testé mais rien n'y fait !
    Ceci dit merci d'avoir tenté

    Donc l'affaire, à mon grand désespoir, n'est toujours pas classée.

  8. #8
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Par défaut
    AH !

    J'ai répondu à ma première question (tiens, c'est dingue j'ai l'impression d'être seul sur ce post ), question qui était "mais pourquoi rien ne s'afiiiiche ?"
    => Très simple, j'avais simplement omi de déclarer une couleur d'affichage.....................(no comment)

    ... et un grand merci à razmott, grace à ses CALLBACK, je peux maintenant utiliser des tableaux dynamiques pour mes polys !

    Aller, on va cloturer ce sujet, bien que je me pose encore des questions sur les glLists et sur comment ne pas utiliser glBegin et glEnd. A moi les tutos !

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

Discussions similaires

  1. vive la syntaxe des languages !
    Par D@rKness74 dans le forum Windows
    Réponses: 2
    Dernier message: 15/09/2004, 14h56
  2. Processus Sql Server prend toute la mémoire vive
    Par cracosore dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 19/02/2004, 18h53
  3. [API] mémoire vive
    Par Halleck dans le forum Windows
    Réponses: 8
    Dernier message: 29/01/2004, 01h17
  4. Utilisation de la mémoire vive....
    Par Neilos dans le forum Windows
    Réponses: 9
    Dernier message: 24/11/2003, 12h09
  5. Dijstra est mort, vive Dijstra
    Par mickael.canevet dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 02/09/2002, 11h42

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