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'une partie d'un modèle


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Philippe320
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 179
    Par défaut Rotation d'une partie d'un modèle
    Bonjour,

    je débute en OpenGL (avec les MFC) et c'est ma 1ère intervention parmi vous.
    voici mon problème:
    j'affiche un hélicoptère, constitué de 5443 triangles :
    en gros, mon code est :
    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
     
            glMatrixMode (GL_PROJECTION);
            glLoadIdentity ();
            gluPerspective (40.0,           // Field-of-view angle
                            aspect,      // Aspect ratio of viewing volume
                            1.0,            // Distance to near clipping plane
                            10.0);          // Distance to far clipping plane
     
            glViewport (0, 0, width, height);
        //
        // Clear the color and depth buffers.
        //
        glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     
        //
        // Define the modelview transformation.
        //
        glMatrixMode (GL_MODELVIEW);
        glLoadIdentity ();
        glTranslatef (0.0f, 0.0f, -8.0f);
     
        glRotatef (-90.0f-assiette, 1.0f, 0.0f, 0.0f);
        glRotatef (-inclinaison, 0.0f, 1.0f, 0.0f);
        glRotatef (-cap, 0.0f, 0.0f, 1.0f);	
     
        glScalef (5.5f,5.5f,5.5f);  
     
     
     
    	glBegin (GL_TRIANGLES);
    	int imax=sizeof(face_indicies)/sizeof(face_indicies[0])-1;
     
    	  for(int i=0;i<=imax;i++) {
     
    		for(int j=0;j<3;j++) {
    		 int vi=face_indicies[i][j];
    		 int ni=face_indicies[i][j+3];
    		 int ti=face_indicies[i][j+6];
    		 glNormal3f (normals[ni][0],normals[ni][1],normals[ni][2]);
    		 glTexCoord2f(textures[ti][0],textures[ti][1]);
    		 glVertex3f (vertices[vi][0],vertices[vi][1],vertices[vi][2]);
            } //for j
     
     
    	   } //for i
        glEnd ();
     
     
     
        //
        // Swap the buffers.
        //
        glFlush();
        SwapBuffers(dc.m_ps.hdc);
    cela fonctionne parfaitement ( y compris les rotations qui permettent de gérer l'attitude de l'hélico)

    maintenant, je veux animer le rotor :
    j'ai isolé les triangles représentant le rotor mettons entre index1 et index2

    donc je représente mon hélico sans rotor avec le code précédent (en interdisant l'affichage si index1<=i<=index2)

    et ensuite, je fais:
    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
     
    	    glRotatef (angle de rotation du rotor, 0.0f, 0.0f, 1.0f);				
    		glBegin (GL_TRIANGLES);
     
     
    			  for( i=index1;i<=index2;i++) {
    		for(int j=0;j<3;j++) {
    		 int vi=face_indicies[i][j];
    		 int ni=face_indicies[i][j+3];
    		 int ti=face_indicies[i][j+6];
    		 glNormal3f (normals[ni][0],normals[ni][1],normals[ni][2]);
    		 glTexCoord2f(textures[ti][0],textures[ti][1]);
    		 glVertex3f (vertices[vi][0],vertices[vi][1],vertices[vi][2]);
            } //for j
       } //for i
    			      glEnd ();
    Le principe fonctionne mais j'ai un problème de centre de rotation
    alors que dans le 1er code, le rotor est bien centré où il faut,
    dès que je le fais tourner, le centre de rotation "précessionne", comme l'axe d'une toupie :
    pour être plus clair, le rotor tourne bien, mais son centre tourne autour du point d'ancrage idéal du rotor.
    j'espère être clair

    Comment faire ?
    Merci d'avance de votre aide
    Philippe

  2. #2
    Membre chevronné
    Avatar de N_I_C_S
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 450
    Par défaut
    Salut,

    Attention, pour tourner correctement le rotor, il faut que la rotation se fasse à partir de son centre, cad ramener le centre du rotor au point 0, 0, 0.

    qqch comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // Afficher hélico
    glPushMatrix();
       glTranslatef(-xRotor, -yRotor, -zRotor);
       glRotatef(angle, 0f, 1f, 0f);
       glTranslatef(xRotor, yRotor, zRotor);
       // afficher rotor
    glPopMatrix();

  3. #3
    Membre confirmé Avatar de Philippe320
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 179
    Par défaut
    En effet, ça fonctionne parfaitement comme çà

    Merci beaucoup
    Philippe

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    72
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 72
    Par défaut
    ouaip merci pour le tuyau

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

Discussions similaires

  1. Indenter une partie du code
    Par KooX dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 23/05/2004, 17h38
  2. Réponses: 4
    Dernier message: 18/05/2004, 13h58
  3. [CVS]Gestion de 2 versions avec une partie commune
    Par Gromitou dans le forum EDI et Outils pour Java
    Réponses: 4
    Dernier message: 19/02/2004, 14h32
  4. comment remplacer une partie de texte dans un champs
    Par patlapi dans le forum Paradox
    Réponses: 4
    Dernier message: 20/11/2003, 14h38
  5. selectionner une partie d'un TImage
    Par bidochon dans le forum Composants VCL
    Réponses: 2
    Dernier message: 20/02/2003, 19h08

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