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 :

Annuler toutes transformations ? [OpenGL 1.x]


Sujet :

OpenGL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Octobre 2011
    Messages : 72
    Points : 38
    Points
    38
    Par défaut Annuler toutes transformations ?
    Bonjour,

    Je me heurte à un problème : je crée un jeu du labyrinthe avec plusieurs niveaux, etc.
    Et je voudrais qu'à chaque niveau corresponde une petite feature qui ferait varier le gameplay : changement de touches, rotation, obscurité, flou... ( à la manière des jeux chiants de Kek pour ceux qui connaissent)
    Seulement, je ne parviens pas à faire cette chose simple :
    Après le niveau qui tourne sur lui-même (j'utilise un glTranslate, puis un glRotate, puis un glTranslate pour cela), j'aimerais que la vue soit rétablie à la normale, et je n'y parviens pas !
    Comment faire ?

    J'ai dans ma boucle de jeu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    if (getLvl() == lvl_spin) {
    	if (angleZ <= -5 || angleZ >= 5) aug = !aug;
    	if (aug) angleZ += rot_speed;
    	else angleZ -= rot_speed;
    	glTranslated(COLUMNS/2, LINES/2, 0);
    	glRotated(angleZ, 0.0, 0.0, 1.0); // Pas de glPush ou Pop, on veut un effet d'accélération -> cumul des opérations
    	glTranslated(-COLUMNS/2, -LINES/2, 0);
    	Sleep(50);
    } else if (getLvl() > lvl_spin){
            // Ici, le code pour rétablir la vue...
    }
    Si quelqu'un a des idées, je suis preneur. J'ai tenté des trucs avec glLoadIdentity, ou en inversant les transformations pour essayer de revenir en arrière, mais rien ne marche...

    EDIT : C'est mieux, je passe par une variable qui fait la somme des rotations, et donc je fais la rotation inverse avec cette somme quand je sors du niveau pour annuler toutes les rotations, mais le niveau n'est pas bien cadré, sûrement à cause des glTranslated !
    Voilà le nouveau 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
     
    if (getLvl() >= lvl_spin) {
    	if (getLvl() == lvl_spin) {
    		if (angleZ <= -5 || angleZ >= 5) aug = !aug;
    		if (aug) angleZ += rot_speed;
    		else angleZ -= rot_speed;
    		sumAngle += angleZ;
    		glTranslated(COLUMNS/2, LINES/2, 0);
    		glRotated(angleZ, 0.0, 0.0, 1.0);
    		glTranslated(-COLUMNS/2, -LINES/2, 0);
    	} else {
    		glRotated(-sumAngle, 0.0, 0.0, 1.0);
    		sumAngle = 0;
    	}
    	Sleep(50);
    }
    Au moins le niveau est de nouveau droit... Mais je ne sais pas trop quel calcul faire pour revenir au centre de l'écran ! Là, mon niveau n'est plus centré...


    RE-EDIT : Je ne comprends pas ! Ceci devrait marcher, non ? Je stocke les opérations, et je les fais dans l'ordre inverse une fois le niveau terminé pour revenir à la normale... Encore une fois, la rotation est remise à zéro comme dans mon essai juste au-dessus, donc ça c'est bon, mais la translation doit mal se faire car le niveau est décentré...

    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
     
    bool reset_done = false;
    vector<float> angleVec;
    if (getLvl() >= lvl_spin) {
    	if (getLvl() == lvl_spin) {
    		if (angleZ <= -5 || angleZ >= 5) aug = !aug;
    		if (aug) angleZ += rot_speed;
    		else angleZ -= rot_speed;
    		angleVec.push_back(angleZ);
    	glTranslated(COLUMNS/2, LINES/2, 0);
    		glRotated(angleZ, 0.0, 0.0, 1.0);
    		glTranslated(-COLUMNS/2, -LINES/2, 0);
    	} else if (!reset_done) {
    		for(int i = angleVec.size()-1; i >= 0; i--) {
    			glTranslated(COLUMNS/2, LINES/2, 0);
    			glRotated(-angleVec[i], 0.0, 0.0, 1.0);
    			glTranslated(-COLUMNS/2, -LINES/2, 0);
    		}
    		reset_done = true;
    	}
    }

  2. #2
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 136
    Points
    10 136
    Par défaut
    c'est simple il suffit d'utiliser

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Octobre 2011
    Messages : 72
    Points : 38
    Points
    38
    Par défaut
    Salut Kannagi,
    Merci ,
    Mais à quel endroit exactement ?

  4. #4
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 136
    Points
    10 136
    Par défaut
    ben ou tu veux , cela remettra a la normal tout tes transformation.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Octobre 2011
    Messages : 72
    Points : 38
    Points
    38
    Par défaut
    Euh chez moi ça marche pas du tout...
    Tu veux dire que je devrais simplement le mettre dans le else ?
    Si c'est ça alors ça ne marche pas !

  6. #6
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 136
    Points
    10 136
    Par défaut
    Je sais pas trop chez moi ça marche ,mais imaginant que tu veux deux cube avec 2 transformation différente tu peux faire cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    glLoadIdentity();
    glTranslatef(5,0,6);
    glRotatef(180,0,1,0);
    //dessiner cube 1 
     
    glLoadIdentity();
    glTranslatef(1,22,2);
    glRotatef(45,1,0,0);
    //dessiner cube 2

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Octobre 2011
    Messages : 72
    Points : 38
    Points
    38
    Par défaut
    Ah oui ça je sais merci ^^
    Mais je ne parviens pas à placer l'appel à glLoadIdentity() au bon endroit... Si je le fais avant mes glTranslated et Rotated, j'ai l'impression que ça rame, en tous cas c'est beaucoup plus lent...
    Et c'est normal puisque du coup je n'ai plus de rotations cumulées...
    Mais justement, pour avoir l'impression d'accélération, je veux les garder, mes rotations cumulées !
    Bon. Je suis parti sur autre chose.
    Avec ce 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
     
    if (getLvl() == lvl_spin) {
    	if (angleZ <= -5 || angleZ >= 5) {
    		aug = !aug;
    		angleZ = 0;
    	}
    	if (aug) angleZ += rot_speed;
    	else angleZ -= rot_speed;
    	glTranslated(COLUMNS/2, LINES/2, 0);
    	glRotated(angleZ, 0.0, 0.0, 1.0);
    	glTranslated(-COLUMNS/2, -LINES/2, 0);
    } else {
     
    }
    Je voudrais que lorsque je finis le niveau qui tourne (donc dans mon else, lorsque getLvl() > lvl_spin), ça continue de tourner jusqu'à se remettre droit... C'est une alternative qui me paraît moins compliquée mais je n'y arrive pas !

  8. #8
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 136
    Points
    10 136
    Par défaut
    Pas sur de comprendre mais effectivement faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    glLoadIdentity();
    glRotated(45, 0.0, 0.0, 1.0);
    glRotated(45, 0.0, 0.0, 1.0);
    Et équivalent a faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    glLoadIdentity();
    glRotated(90, 0.0, 0.0, 1.0);
    Bref ce n'est pas plus long donc que de mettre glLoadIdentity(); , si tu le met il faudra multipliez la vitesse de rotation tout simplement au lieu d'utiliser plusieurs fois glRotated par exemple,donc je pense que erreur vient plus d'une mauvaise conception de ta part.

  9. #9
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 826
    Points : 218 287
    Points
    218 287
    Billets dans le blog
    117
    Par défaut
    Bonjour,

    Vous pouvez utiliser glPushMatrix() et glPopMatrix(). Cela permet de mettre la matrice actuelle dans une pile et de la récupérer plus tard. Donc, une fois que vous mettez dans la pile, vous pouvez continuer les transformations et ensuite, revenir à la matrice précédemment mise sur la pile afin "d'annuler" les transformations.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Octobre 2011
    Messages : 72
    Points : 38
    Points
    38
    Par défaut
    Bonjour,
    Merci pour votre réponse,

    Ok alors j'ai ce 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
     
    if (getLvl() == lvl_spin) {
    	if (!flag) {
    	        flag = true;
    		glPushMatrix();
    	}
    	if (angleZ <= -5 || angleZ >= 5) {
    		aug = !aug;
    		angleZ = 0;
    	}
    	if (aug) angleZ += rot_speed;
    	else angleZ -= rot_speed;
    	glTranslated(COLUMNS/2, LINES/2, 0);
    	glRotated(angleZ, 0.0, 0.0, 1.0);
    	glTranslated(-COLUMNS/2, -LINES/2, 0);
    } else if (!reset_done) {
    	glPopMatrix();
    	reset_done = true;
    }
    flag et reset_done sont des booléens initialisés à false au début de mon programme; Ils sont simplement là pour m'assurer que le glPush et le glPopMatrix ne seront effectués qu'une seule fois.
    On est d'accord que là, ça devrait marcher ?
    Je fais le glPushMatrix() une seule fois au tout début, ensuite je fais mes glTranslated et glRotated, et quand je termine le niveau, je fais glPopMatrix(), une seule fois...
    Et ça ne marche pas, ça me met toujours une image décentrée et tournée, le résultat est le même que si je n'avais pas fait les glPush et pop

  11. #11
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 826
    Points : 218 287
    Points
    218 287
    Billets dans le blog
    117
    Par défaut
    On peut avoir des captures d'écran de ce que vous faites (avec explication).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Octobre 2011
    Messages : 72
    Points : 38
    Points
    38
    Par défaut
    Ok, désolé du retard j'étais pas chez moi,
    Voilà deux screens, le premier lorsque je suis en train de jouer dans le niveau qui tourne, et le deuxième, c'est le niveau suivant (donc là je rentre dans le else de mon code).
    Il ne tourne plus, donc c'est bien, mais il est complètement tourné et décentré !

    Nom : Sans titre.png
Affichages : 106
Taille : 176,9 KoNom : Sans titre2.png
Affichages : 80
Taille : 92,0 Ko

  13. #13
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 826
    Points : 218 287
    Points
    218 287
    Billets dans le blog
    117
    Par défaut
    Ah vue de nez, mettez un glLoadIdentity() lorsque vous commencez le level 2.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Octobre 2011
    Messages : 72
    Points : 38
    Points
    38
    Par défaut
    Du coup, j'ai le code précédent, mais avec le glLoadIdentity en plus :

    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
     
    if (getLvl() == lvl_spin) {
    	if (!flag) {
    		glPushMatrix();
    		flag = true;
    	}
    	if (angleZ <= -5 || angleZ >= 5) aug = !aug;
    	if (aug) angleZ += rot_speed;
    	else angleZ -= rot_speed;
    	glTranslated(COLUMNS/2, LINES/2, 0);
    	glRotated(angleZ, 0.0, 0.0, 1.0);
    	glTranslated(-COLUMNS/2, -LINES/2, 0);
    } else if (getLvl() > lvl_spin) {
    	if (!reset_done) {
    		glPopMatrix();
    		glLoadIdentity();
    		reset_done = true;
    	}
    }
    Ca ne marche pas, même résultat apparemment...
    Est-ce que ça viendrait du fait que je fais ces opérations dans ma glutIdleFunc() ?

    EDIT : Au temps pour moi c'était ça ! J'ai mis ce bout de code dans ma glutDisplayFunc ça marche très bien. Et je n'ai même pas besoin de rajouter le glLoadIdentity(), ce qui est logique après tout !

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

Discussions similaires

  1. Annuler tout le traitement
    Par Dordubre dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 19/04/2012, 17h54
  2. Restaurer une base de données / annuler toute modification
    Par flzox dans le forum Accès aux données
    Réponses: 11
    Dernier message: 05/12/2011, 15h09
  3. Réponses: 1
    Dernier message: 07/06/2011, 16h06
  4. [XL-2003] annuler tout avant enregistrement
    Par olivier-tig dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 18/05/2009, 15h00
  5. Réponses: 7
    Dernier message: 29/11/2005, 12h07

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