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 cube map


Sujet :

OpenGL

  1. #1
    Membre confirmé
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Points : 486
    Points
    486
    Par défaut Rotation d'un cube map
    Bonjour,

    je développe en ce moment une application représentant des verres de lunettes en 3D. J'utilise pour ca OpenGL et une version avancée du programme (pour les cartes vidéos le supportant) utilise des shaders écrits en GLSL.

    Pour apporter plus de réalisme à ma scène, j'ai ajouté de l'environment mapping: je charge 6 textures dans un cube map OpenGL qui est utilisé pour faire du reflection mapping. En utilisant mes shaders je peux également me servir du cube map pour faire de la réfraction (ie: obtenir la transparence de mon verre).

    Pas de probleme pour ce qui est de charger le cube (à partir de 6 images sur le disque), obtenir des réflections avec la "partie fixe" d'OpenGL ou avec mes shaders. De même pour la réfraction, à priori ca marche.

    Je dis bien "à priori", car il reste un petit problème:
    - J'utilise un arrière plan fixe, comme une skybox dont on verrait toujours la même face, quelle que soit l'orientation de la caméra (ou autrement dit, la caméra regarde toujours dans la même direction, seuls mes objets 3D tournent autour du centre de ma scène). Pour vous donner une idée il y a un exemple en pièce jointe

    - Le problème, c'est que quand mes objets (mes verres de lunettes) tournent, mon cubemap tourne avec! Mon arrière plan reste bien fixe, pas de probleme, mais le cube map utilisé pour texturer mes verres suit les rotations de ces derniers....

    J'ai vu sur les faqs OpenGL qu'en cas d'environment mapping non dynamique, il est nécessaire de faire tourner le cube map manuellement en utilisant la pile de matrices de texture. Dans mon cas il faudrait donc faire tourner mon cube dans le sens inverse de la rotation de mes verres.

    A priori ca a l'air plutôt simple, mais dans la pratique, j'ai remarqué que le centre de rotation du cube map n'est pas, par défaut, le centre du cube. Pour une texture 2D par exemple, le centre de rotation est à (s,t) = (0,0), soit dans le coin bas gauche de la texture. Pour le cube map je suppose que c'est (s,t,q) = (0,0,0), mais je n'arrive pas à le vérifier....

    supposons que c'est bien (s,t,q) = (0,0,0), il faudrait alors que je translate ma matrice de texture de ce point jusqu'au centre du cube, que j'effectue ma rotation, puis que j'effectue la translation inverse de la précédente.

    c'est ce que fait ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    glMatrixMode(GL_TEXTURE);
    glPushMatrix();
    glTranslatef(-.5, -.5, -.5); // Retour au point d'origine
    glRotatef(alpha,0,1,0);      // rotation d'angle "alpha" autour de l'axe Y
    glTranslatef(.5, .5,.5);      // Translation initiale pour amener le centre      
                                        // de rotation au centre du cube
    glMatrixMode(GL_MODELVIEW);
     
    /* Code d'affichage des objets 3D */
    glMatrixMode(GL_TEXTURE);
    glPopMatrix
    En considérant que s, t et q vont de 0 à 1, utiliser des translations de 0.5 devrait m'ammener au centre du cube, mais ca ne marche pas. Si j'utilise des valeurs plus élevées j'arrive à "m'approcher" du centre et à commencer à voir la rotation, mais puisque je ne suis pas vraiment au centre ca ne marche pas comme il faut....et il va sans dire qu'essayer comme ca à l'aveugle ne va pas m'ammener bien loin

    Voilà, ca fait deux jours que je cherche sur le net où se trouve ce centre de rotation et commentme placer facilement au centre du cube, sans succès, alors j'espère que quelqu'un ici pourra me venir en aide.

    P.S: oui c'est mon premier post, j'espère ne pas avoir trop écrit de détails inutiles, mais c'est difficile de rester à la fois concis et précis....

  2. #2
    Membre confirmé
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Points : 486
    Points
    486
    Par défaut
    OK, je viens de me rendre compte que le problème n'était pas où je le cherchais.....

    En fait la rotation du cube map se fait sans probleme en utilisant un code comme celui -ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    glMatrixMode(GL_TEXTURE);
    glPushMatrix();
    glRotatef(alpha,0,1,0);      // rotation d'angle "alpha" autour de l'axe Y
    glMatrixMode(GL_MODELVIEW);
    Le centre de rotation est bien, finalement, le centre du cube. Le problème venait de mes shaders.
    Bref, ca ne marche toujours pas comme je veux mais oubliez la rotation du cube map. Je vais chercher encore un peu et je créerai une nouvelle discussion si je ne m'en sors pas.

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

Discussions similaires

  1. Appliquer cube mapping a deux fenetre différente en meme temps
    Par LaDeveloppeuse dans le forum OpenGL
    Réponses: 5
    Dernier message: 29/07/2009, 12h01
  2. Cube mapping dynamique
    Par LaDeveloppeuse dans le forum OpenGL
    Réponses: 3
    Dernier message: 28/04/2009, 17h43
  3. Texture avec Cube mapping
    Par LaDeveloppeuse dans le forum OpenGL
    Réponses: 5
    Dernier message: 27/04/2009, 14h47
  4. Rotation d'un cube à partir du repère global
    Par MugenGL dans le forum OpenGL
    Réponses: 1
    Dernier message: 03/05/2008, 17h11
  5. Réponses: 4
    Dernier message: 27/02/2008, 12h48

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