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 :
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.
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
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:
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
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(); }
résultat graphique:
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
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!
Partager