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 :

[OPENGL] fenêtre 2d en 3d sans projection orthogonale


Sujet :

OpenGL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2008
    Messages : 6
    Points : 3
    Points
    3
    Par défaut [OPENGL] fenêtre 2d en 3d sans projection orthogonale
    Bonjour, j'aimerais pouvoir avoir des fenêtres (donc des quads) dans un environnement 3d, en les obtenant exactement comme si je les avais projetés de façon orthogonale mais sans le faire. Pour cela je dois donc avoir x=y=0 dans mon gluLookAt et avoir une coordonnée z qui décide la taille de la fenêtre. Pas trop compliqué normalement, sauf qu'en essayant ça j'ai découvert un truc assez bizarre... en ayant les 2 premiers paramètres de gluLookAt égaux à 0, on ne voyait rien du tout. (en ayant n'importe quel z et en pointant vers l'origine). Par contre en mettant par exemple x=0.00005 je voyais exactement le bon truc. Vous obtenez la même chose chez vous?
    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
     
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
     
    		glMatrixMode( GL_MODELVIEW );
    		glLoadIdentity();
     
    		gluLookAt(0.01,0.0,1.0,0.0,0.0,0,0.0,0.0,1.0);
     
    		glBegin(GL_QUADS);
    			glColor3ub(0,0,255);
    			glVertex3d(-0.75,-0.75,-1);
    			glVertex3d(-0.75,0.75,-1);
    			glColor3ub(255,0,0);
    			glVertex3d(0.75,0.75,-1);
    			glVertex3d(0.75,-0.75,-1);
    		glEnd();
    fonctionne parfaitement. Par contre:

    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
     
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
     
    		glMatrixMode( GL_MODELVIEW );
    		glLoadIdentity();
     
    		gluLookAt(0.0,0.0,1.0,0.0,0.0,0,0.0,0.0,1.0);
     
    		glBegin(GL_QUADS);
    			glColor3ub(0,0,255);
    			glVertex3d(-0.75,-0.75,-1);
    			glVertex3d(-0.75,0.75,-1);
    			glColor3ub(255,0,0);
    			glVertex3d(0.75,0.75,-1);
    			glVertex3d(0.75,-0.75,-1);
    		glEnd();
    n'affiche rien du tout.

    J'ai passé ces paramètres à gluPerspective:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gluPerspective(70,sizex/sizey,0.1,1000);
    merci d'avance.
    Fichiers attachés Fichiers attachés
    • Type de fichier : c main.c (3,7 Ko, 61 affichages)

  2. #2
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mars 2005
    Messages : 249
    Points : 349
    Points
    349
    Par défaut
    Je ne réponds pas à ta question désolé, mais pourquoi ne pas faire un simple glOrtho avant d'afficher tes fenêtres? (et repasser en "mode" 3d avec un gluLookAt/glFrustrum avant d'afficher ta scène 3d)

  3. #3
    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 641
    Points
    7 641
    Par défaut
    Salut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    		gluLookAt(0.0,0.0,1.0,0.0,0.0,0,0.0,0.0,1.0);
    déjà, tu es en (0,0,1), tu vises (0,0,0), et tu lui dis que le vecteur haut est (0,0,1)... donc en gros qu'il va vers l'arrière de la caméra... à mon avis, ça doit être un peu délicat à gérer pour lui.

    Commence par changer l'orientation du vecteur haut (3 derniers paramètres), teste avec (-1,0,0) pour voir (sans jeu de mots! )
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2008
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par kremvax Voir le message
    Je ne réponds pas à ta question désolé, mais pourquoi ne pas faire un simple glOrtho avant d'afficher tes fenêtres? (et repasser en "mode" 3d avec un gluLookAt/glFrustrum avant d'afficher ta scène 3d)
    L'idée est d'avoir les fenêtres en 3d réelle. Ainsi la taille des fenêtres diminue de plus en plus en fonction du dernier focus qu'elles ont eu.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2008
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par plegat Voir le message
    Salut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    		gluLookAt(0.0,0.0,1.0,0.0,0.0,0,0.0,0.0,1.0);
    déjà, tu es en (0,0,1), tu vises (0,0,0), et tu lui dis que le vecteur haut est (0,0,1)... donc en gros qu'il va vers l'arrière de la caméra... à mon avis, ça doit être un peu délicat à gérer pour lui.

    Commence par changer l'orientation du vecteur haut (3 derniers paramètres), teste avec (-1,0,0) pour voir (sans jeu de mots! )
    effectivement ça fonctionne mais ça a subi une rotation de 90°. en mettant (0,1,0) comme vecteur haut c'est juste. Il ne me reste plus qu'à comprendre pourquoi ^^' (je vais revoir la doc)

    merci beaucoup

  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 641
    Points
    7 641
    Par défaut
    Citation Envoyé par SirDavik Voir le message
    Il ne me reste plus qu'à comprendre pourquoi ^^' (je vais revoir la doc)
    Ca indique à la caméra où est le haut, ce n'est pas une histoire d'être juste ou pas, à toi de savoir où tu regardes et de quelle manière. Tu peux regarder la télé assis sur le canapé ou couché dessus, tu regardes toujours depuis le canapé, vers la télé, mais le haut de ta tête n'a pas la même direction dans les deux positions...
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2008
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par plegat Voir le message
    Ca indique à la caméra où est le haut, ce n'est pas une histoire d'être juste ou pas, à toi de savoir où tu regardes et de quelle manière. Tu peux regarder la télé assis sur le canapé ou couché dessus, tu regardes toujours depuis le canapé, vers la télé, mais le haut de ta tête n'a pas la même direction dans les deux positions...
    oui mais donc pourquoi avec (0,0,1) comme vecteur haut ça ne fonctionnait pas?

    Je viens de remarquer, en ajoutant des couleurs sur chaque côté pour les distinguer, qu'en prennant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gluLookAt(0.0,0.05,1.0,0.0,0.0,0,0.0,0.0,1.0);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gluLookAt(0.0,-0.05,1.0,0.0,0.0,0,0.0,0.0,1.0);
    on regardait l'objet une fois d'en haut et une fois d'en bas (donc l'objet a subi l'équivalent d'une symétrie centrale).
    Ce qui me trouble encore plus, parce que pourtant on n'est pas censés être dans le carré étant donné qu'on est en z=1

    edit: ah en fait je crois que j'ai compris: les 3 derniers paramètres servent à définir quel direction aura le vecteur qui va représenter y à l'écran. Donc en posant (0,0,1), je changeais les correspondances des vecteurs et donc z->y, y->x et x->z (le repère de base -> écran) (ainsi je voyais l'objet de côté et donc je ne voyais rien)

    edit2: quoi que en fait non, ça n'explique pas pourquoi en étant en (0,-0.0005,1.0) je vois le bon truc, alors qu'en (0,0.0005,1.0) j'en vois la symétrie centrale. Mais bon, je vais utiliser y comme vecteur haut ce qui simplifie plein de choses

  8. #8
    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 641
    Points
    7 641
    Par défaut
    Citation Envoyé par SirDavik Voir le message
    oui mais donc pourquoi avec (0,0,1) comme vecteur haut ça ne fonctionnait pas?
    Parce que ça voudrait dire que le haut est derrière. Si je te dis "regarde en haut", tu vas regarder en haut, et pas derrière toi. Pour la caméra, c'est pareil, si tu lui dis que le haut c'est derrière elle, elle ne comprend pas. Il faut que le haut soit quelque part vers ce que tu considère vers le haut, et pas pile poil exactement derrière (ça créé des problèmes de matrice de rotation indéfinie en fait, mathématiquement parlant, et la caméra ne peut donc pas s'orienter dans l'espace).
    En gros, ton vecteur haut ne doit pas être aligné avec l'axe formé pas les deux points position caméra/position visée (ce qui est on ne peut plus logique... quelque part...)


    Citation Envoyé par SirDavik Voir le message
    on regardait l'objet une fois d'en haut et une fois d'en bas (donc l'objet a subi l'équivalent d'une symétrie centrale).
    Ce qui me trouble encore plus, parce que pourtant on n'est pas censés être dans le carré étant donné qu'on est en z=1
    Pas compris là...

    Citation Envoyé par SirDavik Voir le message
    edit: ah en fait je crois que j'ai compris: les 3 derniers paramètres servent à définir quel direction aura le vecteur qui va représenter y à l'écran. Donc en posant (0,0,1), je changeais les correspondances des vecteurs et donc z->y, y->x et x->z (le repère de base -> écran) (ainsi je voyais l'objet de côté et donc je ne voyais rien)
    Non (ou alors si mais je n'ai pas tout compris à ton explication...).
    Les 3 derniers paramètres servent à orienter ta caméra dans l'espace, à spécifier où se trouve le haut de la caméra. Imagine que tu es en train de photographier quelque chose avec ton numérique. Les 3 premiers paramètres disent à quel endroit tu te trouves. Les 3 suivants, où se trouve ce que tu photographies (plus précisément, vers quel point tu regardes). Les 3 derniers permettent de définir dans quel position tu tiens ton appareil photo (donc où est le haut de ton appareil). Tu peux très bien le tenir à plat (mode paysage), en travers (mode portrait), ou n'importe comment (mode j'essaie de faire de l'art).

    Citation Envoyé par SirDavik Voir le message
    edit2: quoi que en fait non, ça n'explique pas pourquoi en étant en (0,-0.0005,1.0) je vois le bon truc, alors qu'en (0,0.0005,1.0) j'en vois la symétrie centrale. Mais bon, je vais utiliser y comme vecteur haut ce qui simplifie plein de choses
    Quand tu es en (0,-0.0005,1.0), que tu vises (0,0,0) et que tu spécifies (0,0,1) comme vecteur haut, ton vecteur haut n'est pas exactement aligné avec la droite position caméra/point visé, mais légèrement décalé, ce qui permet de savoir où se trouve la direction "haut", et ainsi de définir la matrice, et donc de voir quelque chose.
    Donc, si tu es en (0,-0.005,1.0), ton vecteur haut sera porté par l'axe Z donc (vu que tu as donné 0,0,1), et vu le faible décalage en y, c'est comme si tu avais donné l'axe Y+ comme vecteur haut.
    Si tu es en (0,+0.005,1.0), avec toujours (0,0,1) comme vecteur haut, cette fois, vu le décalage en y, c'est comme si tu avait donné l'axe Y- comme vecteur haut, donc l'inverse du cas précédent. En gros entre les deux configs, tu retournes la caméra de 180° (tu ne fais pas une symétrie, juste une rotation).

    Apparemment tu as quelques petits soucis en 3D (d'ailleurs si tu pouvais préciser quel est ton niveau scolaire, ou en math, ou n'importe quoi qui pourrait nous aider à mieux cadrer nos réponses...). Pour le moment, ne te complique pas la vie, prend le vecteur haut du gluLookAt perpendiculaire à l'axe position caméra/point visé, ça t'évitera bien des erreurs.
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2008
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par plegat Voir le message
    Parce que ça voudrait dire que le haut est derrière. Si je te dis "regarde en haut", tu vas regarder en haut, et pas derrière toi. Pour la caméra, c'est pareil, si tu lui dis que le haut c'est derrière elle, elle ne comprend pas. Il faut que le haut soit quelque part vers ce que tu considère vers le haut, et pas pile poil exactement derrière (ça créé des problèmes de matrice de rotation indéfinie en fait, mathématiquement parlant, et la caméra ne peut donc pas s'orienter dans l'espace).
    En gros, ton vecteur haut ne doit pas être aligné avec l'axe formé pas les deux points position caméra/position visée (ce qui est on ne peut plus logique... quelque part...)

    [...]

    Non (ou alors si mais je n'ai pas tout compris à ton explication...).
    Les 3 derniers paramètres servent à orienter ta caméra dans l'espace, à spécifier où se trouve le haut de la caméra. Imagine que tu es en train de photographier quelque chose avec ton numérique. Les 3 premiers paramètres disent à quel endroit tu te trouves. Les 3 suivants, où se trouve ce que tu photographies (plus précisément, vers quel point tu regardes). Les 3 derniers permettent de définir dans quel position tu tiens ton appareil photo (donc où est le haut de ton appareil). Tu peux très bien le tenir à plat (mode paysage), en travers (mode portrait), ou n'importe comment (mode j'essaie de faire de l'art).
    OK, pour ça c'est bon. En fait j'étais tombé sur une explication qui disait un truc qui pouvait jouer avec mon problème. Alors qu'en fait ça disait des conneries ^^

    Donc pour bien vérifier que j'ai compris: le vecteur haut sert juste à dire si c'est le y, le z ou un une combinaison linéaire de la base qui deviendra le y de l'écran et le x restera constant? (et il se passe quoi si je dis que mon vecteur haut sera (1,0,0)? mathématiquement ça devrait projeter sur une ligne...)

    Quand tu es en (0,-0.0005,1.0), que tu vises (0,0,0) et que tu spécifies (0,0,1) comme vecteur haut, ton vecteur haut n'est pas exactement aligné avec la droite position caméra/point visé, mais légèrement décalé, ce qui permet de savoir où se trouve la direction "haut", et ainsi de définir la matrice, et donc de voir quelque chose.
    Donc, si tu es en (0,-0.005,1.0), ton vecteur haut sera porté par l'axe Z donc (vu que tu as donné 0,0,1), et vu le faible décalage en y, c'est comme si tu avais donné l'axe Y+ comme vecteur haut.
    Si tu es en (0,+0.005,1.0), avec toujours (0,0,1) comme vecteur haut, cette fois, vu le décalage en y, c'est comme si tu avait donné l'axe Y- comme vecteur haut, donc l'inverse du cas précédent. En gros entre les deux configs, tu retournes la caméra de 180° (tu ne fais pas une symétrie, juste une rotation).
    la symétrie centrale est équivalente à une rotation de 180° (en prenant le même centre bien entendu)

    Apparemment tu as quelques petits soucis en 3D (d'ailleurs si tu pouvais préciser quel est ton niveau scolaire, ou en math, ou n'importe quoi qui pourrait nous aider à mieux cadrer nos réponses...). Pour le moment, ne te complique pas la vie, prend le vecteur haut du gluLookAt perpendiculaire à l'axe position caméra/point visé, ça t'évitera bien des erreurs.
    [/QUOTE]
    je suis juste avant le bac Suisse en mathématiques et j'ai tendance à mieux comprendre les exemples mathématiques plutôt qu'artistiques ^^ c'est justement à cause des explications "fumeuses" des différents sites que j'étais si embrouillé.

    Merci d'avoir remis un peu d'ordre et rigueur dans ma compréhension de ces caméras

  10. #10
    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 641
    Points
    7 641
    Par défaut
    Citation Envoyé par SirDavik Voir le message
    Donc pour bien vérifier que j'ai compris: le vecteur haut sert juste à dire si c'est le y, le z ou un une combinaison linéaire de la base qui deviendra le y de l'écran et le x restera constant?
    Pour le y écran, on peut voir ça comme ça... pour le x écran, il bougera en accord avec le y, vu qu'il doit rester perpendiculaire. La direction caméra/point visée définit le z écran (perpendiculaire à l'écran), le vecteur haut définit le y écran, et le x écran est définit automatiquement perpendiculaire à y écran. Attention, dans ton cas, vu que tu restes en 3D, suivant la position de la caméra et du point visé, le x "3D" ne concorde pas forcément avec le x écran. A toi de bien régler tous tes paramètres caméra pour que ça colle.


    Citation Envoyé par SirDavik Voir le message
    (et il se passe quoi si je dis que mon vecteur haut sera (1,0,0)? mathématiquement ça devrait projeter sur une ligne...)
    Ouaip, et quand tu projètes un espace 3D sur une ligne, et que tu regardes suivant la ligne, ben tu ne vois plus rien!


    Citation Envoyé par SirDavik Voir le message
    la symétrie centrale est équivalente à une rotation de 180° (en prenant le même centre bien entendu)
    Tout à fait, mais là, il s'agit d'une rotation caméra. C'est plus facile d'expliquer ton problème avec une rotation caméra qu'avec une symétrie centrale (je ne sais même pas si ça existe en OpenGl comme tranformation...)



    Citation Envoyé par SirDavik Voir le message
    je suis juste avant le bac Suisse en mathématiques et j'ai tendance à mieux comprendre les exemples mathématiques plutôt qu'artistiques ^^ c'est justement à cause des explications "fumeuses" des différents sites que j'étais si embrouillé.
    Ok, donc aucun soucis avec les notions de 3d, vecteurs, matrices...
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

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

Discussions similaires

  1. Projection orthogonale et 3D classique
    Par Heliopraetor dans le forum DirectX
    Réponses: 2
    Dernier message: 07/03/2008, 11h46
  2. Réponses: 1
    Dernier message: 29/11/2007, 15h27
  3. fenêtre qui s'élargit sans raison apparente
    Par Lcf.vs dans le forum Mise en page CSS
    Réponses: 13
    Dernier message: 24/11/2007, 22h02
  4. Clipping et projection orthogonale
    Par Luke-77 dans le forum DirectX
    Réponses: 4
    Dernier message: 01/10/2003, 20h02

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