Salut les développeurs
J'aimerais créer un slider (overlay) sur une fenêtre qui m'affiche de la 3D; est-ce possible ?
Salut les développeurs
J'aimerais créer un slider (overlay) sur une fenêtre qui m'affiche de la 3D; est-ce possible ?
Peux tu préciser un peu plus ce que tu cherches à faire ?
Oui, c'est pas clair tout ça
...il s'agit de pouvoir créer des éléments tels qu'un
slider et des boutons en 2D (projection ortho) sur un rendu
3D. Autrement dit, j'aimerais pouvoir modifier dynamiquement les propriétés des objets 3D d'une scène via ces éléments graphiques..
Alors, voilà j'ai trouvé une partie de ma réponse ici...
Par contre j'ai du m'y prendre à l'envers, c-à-d rendre d'abord mon objet 2D avant de rendre la 3D, car ça interférait avec une fonction glutMotionFunc(MotionCallback) ds laquelle je détecte le survol d'un objets 3D. Enfin, je sais pas si c'est une bonne chose mais de cette manière j'obtiens mes 2 rendus, même si mon obj 2D perd sa transparence.
Un bout du code épuré, pour donner une idée:
Donc, à priori j'affiche correctement mon futur boutton...Euh, d'ailleurs pour le rendre interactif, faut-il que je crée moi-même une fonction qui compare la position de la souris à celle des points qui définissent sa forme ou bien il existe une fonction Glut qui le fait ?
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 void RenderCallback() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); updateOVERLAY(); updateCAMERA(); RenderScene(); } void updateOVERLAY() { glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0, (float)glutGet(GLUT_WINDOW_WIDTH), 0, (float)glutGet(GLUT_WINDOW_HEIGHT) ); glMatrixMode(GL_MODELVIEW); //--- glPushMatrix(); drawOverTEXTURE(); glPopMatrix(); } void drawOverTEXTURE() { glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor4f(0.0f, 1.0f, 0.0f, 0.6f); glRectf(50.0f, 150.0f, 150.0f, 50.0f); glFlush(); }
Salut,
Non pas besoin de l'ecrire toi même, il faut utiliser une fonctionnalité d'openGL appelée le picking. En gros tu assigne une ID a chaque "objet" (un ou plusieurs polygônes, en fonction de ce que tu veux faire), tu passes en mode "feedback" et quand tu cliques quelque part openGL te retourne quelles IDs se trouvent sous le curseur.Euh, d'ailleurs pour le rendre interactif, faut-il que je crée moi-même une fonction qui compare la position de la souris à celle des points qui définissent sa forme ou bien il existe une fonction Glut qui le fait ?
C'est très utile pour selectionner des objets de ta scene 3D par exemple, mais honnêtement si ton but n'est pas de créer une interface, tu aurais plus vite fait d'en utiliser une toute faite.
Par exemple:
http://en.wikipedia.org/wiki/OpenGL_...erface_Library
mais il y en a des tas d'autres!
Bref à toi de voir![]()
Oui et non, car lors d'une naviguation ds la scene, j'aurais besoin d'une fenêtre dégagée, mais pour la modification de ses props d'un objet j'aimerais bien pouvoir afficher une interface faite d'icones dont certain pourrait eventuellement se positionner par rapport à l'objet 3D sélectionné...si ton but n'est pas de créer une interface
Enfin, tu as ss doute raison, autant commencer par du tout fait avant de bien pouvoir fabriquer le sien
Merci beaucoup![]()
Salut,
Finalement j'ai fabriqué mon propre slider
mais je rencontre un problème avec les Names lors de la création d'une série d’objets.
Chaque Slider à un ID (int), issue d’une Structure, utilisée par glLoadName ou glPushName , lors du dessin… Avec glLoadName() j’obtiens les hits mais on ne trouve pas l’objet par rapport à son ID (de sa structure), tandis qu’avec glPushName(), pas de problème. Sauf que cela ne fonctionne qu’une seule fois. Si je clique sur un autre objet l’ID détecté reste le même, pire, tout mes slider finissent par avoir le même nom…
Voilà, j’ai du loupé quelque chose dans le Picking, mais peut être que mon code sera plus explicite :
// STRUCTURE DU SLIDER
//--- SLIDER
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122 struct Sldr_o { GLuint id; string name; int W; int H; int min ; int max; int X; int Y; int X0; int Y0; }; //------------------------------------------------------------------------------------ void RenderCallback() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); drawSLIDERS (); } // ------------------------------------------------------------------------------------ void MotionCallback(int x, int y) { int dx = mx - x; int dy = my - y; if( gSelectedSLIDER ) gSelectedSLIDER->slide(dx, dy); } //------------------------------------------------------------------------------------ void drawSLIDERS(GLenum mode, GLint a) { int t1 = sldr_A.size(); if( t1 != 0) { for (int i = 0; i < t1; i++) { Slider *m = sldr_A[ i ]; //glLoadName(m->_o_->id); glPushName(m->_o_->id); m->draw(mode, 1); glPopName(); } } } //------------------------------------------------------------------------------------ void pick(int button, int state, int x, int y) { GLuint selectBuf[BUFSIZE]; GLint viewport[4]; if (button != GLUT_LEFT_BUTTON || state != GLUT_DOWN) return; glGetIntegerv (GL_VIEWPORT, viewport); glSelectBuffer (BUFSIZE, selectBuf); (void) glRenderMode (GL_SELECT); glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity (); gluPickMatrix ((GLdouble) x, (GLdouble) (viewport[3] - y), 5.0, 5.0, viewport); int w = 50.0f; gluOrtho2D (0, (float)glutGet(GLUT_WINDOW_WIDTH), 0, (float)glutGet(GLUT_WINDOW_HEIGHT));// -2.0, 2.0, -2.0, 2.0); //---------------------------------------------------------- drawSLIDERS (GL_SELECT, pHIT); //---------------------------------------------------------- glPopMatrix (); glFlush (); GLint hits = glRenderMode (GL_RENDER); processHits (hits, selectBuf); } //--------------------------------------------------------- void processHits (GLint hits, GLuint buffer[]) { unsigned int i, j; GLuint ii, jj, names, *ptr; pHIT = hits; printf ("{processHits} hits = %d\n", hits); ptr = (GLuint *) buffer; //--- HIT loop for (i = 0; i < hits; i++) { names = *ptr; ptr+=3; //--- NAME loop for (j = 0; j < names; j++) { cerr <<"{processHits} names %d " << *ptr << endl; //--- CHECK SLIDERS gSelectedSLIDER = getSLIDER( NULL, *ptr ); if( gSelectedSLIDER ) { cerr << j << "{ProcessHITS}- ptr: " << *ptr << " / FOUND id: " << gSelectedSLIDER->_o_->id << endl; } else { cerr << j << "{ProcessHITS} ptr: " << *ptr << " / NOT FOUND !"<< endl; ptr++; } printf ("\n"); } }
Partager