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:
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
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
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....
Partager