Bonjour à tous,
je suis nouveau sur ce forum OpenGL, merci d'avance d'être indulgent envers moi si je manque de précision où n'emploie pas les termes appropriés,
et merci de bien vouloir accorder quelques minutes (ou plus) de votre temps à mon problème.
Je me permet de poster ici car je suis confronté à quelques difficultés pour gérer le placement d'objets, des textures en l’occurrence,
dans la fenêtre de visualisation OpenGL que je développe.
Voici une copie d'écran de la fenêtre en question, vous pourrez constatez que mon programme est un outil pour la chimie:
Mon problème concerne la position des étiquettes affichant l'espèce chimique des atomes, pour la copie d'écran précédente
j'ai choisi d'afficher les étiquettes des atomes de Germanium (Ge).
Comme vous pouvez le constater je n'ai pas de problème pour afficher les étiquettes, leur placement dans l'espace 3D laisse
malheureusement à désirer:
1) La rotation 3D confirme que les étiquettes sont bien positionnées sur les atomes correspondant, cependant la profondeur du positionnement
n'est pas toujours correcte, par exemple sur la copie d'écran le Ge38 situé en fond ne devrait pas apparaître
au premier plan car masqué par la liaison chimique, de même les Ge39 et Ge85 qui devraient être caché par les atomes de souffre (en jaune).
2) j'ai constaté sans pouvoir l'expliquer que les étiquettes sont en couche par ordre d’apparition, je parcours ma liste d'atomes pour en afficher
ou non l'étiquette, l'atome N°1 serait toujours les plus éloigné dans le plan, suivit par le N°2 ... etc, ainsi si je tourne mon modèle et parviens
à aligner les étiquettes (hypothétiquement parlant) je pourrais toujours voir la dernière affichée au premier plan même si l'atome lui est en fait
complètement à l'arrière plan.
Voici le code que j'ai écris pour afficher et positionner les textures/étiquettes:
Si vous avez persévérez et lui mon message jusqu'à ce point un merci s'impose, et un deuxième suivra si vous parvenez
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71 void render_screen_string (struct screen_string * s_string, double x, double y, double z) { GLdouble winx, winy, winz; GLint viewp[4]; GLdouble model[16], pro[16]; GLfloat color[4]; glGetFloatv (GL_CURRENT_COLOR, color); glGetDoublev (GL_MODELVIEW_MATRIX, model); glGetDoublev (GL_PROJECTION_MATRIX, pro); glGetIntegerv (GL_VIEWPORT, viewp); glPushAttrib (GL_ALL_ATTRIB_BITS); glDisable (GL_LIGHTING); glDisable (GL_CULL_FACE); // texture is GL_TEXTURE_RECTANGLE_ARB or GL_TEXTURE_2D glEnable (texture); glEnable (GL_BLEND); glDepthMask (GL_FALSE); glPushMatrix (); // Push-1 gluProject (x, y, z, model, pro, viewp, & winx, & winy, & winz); glMatrixMode (GL_PROJECTION); glPushMatrix (); // Push-2 glLoadIdentity (); glOrtho (0.0, viewp[2], 0.0, viewp[3], -1.0, 1.0); glMatrixMode (GL_MODELVIEW); glPushMatrix (); // Push-3 glLoadIdentity (); winx -= s_string -> cwidth/4.0; winy += s_string -> cheight/2.0; glTranslated (winx, winy, winz); glPushMatrix(); // Push-4 // Pass 1: render the outline glColor4f ((1-color[0])/2,(1-color[1])/2,(1-color[2])/2,1); // use opposite and darker color glBindTexture (texture, s_string -> alpha_texture); glCallList (s_string -> gen_list); glPopMatrix (); // Pop-4 // Pass 2: render the glyphs themselves glColor4fv (color); glBindTexture (texture, s_string -> luminance_texture); glCallList (s_string -> gen_list); glPopMatrix (); // Pop-3 glMatrixMode (GL_PROJECTION); glPopMatrix (); // Pop-2 glMatrixMode (GL_MODELVIEW); glPopMatrix (); // Pop-1 glDepthMask (GL_TRUE); glEnable (GL_LIGHTING); glPopAttrib (); }
à m'expliquer ce qui ne va pas ... car moi je cale ;-)
Merci d'avance pour tout éclaircissement.
S.
Partager