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 :

Problème de réaffichage


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Mic75
    Homme Profil pro
    Développeur Frontend
    Inscrit en
    Janvier 2006
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Frontend
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 143
    Par défaut Problème de réaffichage
    Bonjour à tous,
    Je travail actutellement sur le module de visualisation 3d d'un logiciel d'imagerie médicale qui utilise openGl, couplé avec le widget GtkGlArea. L'une des fonctionalités liées au module 3d de ce logiciel est la possibilié de déplacer un curseur (une croix) au sein de la scène 3d en cliquant sur la molette de la souris. Par ailleurs le comportement de ce curseur a été codé de telle sorte que si on clique dans le "vide", le curseur disparait, sinon il reste "collé" à la surface de l'objet.

    J'en viens à mon problème :
    Si l'on déplace (lentement) le curseur en gardant la molette enfoncée, celui ci ce déplace bien, mais on constate 2 problèmes majeurs :
    • la taille du curseur ce modifie -> les segments de la croix augmentent en taille
    • il ne colle plus à la surface -> on peut se déplacer dans le vide.
    J'ai volontairement omis de balancer des lignes de code pour d'abord vous décrire le problème de manière globale. Personnellement je vois 2 hyposthèse envisageables :

    1. problème de mise à jour du tampon de profondeur, car la fonction : glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &prof), associe une valeur différente de 1 à prof. Et mon curseur se retrouve dans "les airs" et "le vide" -> la profondeur est erronée
    2. problème de réaffichage car mon curseur (une croix) grandit quand je le déplace

    Ces 2 phénomènes se produisent UNIQUEMENT quand je déplace mon curseur lentement (molette préssée+déplacement lent).


    Comme vous l'avez surement devinez je travail sur un code qui n'est pas de moi, et je suis en train d'apprendre OpenGl sur le tas. Je n'ai donc que les connaissances de bases en la matière et encore , mais je suis en train d'y remédier.

    Merci d'avance pour ceux qui prendront le temps de répondre

  2. #2
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 582
    Par défaut
    Salut et bienvenue

    pour commencer, es tu certain que le module 3D se sert des informations du tampon de profondeur pour savoir si le curseur doit coller à un objet ou non ?

    pour le problème de taille, ta croix grandit toujours ? elle ne rétrécit jamais ? ce n'est pas un effet de profondeur ? (si elle se rapproche, normal qu'elle "grandit")

    est-ce que tu te sert de ce module pour apprendre OpenGL ?
    si oui, si tu veux mon avis, je ne suis pas certain qu'il s'agisse de la meilleure méthode, ou du moins pas la plus simple
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  3. #3
    Membre confirmé Avatar de Mic75
    Homme Profil pro
    Développeur Frontend
    Inscrit en
    Janvier 2006
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Frontend
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 143
    Par défaut
    Salut shenron,
    Je te remercie d'avoir répondu et aussi rapidement qui plus est.
    Pour répondre à tes questions :
    • es tu certain que le module 3D se sert des informations du tampon de profondeur pour savoir si le curseur doit coller à un objet ou non
    -> Je n'en suis pas sûr à 100% vu mon manque de connaissance, mais juge par toi même :

    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
    27
    28
    29
    30
    31
    int UnProject(GLint x, GLint y, dpoint3d *pos3d)
      {
        GLfloat prof;
        GLdouble ModelView_Matrix[16], Projection_Matrix[16];
        GLint Viewport_Matrix[4];
        int status;
     
        /* On récupe l'information de profondeur */
        glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &prof);
        if (prof == 1.0)
        {
          /* On a pointe dans le vide */
          pos3d->x = 0.0;
          pos3d->y = 0.0;
          pos3d->z = 0.0;
          status = -1;
        }
        else
        {
          /* On recupere le reste : les matrices de modele, de projection et le viewport */
          glGetDoublev(GL_MODELVIEW_MATRIX, ModelView_Matrix);
          glGetDoublev(GL_PROJECTION_MATRIX, Projection_Matrix);
          glGetIntegerv(GL_VIEWPORT, Viewport_Matrix);
     
          /* Et enfin les coordonnées 3D qui correspondent */
          gluUnProject((GLdouble)x, (GLdouble)y, (GLdouble)prof, ModelView_Matrix,
                     Projection_Matrix, Viewport_Matrix, &(pos3d->x),&(pos3d->y),&(pos3d->z));
          status = 0;
      }
      return status;
      }
    D'après le RedBook , et si j'ai bien compris , GluUnProject affect à pos3d->x,y,z les coordonnées objets en fonction des coordonnées fenêtres passées en paramètre (x,y, et prof)

    • ta croix grandit toujours ? elle ne rétrécit jamais ? ce n'est pas un effet de profondeur ? (si elle se rapproche, normal qu'elle "grandit")
    ->Concernant cette partie je peux t'assurer qu'il ne s'agit pas d'un effet de profondeur. La croix se contente de grandir, mais le "relief" n'influe pas sur sa croissance. Je le répète se phénomène ne se produit que lorsque l'on se déplace lentement.
    D'autre part , tu as surement remarqué dans le code précédent qu'on vérifie si l'on pointe dans le vide ou non. Dans une autre partie du code, on décide de rendre le curseur invisible dans le cas où on pointe dans le vide.
    Et bien en déplaçant lentement le curseur , on arrive a se "promener" dans le vide, j'ai donc vérifié la valeur de prof dans ces cas là et bien évidemment elle est différente de 1,donc la profondeur calculée est fausse, d'ou mon rapprochement avec le tampon de profondeur.
    Autre bizarrerie : dans le code la taille de la croix est constante et rien dans la façon dont elle est créée ne laisse présager un changement de taille, c'est pour cette raison que je pense à un problème de réactualisation de l'affichage.

    • est-ce que tu te sert de ce module pour apprendre OpenGL?
    Non, je ne me sers pas de ce module pour apprendre openGl, j'essaie de me documenter et suivre des tutos en parallèle.
    Cependant que fais tu du viel adage qui dit que c'est en forgeant qu'on devient forgeron. C'est sûr que c'est de loin pas la méthode la plus facile pour apprendre, étant donné qu'il s'agit d'un code d'autres développeurs chevronnés, par ailleurs il s'agit de mon projet de stage de DUT,je prend donc des risques, mais c'est également une source motivation importante.

    Toujours est-il que je te remercie d'avoir montré un intérêt à mon problème et je reste attentif à toutes les suggestions.

  4. #4
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 582
    Par défaut
    Ce genre de test, je n'aime pas trop, un test d'égalité de variable flotante c'est relativement imprécis, le code est de toi ?
    j'imagine que non d'après ce que tu disais avant, cela doit faire partie du module 3D en question
    je préfère dans ces cas là tester une valeur supérieure ou égale avec un epsilon, autant que possible, ça évite des erreurs de précision

    en tout cas, c'est certain que seul le tampon de profondeur est utilisé pour le test

    pour le changement de taille du curseur, si le Z est bien la coordonnée indiquant l'éloignement, celui-ci est-il constant ?
    la croix est dessinée en mode orthogonal ou en mode projection ? (gluOrtho2D ou gluPerspective ?)
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  5. #5
    Membre confirmé Avatar de Mic75
    Homme Profil pro
    Développeur Frontend
    Inscrit en
    Janvier 2006
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Frontend
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 143
    Par défaut
    Ce genre de test, je n'aime pas trop, un test d'égalité de variable flotante c'est relativement imprécis, le code est de toi ?
    je préfère dans ces cas là tester une valeur supérieure ou égale avec un epsilon, autant que possible, ça évite des erreurs de précision
    En effet le code n'est pas de moi, par contre je ne vois pas trop ou tu veux en venir concernant le test de la profondeur. On ne s'intéresse ici qu'au cas ou l'on pointe dans le vide , donc celle ci doit être maximale ( i.e égal à 1.0). Or il se trouve, que ce test marche en "point par point", c'est a dire lorqu'on est ne se déplace pas lentement avec la mollette enfonçée, mais qu'on effectue un simple clic.
    Je persiste à penser qu'il s'agit d'un problème de réactualisation d'un tampon ou je ne sais trop quoi, car le fait de déplacer le curseur en gardant la molette enfoncée génère beaucoup d'appels à la fonction contenant le code que je t'ai fournit (autant qu'il ya de points concernés). Si ça te parait confus, n"hésite pas à me reprendre, il est possible que je sois en train de dire n'importe quoi

    pour le changement de taille du curseur, si le Z est bien la coordonnée indiquant l'éloignement, celui-ci est-il constant ?
    la croix est dessinée en mode orthogonal ou en mode projection ? (gluOrtho2D ou gluPerspective ?)
    Comme tu peux le voire ci dessous , pour dessiner le curseur, on se base sur ses coordonnées dans l'espace , et d'une taille constante size_p. Je ne comprend pas l'origine de ce changement de taille.

    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
    float size_p = 0.05 ;
          float x_p = scene->x_pointeur;
          float y_p = scene->y_pointeur;
          float z_p = scene->z_pointeur;
          glDisable(GL_LIGHTING);
          glLineWidth(2.0);
          glColor3f(0.0, 0.2, 1.0);
          glBegin(GL_LINES);
          glVertex3f(x_p - size_p, y_p - size_p, z_p + size_p);
          glVertex3f(x_p + size_p, y_p + size_p, z_p - size_p);
          glVertex3f(x_p - size_p, y_p + size_p, z_p - size_p);
          glVertex3f(x_p + size_p, y_p - size_p, z_p + size_p);
          glVertex3f(x_p - size_p, y_p - size_p, z_p - size_p);
          glVertex3f(x_p + size_p, y_p + size_p, z_p + size_p);
          glVertex3f(x_p - size_p, y_p + size_p, z_p + size_p);
          glVertex3f(x_p + size_p, y_p - size_p, z_p - size_p);
          glEnd();
    Pour répondre à ta dernière question , tous les objets sont dessinés en mode projection, enfin il me semble...

  6. #6
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 582
    Par défaut
    ok j'ai peut-etre une idée d'où peut venir ton problème :
    lorsque tu dessines ta croix, tu écris des infos dans le zbuffer, et donc tu modifies le z
    essaies de désactiver l'écriture dans le zbuffer lorsque tu dessines ta croix pour voir (avec glDepthMask(0) je crois)

    pour ce qui est du problème de taille, tu dessines ta croix en perspective et avec des coordonnées spaciales, si ton z_p change (la croix se rapproche de toi par exemple) elle grandira, l'effet de perspective, plus un objet se rapproche plus il grandit
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/06/2012, 14h45
  2. Problème de réaffichage
    Par philippef dans le forum Langage
    Réponses: 2
    Dernier message: 04/12/2006, 16h09
  3. Réponses: 2
    Dernier message: 02/08/2006, 17h21
  4. [Dates] Problème de réaffichage des données
    Par HwRZxLc4 dans le forum Langage
    Réponses: 7
    Dernier message: 10/05/2006, 21h04
  5. Problème de réaffichage d'image
    Par benj63 dans le forum C++Builder
    Réponses: 2
    Dernier message: 09/12/2004, 09h41

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