Forum des développeurs  

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é.
Précédent   Forum des développeurs > Technologies / Divers > Développement 2D, 3D et Jeux > APIs multimédia > OpenGL

OpenGL Forum d'entraide sur le développement en OpenGL. Avant de poster -> FAQ OpenGL

Réponse
 
Outils de la discussion
Vieux 08/11/2008, 07h01   #1 (permalink)
Invité régulier
 
Date d'inscription: septembre 2006
Messages: 17
Par défaut Slider OpenGl (avec Glut)

Salut les développeurs

J'aimerais créer un slider (overlay) sur une fenêtre qui m'affiche de la 3D; est-ce possible ?
spnzero est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 10/11/2008, 13h49   #2 (permalink)
Responsable 2D/3D/Jeux
 
Avatar de raptor70
 
Date d'inscription: septembre 2005
Localisation: Belfort, Namur ( Belgium ) maintenant Lille
Âge: 24
Messages: 1 984
Envoyer un message via MSN à raptor70
Par défaut

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.
raptor70 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 11/11/2008, 00h10   #3 (permalink)
Invité régulier
 
Date d'inscription: septembre 2006
Messages: 17
Par défaut Combiner Rendu 3D et ortho2D

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();
}
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 ?

Dernière modification par raptor70 ; 11/11/2008 à 09h35 Motif: lien externe
spnzero est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 11/11/2008, 13h57   #4 (permalink)
Membre Confirmé
 
Date d'inscription: février 2008
Localisation: Munich - Allemagne
Âge: 28
Messages: 211
Par défaut

Salut,

Citation:
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 ?
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.

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
ShevchenKik est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 11/11/2008, 16h59   #5 (permalink)
Invité régulier
 
Date d'inscription: septembre 2006
Messages: 17
Par défaut

Citation:
si ton but n'est pas de créer une interface
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é...

Enfin, tu as ss doute raison, autant commencer par du tout fait avant de bien pouvoir fabriquer le sien

Merci beaucoup
spnzero est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 22/11/2008, 11h12   #6 (permalink)
Invité régulier
 
Date d'inscription: septembre 2006
Messages: 17
Par défaut Problème avec les Names

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");
   }
}
spnzero est déconnecté   Envoyer un message privé Réponse avec citation
NEWS 2D - 3D - JEUXLES FAQsTUTORIELSOUTILSBIBLIOTHEQUESMEDIASLIVRESSOURCESTVBLOG

Réponse

Précédent   Forum des développeurs > Technologies / Divers > Développement 2D, 3D et Jeux > APIs multimédia > OpenGL



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide