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 :

[glOrtho] Affichage tronqué


Sujet :

OpenGL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 42
    Points : 28
    Points
    28
    Par défaut [glOrtho] Affichage tronqué
    Bonjour et bonne année!

    Je suis face à un problème assez particulier mais qui doit être dû à mon manque de connaissance en OpenGL.

    Je possède une liste de points ayant des coordonnées allant de -700 à 700 (en gros) pour x, y et z. Exemple :

    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
    x:55.889000 y:-79.125000 z:-633.478027
    x:56.020000 y:-78.190002 z:-633.384033
    x:56.212002 y:-76.857002 z:-633.732910
    x:30.398001 y:-34.275002 z:633.633972
    x:31.351000 y:-34.965000 z:633.864014
    x:32.047001 y:-35.505001 z:633.771973
    x:32.560001 y:-35.713001 z:633.211975
    x:85.914001 y:436.394012 z:27.993042
    x:85.779999 y:434.532990 z:30.110962
    x:85.235001 y:432.502014 z:32.469971
    x:-512.336975 y:-57.743000 z:34.350952
    x:-512.559998 y:-58.035000 z:33.568970
    x:-512.163025 y:-58.047001 z:32.925049
    x:568.182983 y:87.410004 z:-18.438965
    x:567.807983 y:87.222000 z:-18.557007
    x:567.518005 y:87.223999 z:-18.719971
    x:567.299011 y:87.496002 z:-18.484009
    Au fur et à mesure que je reçois ces coordonnées, j'aimerais mettre à jour ma vue avec glOrtho de manière à voir tous les points.

    Mon problème est le suivant: cela fonctionne très bien au niveau de l'axe des abscisses (l'axe correspondant à y = 0). La vue se met à jour et les points les plus éloignés sont au bord de l'ecran. Mais cela ne fonctionne pas pour l'axe de ordonnées (x = 0). La vue est tronquée en haut et en bas.

    J'ai vérifié mes valeurs et elles encadrent bien toutes les coordonnées de tous mes points. J'en deduis que je dois mal utiliser glOrtho.

    Voici le code correspondant à la mise à jour de glOrtho:
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    static void ShowPerspec(int width, int height)
    {
    	double rangex = 0.0;
    	double rangey = 0.0;
    	double rangex34 = 0.0;
     
    	// vue frontale - En haut à droite
    	glPushMatrix();
    	glViewport(width, height, width, width - (width - height)/2);
    	glScissor(width, height, width, width - (width - height)/2);
    	glMatrixMode(GL_PROJECTION);  /* on oriente la caméra */
    	glLoadIdentity();
     
    	rangex = Affichage.MinMax.maxx - Affichage.MinMax.minx;
    	rangey = Affichage.MinMax.maxy - Affichage.MinMax.miny;
    	rangex34 = (3 * rangex) / 4;
     
    	if (rangex34 > rangey)
    	{
    		// alors (3 / 4) * rangex > rangey
    		glOrtho(Affichage.MinMax.minx,
    				Affichage.MinMax.maxx,
    				Affichage.MinMax.miny - ((3 * rangex / 4) - rangey) / 2,
    				Affichage.MinMax.maxy + ((3 * rangex / 4) - rangey) / 2,
    				-800.,
    				800.);
    	}
    	else
    	{
    		// alors (3 / 4) * rangex <= rangey
    		glOrtho(Affichage.MinMax.minx - ((4 * rangey / 3) - rangex) / 2,
    				Affichage.MinMax.maxx + ((4 * rangey / 3) - rangex) / 2,
    				Affichage.MinMax.miny,
    				Affichage.MinMax.maxy,
    				-800.,
    				800.);
    	}
    	glTranslatef(0,0,0);
    	glRotatef(0, 0,1,0);
    	drawPoints();
    	glPopMatrix();
    }
    et voici des valeurs sur un exemple ainsi qu'une capture d'ecran du résultat:

    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
     
    Valeurs min et max de mes points:
    xMin : -542.997986
    xMax : 596.271973
    yMin : -436.394012
    yMax : 629.359985
     
    rangex * (3/4): 854.452469
    rangey : 1065.753998
     
    si rangex * (3/4) > rangey j utilise ces valeurs pour glOrtho:
     
    glOrtho_xMin : -542.997986
    glOrtho_xMax : 596.271973
    glOrtho_yMin : -330.743248
    glOrtho_yMax : 523.709221
     
    sinon celles-ci :
     
    glOrtho_xMin2 : -683.865672
    glOrtho_xMax2 : 737.139659
    glOrtho_yMin2 : -436.394012
    glOrtho_yMax2 : 629.359985
    résultat graphique:


    Comme vous pouvez le voir mes min et max de mon glOrtho englobent bel et bien mes min et max de mes points (cf code ci-dessus). Cependant la vue n'affiche pas les points les plus bas (sur l'axe y) comme vous pouvez le voir sur la capture d'écran (à gauche vue non ajustée où tous les points sont apparents, à droite vue ajustée où les points du bas manquent).

    Mon code est-il problèmatique? Je ne sais plus où chercher. Je pense que mes calculs sont corrects, mais que je n'utilise pas glOrtho comme il faut.

    Merci de m'avoir lu jusqu'ici. Je suis preneur du moindre indice pour avancer. Merci d'avance et bonne journée!

  2. #2
    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 : 40
    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
    si rangex * (3/4) > rangey j utilise ces valeurs pour glOrtho:

    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    glOrtho_xMin : -542.997986
    glOrtho_xMax : 596.271973
    glOrtho_yMin : -330.743248
    glOrtho_yMax : 523.709221
    Dans ce cas, tu rétrécis l'axe Y, pas étonnant que tu ne voies pas tous tes points.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 42
    Points : 28
    Points
    28
    Par défaut
    mmm dans cet exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rangex * (3/4) > rangey
    est faux:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    rangex * (3/4): 854.452469
    rangey : 1065.753998
    donc j'utilise les autres valeurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    glOrtho_xMin2 : -683.865672
    glOrtho_xMax2 : 737.139659
    glOrtho_yMin2 : -436.394012
    glOrtho_yMax2 : 629.359985
    avec ces valeurs mon axe y est suffisement grand non?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    yMin : -436.394012
    yMax : 629.359985
    ah moins que je n'ai pas compris ta réponse.
    Peut être dois-je préciser. Quand mes points s'étendent sur l'axe x, j'ai alors un rangex * (3/4) > rangey. Donc j'utilise les premières valeurs pour glOrtho. Ce qui fonctionne très bien.

    Si en revanche mes points s'étendent sur l'axe y, ma condition n'est plus vraie. Alors je me sers de l'axe y pour definir mon rectangle d'affichage et j'augmente la longueur de mon rectangle sur l'axe x de manière à obtenir un affichage en 4/3 (4/3 de rangey).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // alors (3 / 4) * rangex <= rangey
    		glOrtho(Affichage.MinMax.minx - ((4 * rangey / 3) - rangex) / 2,
    				Affichage.MinMax.maxx + ((4 * rangey / 3) - rangex) / 2,
    				Affichage.MinMax.miny,
    				Affichage.MinMax.maxy,
    				-800.,
    				800.);

  4. #4
    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 : 44
    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
    Ton utilisation de glOrtho est correct (bien que ton -800,800 pour les z me semble bizarre pour un affichage 2D)...

    Par contre, ton calcul me semble compliqué...

    Est-ce obligatoire de faire comme ca ?

    Parce que sinon, je ferais plutôt un test de bord avec le nouveau point :

    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
     
    if ( nouveaupoint.x < Affichage.MinMax.minx )
       {
       Affichage.MinMax.minx = nouveaupoint.x - 10;
       }
    if ( nouveaupoint.x > Affichage.MinMax.max )
       {
       Affichage.MinMax.maxx = nouveaupoint.x + 10;
       }
    if ( nouveaupoint.x < Affichage.MinMax.minx )
       {
       Affichage.MinMax.minx = nouveaupoint.x - 10;
       }
    if ( nouveaupoint.x > Affichage.MinMax.maxx )
       {
       Affichage.MinMax.maxx = nouveaupoint.x + 10;
       }
    if ( nouveaupoint.y < Affichage.MinMax.miny )
       {
       Affichage.MinMax.miny = nouveaupoint.y - 10;
       }
    if ( nouveaupoint.y > Affichage.MinMax.maxy )
       {
       Affichage.MinMax.maxy = nouveaupoint.y + 10;
       }
    Jc

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 42
    Points : 28
    Points
    28
    Par défaut
    Bonsoir et merci beaucoup pour ta réponse.

    Alors pour le -800 +800 en z, cela est dû au fait que mes points possèdent des coordonnées dans l'espace avec donc une profondeur en z. Si je ne met pas -800 +800, certains points n'apparaissent pas. Ils sont en dehors du champs de la caméra. Mais peut-être que je m'y prend mal de ce coté la.

    Ensuite, ta methode est interressante en effet c'est beaucoup plus simple.
    J'ai fais de cette manière pour garder un ratio de 4/3 (mon ecran d'affichage ayant un ratio identique). Ca me permet de garder un résultat plus proche de la réalité. Enfin je pense. (Je voulais éviter d'écraser l'affichage en largeur ou en hauteur).
    Je pense néanmoins que je vais essayer ta technique demain pour voir ce que cela donne.

    Merci encore pour ta réponse, cela me conforte dans mon utilisation de glOrtho, j'avoue que je doutais de plus en plus sur mon récent apprentissage de l'OpenGL.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 42
    Points : 28
    Points
    28
    Par défaut
    bien bien bien. J'ai trouvé ce qui n'allait pas... J'avoue que j'ai un peu honte

    En fait l'axe y de mes points est à l'envers et quand j'ai mis à jour mes min et max, j'ai oublié de multiplier par -1

    On le voit meme sur cet exemple :
    et dans la liste des points :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    x:85.914001 y:436.394012 z:27.993042
    Voilà c'est bien la honte =)

    Maintenant cela fonctionne nikel. Merci à tous pour vos réponses et conseils!

    Et n'oublions pas : le bug se situe entre la chaise et l'écran.

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

Discussions similaires

  1. [PHP 5.2] Affichage tronqué d'un BLOB
    Par jep33 dans le forum Langage
    Réponses: 2
    Dernier message: 08/01/2009, 10h14
  2. Affichage tronqué d'un champ Access 2000
    Par krassi dans le forum VBA Access
    Réponses: 2
    Dernier message: 29/08/2007, 11h21
  3. Affichage tronqué des valeurs
    Par Roy Miro dans le forum Installation
    Réponses: 6
    Dernier message: 30/07/2007, 12h26
  4. Affichage tronqué du contenu de value
    Par lodan dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 10/07/2006, 23h04
  5. Overflow Affichage tronqué
    Par eirmag dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 31/05/2006, 13h23

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