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 :

[debutant] une vue d'en haut...


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 138
    Par défaut [debutant] une vue d'en haut...
    Bonjour,

    J'ai fait ma scene (2D) sans utiliser de perspective et autre... ainsi, mes coordonées se trouvent entre -1 et 1.

    Cependant, j'aimerai bien faire une translation en Z, afin d'avoir ma scène sur les coordonnées comprisent entre -10 et 10 (par exemple).

    Pour cela je fais un glTranslated (0.0, 0.0, 10.0) dans la matrice de projection (GL_PROJECTION). Cependant, ca ne marche pas et plus rien ne s'affiche. Pourtant quand je fais une translation en x (ou y), ça marche. (J'ai essayé les coordonnées positives et négatives pour z dans le doute )

    Dans mon initialisation de glut (oui j'utilise glut pour l'affichage ... je verrai pour passer en SDL si j'ai le temps), j'ai mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH);
    voici la partie du code qui affiche ma scène :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            glClear(GL_COLOR_BUFFER_BIT);
    	glMatrixMode(GL_PROJECTION);
    	glLoadIdentity();
    	glTranslated (0.0, 0.0, 10.0);
    	glMatrixMode (GL_MODELVIEW);	
    	glLoadIdentity ();
            //ici dessin de la scène
    Qu'est-ce que j'ai (encore ! ) oublié ?

    Merci d'avance

  2. #2
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 594
    Par défaut
    la matrice de projection n'est pas la caméra
    c'est la matrice qui effectuer les transformations 3D -> 2D écran = projection

    ton translate doit être dans le modelview
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 138
    Par défaut
    ah d'accord, oui en effet, je n'ai pas fait gaffe.

    Mais ça ne marche pas mieux en faisant la correction... en fait j'ai une fenêtre noire

    voici la correction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    	glClear(GL_COLOR_BUFFER_BIT);
    	glMatrixMode (GL_MODELVIEW);
    	glLoadIdentity ();
    	glTranslated (0.0, 0.0, 2.0); //test avec une translation de 2
            //dessin

  4. #4
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 594
    Par défaut
    d'accord tu fais une translation de 2 unités sur Z, mais ton déplacement te fait-il avancer ou reculer ?

    ton objet, lorsque tu le dessine, n'est-il pas derrière toi ?

    à mon avis ton objet n'est pas dans le cone de visibilité, si ton dessin est bon bien sûr sinon il faudra regarder là aussi
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 138
    Par défaut
    Je comprends pas trop ce que tu veux dire par "avancer ou reculer".

    Lorsque j'appelle la fonction glTranslate(d)(f), mon dessin ne s'affiche pas (enfin lorsque je mets z à 1 ou -1, ça marche, je le vois comme si je n'avais pas appelé la fonction )

    je pense que mon dessin est bon, parce que lorsque je ne fais aucune transformation, il s'affiche correctement.

    en plus, c'est assez "basic", je fais une series de rectangles (donc des GL_QUADS).

    Voici mon premier rectangle (enfin un carré) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        glBegin(GL_QUADS);
    		glColor3f (0.4, 0.8, 0.5);
    		glVertex3f(-1, 1, 0);
    		glVertex3f(1, 1, 0);
    		glVertex3f(1, -1, 0);
    		glVertex3f(-1, -1, 0);
    	glEnd ();
    J'ai commenté le reste de mon dessin à savoir l'affichage de mes autres objects ; ainsi, c'est ce qui est appelé aussitôt après le code précédent. Si cela marche, les autres objets devraient bien s'afficher après
    Comme on peut le voir, c'est un carré qui prend tout l'écran.

    J'initialise rien au final, je fais mon dessin et point barre.

    J'ai essayé aussi avec la fonction gluLookAt, mais là aussi, sans résultat

    Il n'y a pas quelque chose à initialiser ou un truc comme cela que j'aurai pu oublié ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 138
    Par défaut
    Bon après avoir relu 2-3 tutorials et fait quelques tests, j'ai changé la fonction glTranslate(d)(f) par gluOrtho2D(...) et ca semble bien marcher.

    Par contre, je ne comprends pas bien pourquoi avec glTranslated ca marche pas ?

    bon enfin si je peux m'arranger avec gluOrtho2D, c'est déjà pas mal

    Merci

  7. #7
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 594
    Par défaut
    avec gluOrtho2D tu n'es plus en projection perspective 3D et projection orthogonale 2D, ce qui peut en effet résoudre ton problème, ou le contourner

    pour ce qui est de ton translate, tu devrais faire un essai "d'animation" pour comprendre mieux quand je parle d'avancer ou de reculer
    tu fais un glTranslated(0,0,z) en faisant varier z de 2 à -2 par exemple

    en tout cas tu initialises bien la vue avec gluPerspective ou gluOrtho2D (selon les cas)
    en fonction des paramètres que tu met tu peux avoir des problèmes
    si tu veux tu nous met ton code et on voit ensemble ce qui ne va pas
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  8. #8
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 594
    Par défaut Re: [debutant] une vue d'en haut...
    Citation Envoyé par maniaco_jazz
    voici la partie du code qui affiche ma scène :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            glClear(GL_COLOR_BUFFER_BIT);
    	glMatrixMode(GL_PROJECTION);
    	glLoadIdentity();
    	glTranslated (0.0, 0.0, 10.0);
    	glMatrixMode (GL_MODELVIEW);	
    	glLoadIdentity ();
            //ici dessin de la scène
    Qu'est-ce que j'ai (encore ! ) oublié ?

    Merci d'avance
    en fait, je viens d'y penser
    tu passes en matrice projection, tu appelles la matrice identité, mais tu n'initalise pas la projection hors c'est ici que tu dois utiliser gluPerspective ou gluOrtho2D
    ensuite tu peux passer en matrice modelview et appeler glLoadIdentity pour ensuite faire tes translates et autres rotates

    désolé que ça arrive si tardivement
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 138
    Par défaut
    Oui, bonne idée, je vous mets le code "simplifié" (sans les fonctions inutiles ) :
    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
     
    #include <stdio.h>
    #include <windows.h>
    #include <GLUT/glut.h>
    #include "gl_warsim.h"
     
    float	old_x;
    float	old_y;
     
    //INITIALISATION
    #define	TROOP_MAX	3
    void	initialisation (void)
    {
    	int		i;
    	float	x, y;
    	troop	tmp;
     
    	if ((tab_troop = (troop *) malloc (TROOP_MAX * sizeof (troop))) < 0)
    	{
    		printf ("--> initialisation error : tab_troop malloc\n");
    		exit (-1);
    	}
    	for (i = 0, x = -7, y = -2; i < TROOP_MAX; i++)
    	{
    		tmp = tab_troop[i];
    		tmp.id = i + 1;
    		tmp.coord.x = x;
    		tmp.coord.y = y;
    		tmp.selected = 0;
    		tmp.life = LIFE_INF;
    		tmp.type = 1;
    		tmp.name = 0;
    		tab_troop[i] = tmp;
    		x += TROOP_SIZE * LIFE_INF + 0.5;
    		printf ("id = %d\nx = %f ; y = %f\n--\n", tmp.id, tmp.coord.x, tmp.coord.y);
    	}
    	printf ("*** initiation successfull ***\n");
    }
     
    //DRAW_REGIMENT : draw a regiment
    void	draw_regiment (int id)
    {
    	troop	tmp;
    	float	x, y;
    	int		nb;
    	int		selected;
     
    	printf ("drawing regiment %d\n", id + 1);
    	tmp = tab_troop[id];
    	x = tmp.coord.x;
    	y = tmp.coord.y;
    	nb = tmp.life;
    	selected = tmp.selected;
    	printf ("x = %f ; y = %f ; nb = %d\n", x, y, nb);
    	glLoadName (id + 1);
    	glBegin (GL_QUADS);
    		if (selected) glColor3f (TROOP_COLOR1_SR, TROOP_COLOR1_SG, TROOP_COLOR1_SB);
    		else glColor3f (TROOP_COLOR1_R, TROOP_COLOR1_G, TROOP_COLOR1_B);
    		glVertex2f (x, y);
    		glVertex2f (x + (TROOP_SIZE * nb), y);
    		glVertex2f (x + (TROOP_SIZE * nb), y - 1);
    		glVertex2f (x, y - 1);
    	glEnd ();
    }
     
    //DRAW_TROOPS : draw troops with tab_troop
    void	draw_troops (void)
    {
    	int	i;
     
    	for (i = 0; i < TROOP_MAX; i++) draw_regiment (i);
    }
     
    //RESHAPE
    void reshape (int w, int h)
    {
      glViewport     (0, 0, w, h);
      glMatrixMode   (GL_PROJECTION);						// Select The Projection Matrix
      glLoadIdentity ();
      glMatrixMode (GL_MODELVIEW);							// Select The Model View Matrix
      glLoadIdentity ();									// Reset The Model View Matrix
    }
     
    void	draw_battlefield (void)
    {
    	glBegin(GL_QUADS);
    		glColor3f (0.4, 0.8, 0.5);
    		glVertex3f(-9, 9, 0);
    		glVertex3f(9, 9, 0);
    		glVertex3f(9, -9, 0);
    		glVertex3f(-9, -9, 0);
    	glEnd ();
    }
     
    void	draw_scene ()
    {
    	glClear(GL_COLOR_BUFFER_BIT);
    	glMatrixMode (GL_MODELVIEW);
    	glLoadIdentity ();
        //glTranslated (0, 0, 2);  <=====
    	gluOrtho2D(-10,10,-10,10);
    	draw_battlefield ();
    	draw_troops ();
     
    }
     
    void	display (void)
    {
    	draw_scene ();
    	glFlush ();
    	glutSwapBuffers ();
    }
     
    //main function
    int		main(int argc, char** argv)
    {
    	glutInit(&argc, argv);
    	glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH);
    	glutInitWindowSize(600,600);
    	glutInitWindowPosition(20, 20);
    	glutCreateWindow("WARGAME SIMULATION v0.02");
    	glutDisplayFunc (display);
    	glutReshapeFunc (reshape);
    	initialisation ();
    	glutMainLoop();
     
    	return 0;
    }
    voilà, cela peut surement aider.

    Merci en tout cas pour l'explication

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 138
    Par défaut Re: [debutant] une vue d'en haut...
    Citation Envoyé par shenron666
    Citation Envoyé par maniaco_jazz
    voici la partie du code qui affiche ma scène :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            glClear(GL_COLOR_BUFFER_BIT);
    	glMatrixMode(GL_PROJECTION);
    	glLoadIdentity();
    	glTranslated (0.0, 0.0, 10.0);
    	glMatrixMode (GL_MODELVIEW);	
    	glLoadIdentity ();
            //ici dessin de la scène
    tu passes en matrice projection, tu appelles la matrice identité, mais tu n'initalise pas la projection hors c'est ici que tu dois utiliser gluPerspective ou gluOrtho2D
    je comprends pas bien ce que tu veux dire en fait comment initialise-t-on la matrice de projection ? je croyais que c'était justement en appelant glLoadIdentity () qu'on initialisait la matrice (matrice identité) nan ?

  11. #11
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 594
    Par défaut
    La matrice identité ne fait ... rien, ou plus précisément, multiplier une matrice M par la matrice identité donne comme résultat la matrice M
    en fait, appeler la matrice identité a pour but de réinitialiser la matrice sélectionnée (ici la matrice projection)
    ensuite pour avoir une projection en perspective, tu dois appliquer des modifs à la matrice projection, tu utilises donc gluPerspective qui a générer une matrice en fonction des paramètres que tu lui passe et multiplier cette matrice avec la matrice projection existante (que tu as donc précédemment initialisé)
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 138
    Par défaut
    Ah d'accord je comprends mieux.

    Mais du coup, c'est quoi la meilleure solution ? utiliser gluperspective avant et après faire une translation ou faire comme j'ai fait à la fin, utiliser gluOrtho2D qui est à la rigueur plus logique ?

    En tout cas avec gluOrtho2D, ca marche bien, j'ai juste du changer mes coordonées de mes formes pour qu'elles soient elles aussi à l'échelle (avec 10 dans mon z, j'ai du donc en gros multiplié par 10 )

    Enfin ce qu'il faut savoir, c'est que ce que je veux faire, ce sera de la 2D, avec des formes (2D) qui seront sélectionnées et déplacées. Aucune 3D n'apparaitra.

  13. #13
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 594
    Par défaut
    gluPerspective c'est pour avoir un effet de profondeur, projection en perspective
    donc si tu fais de la 2D, je pense que c'est plus simple d'utiliser gluOrtho2D
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 138
    Par défaut
    Merci pour ton aide

    Je marque comme résolu.

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

Discussions similaires

  1. [debutant]une appli vue de l'exterieur!
    Par decksroy dans le forum Wildfly/JBoss
    Réponses: 4
    Dernier message: 12/03/2007, 09h56
  2. [Debutant]Problème de création d'une vue indexée
    Par Le Pharaon dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 15/11/2006, 13h50
  3. [DEBUTANT] Une vue dans une procedure stockee ?
    Par Invité dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/02/2004, 12h57
  4. Export d'une vue avec LEFT JOIN
    Par schnourf dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 22/05/2003, 14h57
  5. Créer une vue pour trier une requete UNION ?
    Par Etienne Bar dans le forum SQL
    Réponses: 3
    Dernier message: 03/01/2003, 21h22

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