![]() |
| Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé. | |||||||
|
|||||||
| OpenGL Forum d'entraide sur le développement en OpenGL. Avant de poster -> FAQ OpenGL |
![]() |
|
|
Outils de la discussion |
|
|
#2 (permalink) |
![]() |
Peux tu préciser un peu plus ce que tu cherches à faire ?
__________________
--[[ Responsable, rubrique 2D / 3D / Jeux ]]-- Le blog de la rubrique 2D/3D/Jeux : http://blog.developpez.com/jeux (envie d'y participer, contactez moi) new Tuto DirectX, OpenGL : http://raptor.developpez.com/ Pensez au tag si vous avez eu votre réponse.
|
|
|
|
|
|
#3 (permalink) |
|
Invité régulier
![]() Date d'inscription: septembre 2006
Messages: 17
|
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: Code :
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(); } Dernière modification par raptor70 ; 11/11/2008 à 09h35 Motif: lien externe |
|
|
|
|
|
#4 (permalink) | |
|
Membre Confirmé
![]() Date d'inscription: février 2008
Localisation: Munich - Allemagne
Âge: 28
Messages: 211
|
Salut,
Citation:
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 |
|
|
|
|
|
|
#5 (permalink) | |
|
Invité régulier
![]() Date d'inscription: septembre 2006
Messages: 17
|
Citation:
Enfin, tu as ss doute raison, autant commencer par du tout fait avant de bien pouvoir fabriquer le sien Merci beaucoup |
|
|
|
|
|
|
#6 (permalink) |
|
Invité régulier
![]() Date d'inscription: septembre 2006
Messages: 17
|
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 :
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"); } } |
|
|
|
|
![]() |
![]() |
||
Slider OpenGl (avec Glut)
|
||
| Outils de la discussion | |
|
|