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 :

Rotation d'un seul objet?


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Par défaut Rotation d'un seul objet?
    Bonjour,
    Dans j'essaye de faire tourner un sprite, et j'ai essayé plein de bidouilles, mais soit c'est toute la scène qui tourne, soit rien ne tourne.
    Voici le code :

    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
     
    	// On sauvegarde la matrice modelview
    	glMatrixMode(GL_MODELVIEW);
     
    	glPushMatrix();
     
    	glTranslatef(-pos_X, -pos_Y, 0);
     
    	// On le tourne
    	glRotatef(0.1, 0.f, 0.f, 1.f);
     
    	glTranslatef(pos_X, pos_Y, 0);
     
    	// Affichage de l'objet
     
    	glEnable(GL_ALPHA_TEST);
    	glAlphaFunc(GL_GREATER, 0.5f);
     
    	glBindTexture (GL_TEXTURE_2D, surface);
     
        glBegin(GL_QUADS);
     
            glTexCoord2f (0, 0);
    		glVertex2i(pos_X, pos_Y);
     
            glTexCoord2f (0, 1);
    		glVertex2i(pos_X, pos_Y + rectsrc.h);
     
            glTexCoord2f (1, 1);
    		glVertex2i(pos_X + rectsrc.w, pos_Y + rectsrc.h);
     
            glTexCoord2f (1, 0);
    		glVertex2i(pos_X + rectsrc.w, pos_Y);
     
        glEnd();
     
    	glDisable(GL_ALPHA_TEST); 
     
    	glPopMatrix() ;

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 32
    Par défaut
    je ne suis pas du tout sûr mais il me semble que glMatrixMode(GL_MODELVIEW); est inutile et est à l'origine du problème...

  3. #3
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 125
    Par défaut
    J'essaye de faire tourner un sprite
    Tu dis que tu veux faire 'tourner' ton sprite mais je ne vois rien de dynamique dans ton code. Pour voir quelque chose de dynamique, il aurait fallu
    - soit une variable dans ton glRotatef(), par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    glRotatef(t,0,0,1);
     
    ...
     
    t+=vitesse_de_rotation;
     
    ...
    - soit supprimer les glPush et glPopMatrix afin d'accumuler les rotations et donner un aspect dynamique.

    soit c'est toute la scène qui tourne
    Pour résoudre ce problème, il faudrait que tu nous montre plus de code puisque tu nous présente que le dessin de ton sprite ici.

  4. #4
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Par défaut
    Pour ce qui est de glrotate(0.1,0,0,1) c'est bien dynamique puisqu'à chaque fois que la ligne sera lue il y aura une rotation de 0.1 : ce n'est pas une rotation absolue.

    Pour le reste du code voici :

    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
    129
    130
     
    int main (int argc, char *argv[])
    {   	
     
     
        SDL_Init(SDL_INIT_VIDEO);
        SDL_WM_SetCaption(GAME_TITLE, NULL);
        SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1);
        SDL_SetVideoMode(RESOLUTION_X, RESOLUTION_Y, 0, SDL_OPENGL);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluOrtho2D(0, RESOLUTION_X, RESOLUTION_Y, 0);
        glEnable (GL_TEXTURE_2D);
     
     
    	//On passe par la SDL pour quitter le programme
    	//Probablement pour libérer la mémoire
    	atexit(SDL_Quit);
     
    	//Initialisation de la partie
    	NewGame();
     
    	return 0;
    }	
     
     
     
     
     
    void NewGame()
    {
     
    	//On va charger les images en mémoire
    	LoadImages();
     
     
    	//Paramètres d'initialisation de l'instance joueur
    	player.setpos(248,270);
    	player.setaction(RIGHT, MIDDLE);
     
    	//Paramètres d'initialisation des instances des objets
     
    	bowl.initpos(0,430,1);
     
    	//On commence la partie (boucle principale) 
    	Run();
     
    }
     
     
    void LoadImages()
    {
     
    	level.loadbackground("Medias/Backgrounds/original.png");
    	player.load("Medias/Sprites/Karateka bonus.png",360,320,3,2);
    	bowl.load("Medias/Sprites/Bowl2.png",54,54,1,1);
     
    }
     
     
     
    void Run()
    {
     
    	//variables pour gérer les événements
    	SDL_Event event;
    	bool done=false;
    	Uint8* keys; 
     
    	//String avec le nombre de FPS
    	char fps[5];
     
     
    	//Boucle principale
    	while(!done)
    	{
     
    		while(SDL_PollEvent(&event))
     
     
    		switch(event.type)
    		{
     
    		case SDL_QUIT:
    			done = true;
    			break;
     
    		case SDL_KEYDOWN :
    			keys = SDL_GetKeyState(NULL);
    			if ( keys[SDLK_ESCAPE] ) {done=1;}
    			if ( keys[SDLK_UP] ) { player.setaction(player.way,UP); }
    			if ( keys[SDLK_DOWN] ) { player.setaction(player.way,DOWN); }
    			if ( keys[SDLK_LEFT] && player.way==LEFT ) { player.setaction(LEFT,MIDDLE); }
    			if ( keys[SDLK_LEFT] && player.way==RIGHT ) { player.setaction(LEFT,player.movement); }
    			if ( keys[SDLK_RIGHT] && player.way==RIGHT) { player.setaction(RIGHT,MIDDLE); }
    			if ( keys[SDLK_RIGHT] && player.way==LEFT) { player.setaction(RIGHT,player.movement); }
     
    			break;
     
    		}
     
     
    	level.drawbackground();
     
    	bowl.update();
     
    	Draw();
     
    	TestCollision();
     
    	//Affichage du nombre de FPS
    	sprintf(fps, "%d", calculFPS());
    	SDL_WM_SetCaption(fps, NULL);
     
    	SDL_GL_SwapBuffers();
     
     
    	}
     
     
    }
     
     
    void Draw()
    {
     
    	player.draw();
    	bowl.draw();
     
    }

  5. #5
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 125
    Par défaut
    à chaque fois que la ligne sera lue il y aura une rotation de 0.1
    Pas avec le code que tu as présenté puisque l'instruction glRotatef() est placée entre un glPushMatrix() et un glPopMatrix() donc les rotations ne s'accumulent pas !

  6. #6
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Par défaut
    Oui, je croyait qu'il n'y avait pas de rotation car jamais mis un angle de rotation faible.
    Par contre, actuellement seul le sprite a pivoté ce que je souhaitait, mais il n'avance plus droit lors que j'augmente pos_X.

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

Discussions similaires

  1. Un état pour un seul objet
    Par spekal dans le forum UML
    Réponses: 1
    Dernier message: 20/06/2006, 09h53
  2. rotation autour d'un objet scene OpenGL
    Par hysah dans le forum OpenGL
    Réponses: 1
    Dernier message: 01/05/2006, 17h31
  3. Modifier la couleur d'un seul objet d'une ListBox
    Par [Silk] dans le forum Composants VCL
    Réponses: 8
    Dernier message: 03/01/2006, 21h55
  4. 2 compositions pour un seul objet
    Par Jorus dans le forum Diagrammes de Classes
    Réponses: 6
    Dernier message: 31/10/2005, 13h41
  5. Réponses: 13
    Dernier message: 25/01/2005, 10h05

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