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

GLUT Discussion :

tetris 3d: rotation scene + souris


Sujet :

GLUT

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 26
    Points : 8
    Points
    8
    Par défaut tetris 3d: rotation scene + souris
    Bonjour, je développe actuellement un tetris en 3d et je débute en c++/openGL/glut/tout ^^
    j'arrive a utiliser la fonction glutMotionFunc (quand même pas mauvais a ce point là ^^) mais, pas comme je le voudrait, je m'explique :

    mon but est de faire tourner la scène dans le sens de la souris...
    pour faire tourner ma scene, j'utilise un
    et voici ma fonction pour la souris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void mouse(int x, int y){
     
         if(x>400){
         a+=1;
         }
         else if(x<400){
         a-=1;
         }
     
    }
    seulement, ce code ne vas pas ... en effet, ce que j'aimerai c'est que, selon le déplacement de la souris la scène bouge ==> la souris bouge vers la droite, la scene tourne vers la droite , pareil pour la gauche ...

    je ne voit pas comment faire ...

    tant que j'y suis, je vais pas faire 20 sujet, j'enchaine sur un autre problème :

    je déplace mes pieces en incrémentant/décrémentant la valeur x,y ou z de chacune des faces bon, ça marche très bien ... un seul problème :

    quand la scène tourne, le repère tourne avec >< ce qui fait que les pieces ne se déplacent plus par rapport au repère de départ ...
    (je fait tourner la scene avec un glRotated(a,0,1,0); )
    comment puis-je faire pour faire tourner la scène sans le repère ?

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    seulement, ce code ne vas pas ... en effet, ce que j'aimerai c'est que, selon le déplacement de la souris la scène bouge ==> la souris bouge vers la droite, la scene tourne vers la droite , pareil pour la gauche ...
    Il faut bouger selon le déplacement relatif de la souris (position actuelle moins position précédente).

    quand la scène tourne, le repère tourne avec >< ce qui fait que les pieces ne se déplacent plus par rapport au repère de départ ...
    (je fait tourner la scene avec un glRotated(a,0,1,0); )
    comment puis-je faire pour faire tourner la scène sans le repère ?
    Il suffit d'utiliser correctement les empilements / dépilement de matrices, avec glPushMatrix et glPopMatrix.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    ok, pour la souris c'est bon, merci

    Il suffit d'utiliser correctement les empilements / dépilement de matrices, avec glPushMatrix et glPopMatrix.
    alors la par contre >< a rien compris ... à quoi servent glPushMatrix et glPopMatrix ? et comment les utiliser ?

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    glPushMatrix permet d'empiler (-> sauvegarder) la matrice de transformation (modelview ou projection) courante. glPopMatrix permet de dépiler (-> restaurer) la dernière matrice qui a été empilée.

    Donc, si tu places un certain nombre de transformations entre un glPushMatrix et un glPopMatrix, celles-ci n'auront aucun effet sur ce qui se trouve après.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    euh ok, mais je ne voit pas du tout comment l'utiliser dans mon cas

    parceque ... si je fait tourner, même entre un glPushMatrix et un glPopMatrix, le repère tourne avec ... ah moins que je ne comprenne rien du tout

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glPushMatrix();
        // Tourne ta scène
        // Affiche ta scène
    glPopMatrix();
        // Déplace tes objets : ici le repère sera bien l'identité
        // Tourne tes objets si besoin
        // Affiche tes objets
    Par contre je ne comprends pas pourquoi, si tu tournes la scène entière, tu ne voudrais pas qu'une translation de tes pièces prenne en compte cette rotation

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    et bien, en faite, je ne fait pas une translation ... car je ne voit pas du tout lcomment je pourrait l'utiliser

    effectivement, j'ai une fonction Piece, dans laquelle je dessine mes pieces (je les dessines face par face pour l'instant)

    et j'ai ma fonction key dans laquelle je gere les evenements clavier.

    C'est pourquoi dnas ma fonction piece, je dessine les faces de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    glVertex3d(ix,igrec,zed);
    glVertex3d(ix,1+igrec,zed);
    glVertex3d(ix+1,1+igrec,zed);
    glVertex3d(ix+1,igrec,zed);
    dans ma fonction key, je n'ai plus qu'a changer les valeurs de ix, igrec et zed ...


    mais ... effectivement, en utilisant une translation, ça réglerait surement beaucoup de problème

    mais comment l'utiliser ?

    car glTranslated doit se trouver dans la même fonction que mon dessin de piece ... donc là, comprend pas ><

    a mois de refaire tout le code de tel façon que ce soit possible ... mais là ... voit pas comment ^^

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Je ne comprends pas bien quel problème tu as avec glTranslated

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    et bien ... en fait, mon code est structuré comme ça :

    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
     
    #include <GL/glut.h>
    #include <stdlib.h>
    #define NBPIECE 50
     
    double igrec[NBPIECE];
    double ix[NBPIECE];
    double zed[NBPIECE];
    int num
     
    void Piece(double igrec, double ix, double zed, num){
    // dessin face par face de ce genre :
    glVertex3d(ix,igrec,zed);
    glVertex3d(ix,1+igrec,zed);
    glVertex3d(ix+1,1+igrec,zed);
    glVertex3d(ix+1,igrec,zed);
    }
     
    void resize(){
    //fonction resize
    }
     
    static void display(void){
     
    glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT);  
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
     
    gluLookAt(0,20,10,0,0,0,0,1,0);
     
    glRotated(a,0,1,0);
    glBegin(GL_QUADS);
    glColor3d(0.5,1,0.6);
    glVertex3d(-3,0,-3);
    glVertex3d(-3,0,6);
    glVertex3d(6,0,6);
    glVertex3d(6,0,-3);
    glEnd();
     
    for (int i=0;i<=num;i++)
      Piece(ix[i],igrec[i],zed[i],i);
    igrec[num]-=0.1; // fait descendre la piece
     
    // deux tests de collision
     
    glutSwapBuffers();
    glutPostRedisplay();
    }
     
    static void key(unsigned char key, int x, int y)
    {
        switch (key) 
        {
            case 'q':
                 if(ix[num]>=-2 && igrec[num]!=0){
                ix[num]-=1;
                }
                break;
            case 'd':
                 if(ix[num]<=4 && igrec[num]!=0){
                ix[num]+=1;
                }
                break;
     
            case 'z':
                 if(zed[num]>=-2 && igrec[num]!=0){
                zed[num]-=1;
                }
                break;
     
            case 's':
                 if(zed[num]<=4 && igrec[num]!=0){
                zed[num]+=1;
                }
                break;
        }
        glutPostRedisplay();
    }
     
    void mouse(int x, int y){
         position_relative=x-position_precedente;
         if(position_relative>0){
                   a+=4; //fait tourner
         }
         else if(position_relative<0){
            a-=4; // fait tourner dans l'autre sens
         }
         position_precedente=x;           
    }
     
    int main(int argc, char *argv[])
    {
        for(int i=0;i<NBPIECE;i++){
          igrec[i]=15;ix[i]=1;zed[i]=1; // initialisation du tableau
        }
        num=0;     
        glutInit(&argc, argv);
        glutInitWindowSize(800,600);
        glutInitWindowPosition(50,50);
        glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); 
        glutCreateWindow("tetris");
     
        glutReshapeFunc(resize);
        glutDisplayFunc(display);
        glutKeyboardFunc(key);
        glutMotionFunc(mouse);
        glutMouseFunc(bouton_souris);// pas écrite ... pas d'importance
        glEnable(GL_DEPTH_TEST);
        glutMainLoop();
    }
    et je voit pas commentni où utiliser le glTranslated ><

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void Piece(double igrec, double ix, double zed, num){
    glPushMatrix();
    glTranslated(ix, igrec, zed);
    // dessin face par face de ce genre :
    glVertex3d(0,0,0);
    glVertex3d(0,1,0);
    glVertex3d(1,1,0);
    glVertex3d(1,0,0);
    glPopMatrix();
    }
    Par exemple.

    Et attention aux paramètres de cette fonction, qui ont les mêmes noms que tes variables globales.

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    Et attention aux paramètres de cette fonction, qui ont les mêmes noms que tes variables globales.
    effectivement >< c'était pas très compliqué
    merci beaucoup

    et sinon:

    Et attention aux paramètres de cette fonction, qui ont les mêmes noms que tes variables globales.
    c'est fait exprés

  12. #12
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    c'est fait exprés
    Je ne vois pas très bien le but, si ce n'est de créer de potentielles mésententes entre toi et ton compilo

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    par "c'est fait exprès", je voulais dire, sciemment ^^ même si c'est pas très intelligent (x,y et z aurait été mieux )

  14. #14
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    J'avais bien compris, donc je répète ma question : pourquoi avoir donné sciemment à des variables de portée différente les mêmes noms ?

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    parceque je débute en c++/openGL et que j'ai des ptit problèmes de variables mais je m'y fait petit a petit


    m'enfin, même avec glTranslated, les glPushMatrix et les glPopMatrix , mon problème n'est pas réglé .

    en effet, ce que je souhaite faire moi, c'est quelquechose comme ça :


    |----------|
    | haut-----| appuie sur la touche "d", x+1 la piece va dans cette
    |----------| direction => ... ça c'est bon
    |------bas |
    |----------|

    c'est la suite ou ça pose problème ... l'utilisateur fait tourner la scène, on a donc ceci par rapport à celle du début:

    |----------|
    | bas------| appuie sur la touche "d", x+1 la piece va dans cette
    |----------| direction <= ... et ça pose problème
    | haut-----|
    |----------|

  16. #16
    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
    Il va falloir que tu prennes la rotation de la scéne en compte lors de la gestion de l'événement "l'utilisateur appuie sur la touche droite".

    En regardant l'angle de rotation, cela ne devrait pas être trop difficile,
    Jc

  17. #17
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    euh ^^ okay
    je vais essayer de faire ça merci a vous deux

  18. #18
    Membre régulier Avatar de NiuAge
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 100
    Points : 89
    Points
    89
    Par défaut
    Y'a un mec vachement baleze qui a inventé la trigo, et c'est ca que tu dois utiliser pour les déplacements. (je crois qu'on l'a tous eu ce prob ^^). Bon, c'est vrai, je t'aide pas bcp désolé

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

Discussions similaires

  1. [Java][3D][Souris] rotation du SimpleUniverse
    Par CinErarY dans le forum Développement 2D, 3D et Jeux
    Réponses: 2
    Dernier message: 28/09/2007, 18h51
  2. Rotation selon position de la Souris.
    Par nodragem dans le forum 2D
    Réponses: 1
    Dernier message: 26/08/2007, 22h09
  3. [DX9][C#]Rotation de la scene non fluide
    Par OpenGG dans le forum DirectX
    Réponses: 2
    Dernier message: 20/08/2006, 13h45
  4. rotation autour d'un objet scene OpenGL
    Par hysah dans le forum OpenGL
    Réponses: 1
    Dernier message: 01/05/2006, 17h31
  5. Manipulation de la souris hors de la scene
    Par magnus2005 dans le forum Flash
    Réponses: 4
    Dernier message: 12/10/2005, 15h53

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