IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

encore un probleme de picking :)


Sujet :

OpenGL

  1. #1
    Membre régulier Avatar de shams
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 210
    Points : 83
    Points
    83
    Par défaut encore un probleme de picking :)
    bonjour à tous,

    j'ai (encore) un petit soucis avec mon picking. Je découvre SDL, et j'utilise la freeFlyCamera. J'avais déjà réussi a faire fonctionner le picking auparavant, mais la... aucune idée de ce qui cloche.

    Tout part de la!
    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
    int main( int narg, char **argv)
    { 	
    	width = LARGEUR_FENETRE;
    	height = HAUTEUR_FENETRE;
     
    	// Init SDL video subsystem
    	if ( SDL_Init (SDL_INIT_VIDEO) < 0 ) 
    	{
            fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError());
    		exit(1);
    	}
     
        // Set GL context attributes
        initAttributes ();
     
        // Create GL context
        createSurface (0);
     
        // Init GL state
        initGL ();
     
        // Draw, get events...
        mainLoop ();
     
        // Cleanup
    	SDL_Quit();
     
     
    	return 0;
    }
    les principales fonctions
    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
    123
    124
    125
    126
    127
    128
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    static void initGL ()
    {
        initTerrain(); 
        redim (gScreen->w, gScreen->h);
     
    	glMatrixMode( GL_PROJECTION );
        glLoadIdentity( );
        gluPerspective(60,(double)width/height,0.001,200000);
     
    	camera = new FreeFlyCamera(Vector3D(0,0,2));
    }
    //``````````````````````````````````````````````````
     
     
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    static void mainLoop ()
    {
        SDL_Event event;
        int done = 0;
        const Uint32 time_per_frame = 1000/FPS;
        Uint32 last_time,current_time,elapsed_time; //for time animation
        Uint32 start_time,stop_time; //for frame limit
     
    	last_time = SDL_GetTicks();
     
        while ( !done ) 
    	{
    		start_time = SDL_GetTicks();
     
    		/* Check for events */
    		while ( SDL_PollEvent (&event) ) 
    		{
    			switch (event.type)
    			{
    				case SDL_QUIT:	done = 1;	break;
    				case SDL_MOUSEMOTION:	if (!modeSelect) camera->OnMouseMotion(event.motion);	
                                                              else   camera->OnMouseMotion2(event.motion);	break;
    				case SDL_MOUSEBUTTONUP:
    				case SDL_MOUSEBUTTONDOWN: if (!modeSelect)	camera->OnMouseButton(event.button);	
                                                              else  camera->OnMouseButton2(event.button);	break;
    				case SDL_KEYUP:	 camera->OnKeyboard(event.key); break;
    				case SDL_KEYDOWN:	
    						switch (event.key.keysym.sym)
    						{
    							case SDLK_p:		takeScreenshot("test.bmp");		break;
    							case SDLK_m:		modeSelect = !modeSelect;	
    									if (!modeSelect)	SDL_ShowCursor(SDL_DISABLE);
    									else				SDL_ShowCursor(SDL_ENABLE);
    												break;
    							case SDLK_ESCAPE:	exit(0);						break;
    							default :			camera->OnKeyboard(event.key);
    						}
    						break;
    				default:	break;
    			}
    		}
     
    	current_time = SDL_GetTicks();
            elapsed_time = current_time - last_time;
            last_time = current_time;
     
    	camera->animate(elapsed_time);
     
    	// Affichage de la scène
            affichage ();
     
    	stop_time = SDL_GetTicks();
            if ((stop_time - last_time) < time_per_frame)
            {
                SDL_Delay(time_per_frame - (stop_time - last_time));
            }
    	}
    }
    //``````````````````````````````````````````````````
     
     
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    void affichage (void)
    {
    	static double th[4] = {0.0, 0.0, 0.0, 0.0};
    	static double t1 = 0.0, t2 = 0.0, t;
    	char num_str[128];
    	t1 = t2;
     
    	glClearColor(0,0,0,0);
    	glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    	// mise en place du Z-BUFFER
        glEnable (GL_DEPTH_TEST);
     
    	glPushMatrix();
    	glMatrixMode (GL_PROJECTION);
    		glLoadIdentity();
    		glOrtho(0, width, 0, height, -10.0, 10.0);
    		glRasterPos2f(5.0, 5.0);
    		t2 = mtime();
    		t = t2 - t1;
    		if(t > 0.0001) t = 1.0 / t;
    		glColor3f( 0.0, 0.0, 1.0 );
    		sprintf(num_str, "%0.2f FPS ", filter(t, th));
    		DrawStr(num_str);
    	glPopMatrix();
     
    	glPushMatrix();
    	camera->look();
    	dessineTerrain();	
    	if (modeSelect)	dessinePoint();
    	glPopMatrix();
     
    	glFlush();
        SDL_GL_SwapBuffers();
     
    }
    //``````````````````````````````````````````````````
     
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    void redim (int x , int y)
    {
    	if (y == 0 || x == 0) return;
    	//Set a new projection matrix
    	glMatrixMode(GL_PROJECTION);  
    	glLoadIdentity();
    	gluPerspective(60,(double)width/height,0.001,200000);
     
    	glMatrixMode(GL_MODELVIEW);
    	glViewport(0,0,x,y);  //Use the whole window for rendering
    }
    //``````````````````````````````````````````````````
    et les fonctions de picking
    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
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    void select (int x, int y)
    {
        GLuint selectBuf[1024];
        GLint hits=0;
        GLint viewport[4];
     
        glGetIntegerv (GL_VIEWPORT, viewport);
        glSelectBuffer (1024, selectBuf);
        (void) glRenderMode (GL_SELECT);
     
        glInitNames();
        glPushName(0);
     
        glMatrixMode (GL_PROJECTION);
    	glPushMatrix ();                 // push projection 
    	glLoadIdentity ();
    	gluPickMatrix((GLdouble) x, (GLdouble) (viewport[3] - y), 5.0, 5.0, viewport);
    	gluPerspective(60,(double)width/height,0.001,200000);
     
    	picking = true;
    	dessineTerrain();
    	picking = false;
     
        glPopMatrix ();        // pop projection 
        glFlush();
     
        hits = glRenderMode (GL_RENDER);
        processHits (hits, selectBuf);
        glutPostRedisplay();
    }
    //``````````````````````````````````````````````````

  2. #2
    Membre régulier Avatar de shams
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 210
    Points : 83
    Points
    83
    Par défaut
    une fois de plus, on n'est jamais mieux servi que par soit meme:
    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
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    void select (int x, int y)
    {
        GLuint selectBuf[1024];
        GLint hits=0;
        GLint viewport[4];
     
        glGetIntegerv (GL_VIEWPORT, viewport);
        glSelectBuffer (1024, selectBuf);
        (void) glRenderMode (GL_SELECT);
     
        glInitNames();
        glPushName(0);
     
        glMatrixMode (GL_PROJECTION);
    	glPushMatrix ();                 // push projection 
    		glLoadIdentity ();
    		gluPickMatrix((GLdouble) x, (GLdouble) (viewport[3] - y), 5.0, 5.0, viewport);
    		gluPerspective(60,(double)width/height,0.001,200000);
     
    		glMatrixMode(GL_MODELVIEW);
    		glPushMatrix();        /* push modelview */
    			glLoadIdentity();
    			camera->look();
    			picking = true;
    			dessineTerrain();
    			picking = false;
    		glPopMatrix (); // pop modelview
     
    	glMatrixMode (GL_PROJECTION);
        glPopMatrix ();        // pop projection 
     
    	glFlush();
     
        hits = glRenderMode (GL_RENDER);
        processHits (hits, selectBuf);
        glutPostRedisplay();
    }
    //``````````````````````````````````````````````````

  3. #3
    Membre régulier Avatar de shams
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 210
    Points : 83
    Points
    83
    Par défaut
    en fait, il me reste encore un souci. J'arrive bien à clicker sur mes sommets. Mais le numéro retourné part en vrille. Pour les premiers, c'est ok, et à partir de 255, il recommence à zéro!

    Pourtant dans la fonction où est appelé "glLoadName", le "i" s'incrémente correctement...

    Avez-vous déjà eu ce genre de souci?
    Merci d'avance

  4. #4
    Membre régulier Avatar de shams
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 210
    Points : 83
    Points
    83
    Par défaut
    bon je rajoute un élément au problème; Voila comment je regarde s'il y a un truc sous la souris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void processHits (GLint hits, GLuint buffer[])
    {
    	for (int i = 0; i < hits; i++)
    	{
    		trouve = true;
    		pointCourant = (GLubyte)buffer[i * 4 + 3];
    		printf(	"Number: %d\n""Min Z: %d\n""Max Z: %d\n""Name on stack: %d\n",(GLubyte)buffer[i * 4],(GLubyte)buffer[i * 4 + 1],(GLubyte)buffer[i * 4 + 2],(GLubyte)buffer[i * 4 + 3]);
    	}
    	if (hits == 0)	
    	{
    		printf("Rien du tout sous la souris\n");
    		trouve = false;
    	}
    }

  5. #5
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Bonjour,

    Quelques questions :

    - Pourquoi est-ce que je vois du code SDL et du code glut ? (Il y a un appel glutPostRedisplay)

    - C'est une mauvaise idée d'avoir des variables globales (variable trouve dans processHits par exemple).

    - Il faudrait voir un code complet pour vraiment répondre correctement à la question. Mais il me semble qu'il y a un maximum de noms que tu peux utiliser pour le picking. Du coup, tu ne peux pas t'amuser à avoir 10000 noms différents. A mon souvenir, glGetIntegerv(GL_NAME_STACK_DEPTH) te retourne la profondeur de la pile et donc le nombre maximum (ou la puissance de 2) que tu peux donner a glPushName. Donc il faut faire attention à comment tu fais ton code de rendu select.

    Jc

  6. #6
    Membre régulier Avatar de shams
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 210
    Points : 83
    Points
    83
    Par défaut
    Citation Envoyé par fearyourself Voir le message
    - Pourquoi est-ce que je vois du code SDL et du code glut ? (Il y a un appel glutPostRedisplay)
    une erreur dans le copier/coller!


    - C'est une mauvaise idée d'avoir des variables globales (variable trouve dans processHits par exemple).
    tres juste, mais on va deja essayer de faire un picking qui marche, on verra après pour le code hyper pro sans faute


    - Il faudrait voir un code complet pour vraiment répondre correctement à la question. Mais il me semble qu'il y a un maximum de noms que tu peux utiliser pour le picking. Du coup, tu ne peux pas t'amuser à avoir 10000 noms différents. A mon souvenir, glGetIntegerv(GL_NAME_STACK_DEPTH) te retourne la profondeur de la pile et donc le nombre maximum (ou la puissance de 2) que tu peux donner a glPushName. Donc il faut faire attention à comment tu fais ton code de rendu select.
    je vais regarder de ce coté alors, mais ca serait drolement chiant si c'était limité à 255 noms! Ca fait drôlement pas beaucoup!

  7. #7
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Ok je ne crois pas que le nombre soit limité (le paramétre que tu passe a glLoadName ou glPushName) mais plutot le nombre d'éléments sur la pile.

    Il faudrait un exemple minimal pour vraiment pouvoir donner un avis sur pourquoi à 255 ca recommence.

    Jc

  8. #8
    Membre régulier Avatar de shams
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 210
    Points : 83
    Points
    83
    Par défaut
    bon je viens de faire un essai avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glGetIntegerv(GL_MAX_NAME_STACK_DEPTH, &i);
    ca me retourne i=100 !! C'est dingue ce truc... par contre quel est la différence entre le nombre d'éléments sur la pile et le paramètre de glLoadName ?

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 9
    Points : 11
    Points
    11
    Par défaut
    GL_MAX_NAME_STACK_DEPTH concerne uniquement la profondeur de la pile (donc le nombre de glPushName() que tu peux faire "consécutivement" avant d'avoir une erreur), pas les valeurs contenues qui sont elles des entiers, donc, tu dois pouvoir en mettre 4 milliards et des poussières.
    Par contre, dans ta fonction ProcessHits, tu castes tout en GLubyte, je vois donc mal comme il pourrait y avoir une valeur supérieur à 255 d'afficher.

  10. #10
    Membre régulier Avatar de shams
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 210
    Points : 83
    Points
    83
    Par défaut
    Citation Envoyé par HunLyxxod Voir le message
    Par contre, dans ta fonction ProcessHits, tu castes tout en GLubyte, je vois donc mal comme il pourrait y avoir une valeur supérieur à 255 d'afficher.
    J'aime ce genre de remarque!!!! Evidemment en virant le GLubyte, tout de suite ca marche beaucoup mieux!

    Merci beaucoup!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] encore un probleme php mysql
    Par ph_anrys dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 02/03/2006, 16h14
  2. Et oui encore un probleme d'icone dans une Jframe
    Par frett dans le forum Agents de placement/Fenêtres
    Réponses: 7
    Dernier message: 17/02/2006, 15h12
  3. Encore un probleme
    Par lord jere dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 30/01/2006, 16h40
  4. Encors un problem avec IE
    Par Death83 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 24/10/2005, 16h55
  5. Réponses: 7
    Dernier message: 16/07/2004, 13h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo