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 rotation => "rideau noir"


Sujet :

OpenGL

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Points : 44
    Points
    44
    Par défaut Problème de rotation => "rideau noir"
    Bonjour,

    Je galère sur mon programme en OpenGL / C++ car j'essaie de faire tourner ma caméra (en appuyant sur deux touches) de sorte à voir le rendu en 3D de ma scène. Le problème c'est que lorsque j'appuie sur les touches et que cette rotation a lieu, ma scène disparaît par morceaux puis réapparaît par d'autres (certains bouts étant cachés par une sorte de "rideau noir".) Je pense que celà proviens de la projection perspective que j'utilise mais je n'en suis pas si sûr (d'autant plus que même en modifiant les paramètres ça n'y fait rien...)

    Voici un extrait du main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    glClearColor(0.0,0.0,0.0,0.0);
    glMatrixMode(GL_PROJECTION);
    gluPerspective(45,1,-1,500);
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_DEPTH_TEST);
    Et le début de ma fonction d'affichage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void display(){
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glShadeModel(GL_SMOOTH);
     
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluLookAt(0,0,-1,0,0,0,0,1,0);
     
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glRotatef(angleX,1,0,0);
    glRotatef(angleY,0,1,0);
    glRotatef(angleZ,0,0,1);
    angleX, angleY et angleZ sont modifiés lorsque j'appuie sur les touches ce qui introduit une rotation (spéciale certes mais c'est juste histoire de voir le volume de ma scène.)

    Je pense que le souci proviens d'un de ces boûts de code... Merci d'avance pour votre aide !

    Alex

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Sans voir plus de code, j'aurais une tendance à dire que cela vient de ton appel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gluPerspective(45,1,-1,500);
    Joue avec les deux derniers paramètres pour voir si cela ne résolu pas le problème...
    Jc

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Points : 44
    Points
    44
    Par défaut
    J'ai essayé plein de combinaisons mais c'est toujours le même problème d'affichage qui revient...

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gluPerspective(45,1,-1,500);
    De toute façon la matrice de projection est redéfinie dès le début de la fonction d'affichage, donc ce code ne sert à rien a priori.

    Un truc paraît bizarre aussi, tu fais un gluLookAt en mode projection, alors que gluLookAt est censé modifier la matrice de modèle-vue. Au mieux ça te laissera avec une matrice de projection à l'identité, au pire ça te mettra n'importe quoi dedans (je ne sais pas si gluLookAt fais un appel à glMatrixMode(GL_MODELVIEW) ou non).

    Ensuite, je pense qu'un screenshot pourrait beaucoup aider à identifier le problème.

  5. #5
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Points : 44
    Points
    44
    Par défaut
    Voilà un screenshot avant la rotation et un pendant (je l'ai choisi assez explicite) :





    On voit bien que l'image est "coupée" en haut et à gauche...

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Tu as essayé de corriger dont j'ai parlé ? Ca ne change rien ?

  7. #7
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Points : 44
    Points
    44
    Par défaut
    Si je mets en commentaire la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gluPerspective(45,1,0,100);
    Ca ne change rien en effet (où c'est que je définis l'affichage perpective moi??)

    Si je modifie le début de ma fonction d'affichage comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glShadeModel(GL_SMOOTH);
     
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    //gluLookAt(0,0,-1,0,0,0,0,1,0);
     
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0,0,-1,0,0,0,0,1,0);
    glRotatef(angleX,1,0,0);
    glRotatef(angleY,0,1,0);
    glRotatef(angleZ,0,0,1);
    Toujours le même problème

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    où c'est que je définis l'affichage perpective moi??
    Ben là justement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    Une matrice de projection à l'identité ça donne rarement quelque chose de chouette à regarder.
    Ce n'était pas le gluLookAt qu'il fallait commenter, mais ces deux lignes là.

  9. #9
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Points : 44
    Points
    44
    Par défaut
    Merci Laurent, le problème venait en effet de là
    Quand mon objet tourne maintenant c'est ok (aucune partie ne disparaît), par contre, j'ai toujours deux "bandes noires" qui délimitent mon écran...
    D'où est-ce que celà peut venir ?

    Voici un screen :


  10. #10
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    Citation Envoyé par alex6891
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gluPerspective(45,1,-1,500);
    arg
    le troisieme parametre : zNear doit obligatoirement etre positif
    http://fly.cc.fer.hr/~unreal/theredbook/chapter03.html
    et de preference etre mis à 1 pour eviter les probleme de zFigting
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  11. #11
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Quand mon objet tourne maintenant c'est ok (aucune partie ne disparaît), par contre, j'ai toujours deux "bandes noires" qui délimitent mon écran...
    D'où est-ce que celà peut venir ?
    Vérifie ton viewport peut-être.

    e troisieme parametre : zNear doit obligatoirement etre positif
    http://fly.cc.fer.hr/~unreal/theredbook/chapter03.html
    et de preference etre mis à 1 pour eviter les probleme de zFigting
    Effectivement, mais bon il aurait mis n'importe quoi d'autre ça n'aurait de toute façon pas fait grande différence

    EDIT : ah ben non du coup, s'il a corrigé, il se retrouve effectivement à utiliser cette matrice

  12. #12
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Points : 44
    Points
    44
    Par défaut
    J'ai essayé un viewport définit comme ceci : glViewPort(0,0,800,600);
    Et ça ne change rien du tout.
    J'ai même intégré à mon programme une gestion de la caméra pour mieux me rendre compte du problème. En fait, plus je me rapproche de mon modèle 3D, plus celui-ci disparait, or j'aimerais réduire la distance à la scène à 0 (pour qu'on puisse se placer "collé" dans la scène 3D...)

    Merci


    Alex

  13. #13
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    on ne peut pas se "coller" à une scène car ceci implique d'avoir un plan de clipping proche à 0, or il doit etre imperativement different de 0 (1 est une très bonne valeure)
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  14. #14
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Points : 44
    Points
    44
    Par défaut
    Comment faire alors pour avoir l'impression de tout voir lorsqu'on place une caméra dans un jeu de style FPS par exemple ? (même ce qui se situe juste devant nous)

  15. #15
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Dans les FPS on peut pousser à 0.1 si jamais 1 n'est pas suffisant (enfin de toute façon ça dépend toujours de l'echelle utilisée... ici on suppose 1 = 1m).

    Après, il suffit d'avoir une distance de collisions à 0.15 par exemple, et il n'y aura aucun problème.

  16. #16
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Points : 44
    Points
    44
    Par défaut
    Même en mettant 0.1 ça ne change rien ...
    Je vous ai fais 3 screens pour que vous compreniez bien le problème (dans l'ordre, je n'ai fait que progresser la caméra droit devant moi vers la scène 3D) :







    Ce que je voudrais c'est pouvoir m'approcher plus près de la texture verte du sol

    Merci pour votre aide.

    Alex

  17. #17
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ben... Tu veux t'approcher à combien ? Et quelle est ton échelle ? Ton near plane peut très bien être à 0.001 par exemple si ton far plane peut n'être qu'à 10.

    Mets simplement les valeurs qui te satisfont, et après si tu as des problèmes de Z-fighting ou autre on pourra toujours en reparler

  18. #18
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Points : 44
    Points
    44
    Par défaut
    Je ne sais pas si tu as remarqué mais regarde la seconde image par rapport à la première (notamment l'apparence du mur en bas à gauche) : c'est pas normal ça...

    Sinon je viens de bidouiller le gluPerspective : je mets 0.01 et 10 rien n'y fait ça ne change rien (pareil que 1 et 10000) pour les plans proche et loin.

    Je patauge un peu là

  19. #19
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Je ne sais pas si tu as remarqué mais regarde la seconde image par rapport à la première (notamment l'apparence du mur en bas à gauche) : c'est pas normal ça...
    Oui j'ai remarqué. Je pense que c'est ta caméra qui est "rentrée" dans tes boîtes (ie. le plafond se trouve derrière le near plane).

    Sinon je viens de bidouiller le gluPerspective : je mets 0.01 et 10 rien n'y fait ça ne change rien (pareil que 1 et 10000) pour les plans proche et loin.
    Alors là il va falloir vérifier ton programme pour être certain que tu ne remodifies pas ta matrice de projection plus tard en cours de route (comme c'était le cas au départ déjà), parce que ça devrait vraiment changer quelque chose de bidouiller ces valeurs.

  20. #20
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Exemple de code pour ta caméra qui est sur un plan 2D

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	m_projection.Set(2*z_near/x_screen,0,0,0,
    				0,2*z_near/y_screen,0,0,
    				0,0,0,0,
    				0,0,0,1);
     
     
    	glMatrixMode(GL_PROJECTION);
    	glLoadMatrixd(m_projection.Data());
    Bon si tu veux zoomer, augmente z_near, cela devrait fonctionner. Ne déplace pas ton objet !

Discussions similaires

  1. quote ' et double quote " - un vrai problème
    Par CLion dans le forum ASP.NET
    Réponses: 20
    Dernier message: 30/01/2012, 21h11

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