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 :

Rubik's cube simple


Sujet :

OpenGL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 8
    Par défaut Rubik's cube simple
    Bonjour à tous !
    Je débute avec OpenGl et j’aimerais savoir si l’un d’entre vous pourrait me fournir des sources d’un rubik’s cube basique.

    Tenant sur un seul fichier c ou cpp d’environ 15ko ?
    ça serait cool !

    Ou encore un fichier source d’un simple cube (non rubik’s Cube) ou sphère qu’on fait tourner par rapport à des axes fixe (global) et non local à l’objet.
    Merci d’avance !

    EDIT :

    A ceux qui veulent un code utilisant les quaternions pour effectuer une rotation global à la scène :


    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
    #include <GL/glut.h>
    #include <stdlib.h>
    #include <math.h>
    #include "quaternion.h"
     
    float ANGL = 0;
    Quaternion QXYZ;
    int axe = 0;
     
    void init(void) {
       glClearColor (0.0f, 0.0f, 0.0f, 0.0f);
       glShadeModel (GL_SMOOTH);
    }
     
     
    void display(void){   
     
        glMatrixMode (GL_MODELVIEW);
        glLoadIdentity ();
     
        gluLookAt (0.5f, 1.0, 3.0,  0.0, 0.0, 0.0,  0.0, 1.0, 0.0);    
        glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     
        glColor3f (0.8, 0.6, 0.0);
     
        mat4 matrice;
        Quaternion QX, QY, QZ, QQ;
     
        if(axe == 0) { QX.createFromAxisAngle(1, 0, 0, ANGL); QQ = QX;}
        if(axe == 1) { QY.createFromAxisAngle(0, 1, 0, ANGL); QQ = QY;}
        if(axe == 2) { QZ.createFromAxisAngle(0, 0, 1, ANGL); QQ = QZ;}
     
        QXYZ = QXYZ * QQ;
        QXYZ.normalise();
     
        QXYZ.quaterToMat(&matrice); 
        glMultMatrixf((GLfloat*)&matrice);
     
        glutSolidCube (1.0);
        glColor3f (0.8, 0.4, 0.2);
        glutWireCube (1.0);
     
     
        glutSwapBuffers();
        glFlush ();
    }
     
    void reshape (int w, int h){
        glViewport (0, 0, (GLsizei) w, (GLsizei) h); 
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);
    }
     
    void keyboard(unsigned char key, int x, int y){
       switch (key) {
          case 27: exit(0); break;
            case 'x' : ANGL = 1.0f; axe = 0; glutPostRedisplay();  break;
            case 'y' : ANGL = 1.0f; axe = 1; glutPostRedisplay();  break;
            case 'z' : ANGL = 1.0f; axe = 2; glutPostRedisplay();  break;
       }
    }
     
    int main(int argc, char** argv){
        glutInit(&argc, argv);
        glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
        glutInitWindowSize (500, 500);
        glutInitWindowPosition (100, 100);
        glutCreateWindow (argv[0]);
        init ();
        glutDisplayFunc(display); 
        glutReshapeFunc(reshape);
        glutKeyboardFunc(keyboard);
        glutMainLoop();
        return 0;
    }
    Le header quaternion.h :
    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
     
    typedef struct{ float x, y, z, w; } vec4;
    typedef struct{ vec4 x, y, z, w; } mat4;
     
    typedef class Quaternion{
            public: float x, y , z, w;        
    		public : Quaternion::Quaternion(){
    		  x = y = z = 0;
    		  w = 1;
    		};
     
            void 
            Quaternion::quaterToMat(mat4 *result){
               mat4 *mat = result;
    	       float xx, xy, xz, xw, yy, yz, yw, zz, zw, X, Y, Z, W;
    	       X = x; Y = y; Z = z; W = w;
     
    	       xx      = X * X;
    	       xy      = X * Y;
    	       xz      = X * Z;
    	       xw      = X * W;
     
    	       yy      = Y * Y;
    	       yz      = Y * Z;
    	       yw      = Y * W;
     
    	       zz      = Z * Z;
    	       zw      = Z * W;
     
    	       (*mat).x.x  = 1 - 2 * ( yy + zz );
    	       (*mat).x.y  =     2 * ( xy - zw );
    	       (*mat).x.z  =     2 * ( xz + yw );
     
    	       (*mat).y.x  =     2 * ( xy + zw );
    	       (*mat).y.y  = 1 - 2 * ( xx + zz );
    	       (*mat).y.z  =     2 * ( yz - xw );
     
    	       (*mat).z.x  =     2 * ( xz - yw );
    	       (*mat).z.y  =     2 * ( yz + xw );
    	       (*mat).z.z  = 1 - 2 * ( xx + yy );
     
    	       (*mat).x.w  = (*mat).y.w = (*mat).z.w = (*mat).w.x = (*mat).w.y = (*mat).w.z = 0;
    	       (*mat).w.w = 1;
            };
     
            Quaternion 
    		Quaternion::operator *(Quaternion q){
    		  Quaternion r;
    		  r.w = w*q.w - x*q.x - y*q.y - z*q.z;
    		  r.x = w*q.x + x*q.w + y*q.z - z*q.y;
    		  r.y = w*q.y + y*q.w + z*q.x - x*q.z;
    		  r.z = w*q.z + z*q.w + x*q.y - y*q.x;
     
    		  r.normalise();
    		  return r;
    		};
     
     
            float 
    		Quaternion:: magnitude(){
    		  return sqrt(w * w + x * x + y * y + z * z);
    		};
     
    		void 
    		Quaternion::normalise(){
    		  float m = magnitude();
    		  if(m>0){ x /= m; y /= m; z /= m; w /= m;}
    		};
     
            void 
    		Quaternion::createFromAxisAngle(float _x, float _y, float _z, float angle) {
    		  angle = float((angle / 180.0) * M_PI);
    		  float result = (float)sin( angle / 2.0 );
    		  w = (float)cos( angle / 2.0 );
    		  x = float(_x * result);
    		  y = float(_y * result);
    		  z = float(_z * result);
    		  normalise();
    		};
    } Quaternion;

    dans mon cas j'utilise devc++ pour la compilation et les linkers suivant :
    -lglut32 -lglu32 -lopengl32 -lwinmm -lgdi32


  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Fai,
    Citation Envoyé par diker Voir le message
    Bonjour à tous !
    Je débute avec OpenGl et j’aimerais savoir si l’un d’entre vous pourrait me fournir des sources d’un rubik’s cube basique sur un seul fichier c ou cpp d’environ 15ko.
    C'est beau de demander du code tout prêt. En imposant la taille du source en plus, c'est encore plus beau.

    Citation Envoyé par diker Voir le message
    Ou encore un fichier source d’un simple cube (non rubik’s Cube) ou sphère qu’on fait tourner par rapport à des axes fixe (global) et non local à l’objet.
    Le faire toi-même est un bon exercice pour comprendre comment fonctionnent les repères en OpenGL.
    Ça fait même plus ou moins partie des exercices de base.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 8
    Par défaut
    Citation Envoyé par droggo Voir le message
    Fai,

    C'est beau de demander du code tout prêt. En imposant la taille du source en plus, c'est encore plus beau.


    Le faire toi-même est un bon exercice pour comprendre comment fonctionnent les repères en OpenGL.
    Ça fait même plus ou moins partie des exercices de base.
    Ma question était : "j'aimerais savoir si une personne pourrait me fournir..."
    à priori te concernant, c'est Non.

    Je n'impose rien du tout je demande, je questionne, je [re]cherche.

    Le faire sois-même est un bon exercice j'en doute pas, mais on a souvent besoin de gagner du temps, d'avancer et de comprendre plus vite.

    rassure toi, copier coller : pas mon genre. Si c'est à ça que tu pense.

    la taille du source, et bah évidemment si ça pèse trop lourd,
    --> code certainement trop long,
    on s'y perd vite...

    Et concernant les rotations d'un objet sur les 3 axes X Y Z en repère global je galère un peux à trouver un exemple cour et simple.

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Gia,
    Citation Envoyé par diker Voir le message
    Le faire sois-même est un bon exercice j'en doute pas, mais on a souvent besoin de gagner du temps, d'avancer et de comprendre plus vite.
    Prendre du code tout fait n'est pas le bon moyen, tu crois avancer plus vite, parce que c'est le cas immédiatement, mais plus tard tu coinceras sur les points ainsi plus ou moins occultés.

    Citation Envoyé par diker Voir le message
    Et concernant les rotations d'un objet sur les 3 axes X Y Z en repère global je galère un peux à trouver un exemple cour et simple.
    En lisant la doc d'OpenGL, tu trouveras facilement comment faire. Il suffit de faire l'effort comprendre comment ça marche, et ensuite ça ne te posera plus de problèmes, rotations globales, locales, translations, ...

    Citation Envoyé par diker Voir le message
    la taille du source, et bah évidemment si ça pèse trop lourd,
    --> code certainement trop long,
    on s'y perd vite...
    Je peux très bien te faire un code long et clair à lire/comprendre, et obtenir le même résultat pour le programme, avec un code court et quasi incompréhensible, sauf à y passer beaucoup de temps.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 8
    Par défaut
    Citation Envoyé par droggo Voir le message
    Gia,
    Prendre du code tout fait n'est pas le bon moyen, tu crois avancer plus vite, parce que c'est le cas immédiatement, mais plus tard tu coinceras sur les points ainsi plus ou moins occultés.
    Comment te dire...
    je suis d'accord dans le cas où la personne ne fait que survoler le code, puis l'applique à l'identique.

    Et tu te base certainement sur une manière de comprendre et d'apprendre qui est propre à ton environnement.
    c'est-à-dire propre à toi ou à des personnes que tu a vue évolués.

    - Ce qui ne correspond pas forcement à ma personne.

    Citation Envoyé par droggo Voir le message
    En lisant la doc d'OpenGL, tu trouveras facilement comment faire. Il suffit de faire l'effort comprendre comment ça marche, et ensuite ça ne te posera plus de problèmes, rotations globales, locales, translations,...
    Je prends note merci

    Citation Envoyé par droggo Voir le message
    Je peux très bien te faire un code long et clair à lire/comprendre, et obtenir le même résultat pour le programme, avec un code court et quasi incompréhensible, sauf à y passer beaucoup de temps.
    Oui certainement, mais les codes courts et clair existent.

    En revanche, pour un unique principe, non liés à d'autres principes X,
    il serait quand même plus évident d'avoir affaire à un essentiel au niveau "code(s)" et "logique de fonctionnement".

    je dit cela parce que des sources Rubik's cube ou autres sont trouvables.
    Mais il s'agit de jeux tout fait, pas vraiment intéressant, lorsqu'on cherche à comprendre qu'une partie du principe.

    sur ce, pour en revenir, ma question était : "j'aimerais savoir si une personne pourrait me fournir..."

    à priori te concernant là aussi , c'est Non.

  6. #6
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Fai,
    Citation Envoyé par diker Voir le message
    à priori te concernant là aussi , c'est Non.
    Pas de chance pour toi, alors, car c'est un des rares trucs OpenGL que j'ai codé, pour apprendre, justement.

  7. #7
    Membre chevronné
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Par défaut
    Bonjour,

    je ne veux pas remuer le couteau dans la plaie mais difficile de ne pas me ranger du côté de droggo...C'est quand même un peu le B à ba de l'OpenGL, d'afficher un cube et de le faire tourner....

    Déjà, à partir de n'importe quel bouquin c'est faisable, et souvent l'exemple est donné. Si ca ne suffit pas on ne compte plus les tutoriels OpenGL sur le net....Nehe ca te dit quelque chose? c'est juste le 1er hit quand tu tapes "OpenGL tutorials" sous google....et oui ils expliquent comment faire un cube....

    Non franchement je n'ai pas l'impression que tu te sois beaucoup creusé sur ce coup là....

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 8
    Par défaut
    Bonjour,

    Citation Envoyé par droggo Voir le message
    Fai,

    Pas de chance pour toi, alors, car c'est un des rares trucs OpenGL que j'ai codé, pour apprendre, justement.
    Tant pis.
    Quand je trouverais une solution simple, je la posterais pour d'autres nouveaux venus.
    Beaucoup postent et ont comme réponse : Apprend par toi-même, ou : Google et ton ami.
    Mais à force de référencer des sujets de la sorte,
    Google ne ressort que des liens qui mènent vers d’autres liens qui aboutissent à des sujets non résolus.


    Citation Envoyé par ShevchenKik Voir le message
    Bonjour,

    je ne veux pas remuer le couteau dans la plaie mais difficile de ne pas me ranger du côté de droggo...C'est quand même un peu le B à ba de l'OpenGL, d'afficher un cube et de le faire tourner....

    Déjà, à partir de n'importe quel bouquin c'est faisable, et souvent l'exemple est donné. Si ca ne suffit pas on ne compte plus les tutoriels OpenGL sur le net....Nehe ca te dit quelque chose? c'est juste le 1er hit quand tu tapes "OpenGL tutorials" sous google....et oui ils expliquent comment faire un cube....

    Non franchement je n'ai pas l'impression que tu te sois beaucoup creusé sur ce coup là....
    Je rencontre le même problème qu’à ces posts là :

    http://www.developpez.net/forums/sho...d.php?t=341848
    http://www.developpez.net/forums/sho...d.php?t=302885


    b.a.-ba tu dis ...

    Pourquoi j'irais demander de l'aide sur des bases tel que dessiner un simple cube et de le faire tourner
    avec un glRotated();
    Non franchement moi aussi je n'ai pas l'impression que tu te sois beaucoup creusé sur ce coup là....

    Je vais aller voir du coté de Google codesearch.

  9. #9
    Membre chevronné
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Par défaut
    Je rencontre le même problème qu’à ces posts là :

    http://www.developpez.net/forums/sho...d.php?t=341848
    http://www.developpez.net/forums/sho...d.php?t=302885


    b.a.-ba tu dis ...
    OK, si ton problème est de réaliser des rotations comme celles qu'on obtient avec les quaternions, c'est un peu plus complexe.

    Désolé mais j'avais interprété ta question comme:
    1- comment afficher un cube
    2- comment le faire tourner

    Soit tu n'as pas été assez précis, sois j'ai lû trop vite, c'est une question d'interprétation

    Bref, par rapport aux quaternions perso je ne me suis jamais penché dessus, mais quelqu'un avait posté ce lien il y a quelques temps, qui m'a l'air d'un point de départ:
    http://www.flipcode.com/documents/matrfaq.html#Q47
    J'espère que ca répond un peu plus à tes attentes....

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 8
    Par défaut
    Citation Envoyé par ShevchenKik Voir le message
    Soit tu n'as pas été assez précis ...C'est une question d'interprétation...
    On est Ok !

    Citation Envoyé par ShevchenKik Voir le message
    http://www.flipcode.com/documents/matrfaq.html#Q47
    J'espère que ca répond un peu plus à tes attentes....
    Merci pour le lien, il me sera certainement très utile !

  11. #11
    Membre émérite
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Par défaut
    http://jeux.developpez.com/faq/matquat/

    Je crois qu'il ne faut pas forcément allez chercher bien loin...

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 8
    Par défaut
    Citation Envoyé par Ange_blond Voir le message
    http://jeux.developpez.com/faq/matquat/

    Je crois qu'il ne faut pas forcément allez chercher bien loin...
    Oui, bonjour et merci pour ton lien.

    Et à l'aide des quaternions, lorsqu'on fini par obtenir des rotations logiques, fluides, sans gimbal lock,
    mais que l'on fait toujours référence aux axes local à l'objet,
    Comment, à partir de la matrice de rotation obtenue (à l'aide des quaternions) pour une combinaison XYZ ,
    arriver à reproduire des rotations sur les axes global à la scène.
    Pourriez-vous, ou quelqu’un pourrait-il m'éclaircir à ce sujet SVP.

  13. #13
    Membre émérite
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Par défaut
    si j'ai bien compris, tu as un quaternion pour ta rotation dans le repere local de ton objet, et tu veux cette meme rotation dans le repere local...

    Je pense qu'il te suffit de combiner les transformations, dans le bon ordre, et ça ira tout seul à savoir :

    depuis ton objet :
    * translation vers le repere global (T1)
    * rotation pour etre dans le repere global (R1)
    * rotation selon ton quaternion (R)
    * rotation inverse (inverse de R1)
    * translation inverse (inverse de T1)

    pour l'ordre je ne suis plus sur...

    Sinon regarde un peu dans les maths des quaternions, tu trouvera peut etre des piste interessantes, et plus claires...

  14. #14
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Citation Envoyé par diker Voir le message
    Si tu l'avais précisé dès le départ, je ne t'aurais pas fait suer en te disant d'utiliser les docs pour apprendre les bases.

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 8
    Par défaut
    Citation Envoyé par droggo Voir le message
    Si tu l'avais précisé dès le départ, je ne t'aurais pas fait suer en te disant d'utiliser les docs pour apprendre les bases.
    Citation Envoyé par diker Voir le message
    Bonjour à tous !
    Je débute...
    ... un fichier source d’un simple cube (non rubik’s Cube) ou sphère qu’on fait tourner par rapport à des axes fixe (global) et non local à l’objet...
    Le « je débute » était peux être de trop …

    Citation Envoyé par Ange_blond Voir le message
    si j'ai bien compris, tu as un quaternion pour ta rotation dans le repere local de ton objet, et tu veux cette meme rotation dans le repere local...

    Je pense qu'il te suffit de combiner les transformations, dans le bon ordre, et ça ira tout seul à savoir :

    depuis ton objet :
    * translation vers le repere global (T1)
    * rotation pour etre dans le repere global (R1)
    * rotation selon ton quaternion (R)
    * rotation inverse (inverse de R1)
    * translation inverse (inverse de T1)

    pour l'ordre je ne suis plus sur...

    Sinon regarde un peu dans les maths des quaternions, tu trouvera peut etre des piste interessantes, et plus claires...
    Merci je verrai cela en détail.

Discussions similaires

  1. Reconnaissance des couleurs Rubik's cube
    Par basesim dans le forum C
    Réponses: 19
    Dernier message: 08/03/2012, 12h00
  2. [Coq] Groupes et Rubik's Cube
    Par SpiceGuid dans le forum Langages fonctionnels
    Réponses: 4
    Dernier message: 27/10/2009, 16h40
  3. [Concours] Rubik's Cube 3D
    Par Grand sorcier dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 21/06/2006, 00h40
  4. détecter clic ---> Rubik's Cube
    Par Skeud007 dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 09/02/2006, 22h04

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