Lors de cette scéance, nous abordons la gestion de la caméra en opengl ainsi que la notion de texture.
Il faut savoir qu'OpenGL travaille toujours sur des données en 3 dimensions.
Cependant nous utilisions jusqu'à maintenant une projection orthogonal en 2 dimensions à l'aide de gluOrtho2D.
Il existe en fait 2 fonctions en OpenGL permettant de gérer les matrices de projections, autrement dis les caméras.
Pour simplifier les usages les plus courant, GLU fourni 2 autre méthodes utilisant les précédentes :
Vous savez maintenant comment obtenir votre caméra, cependant vous êtes toujours incapable de la placer dans votre scène,
vous pouvez uniquement mettre votre scène devant la caméra.
Pour positioner la caméra vous aurez besoin de la fonction :
gluLookAt(eyeX,eyeY,eyeZ,centerX,centerY,centerZ,upX,upY,upZ)
A partir du programme que vous trouverez ICI modifiez la fonction reshapeFunc pour pouvoir voir la différence entre ces différentes configuration de la caméra.
Ce programme permet de visualiser un demi-cube, et de ce déplacer dans la scène.
Nous allons maintenant voir la notion de Culling.
Pour cela il va falloir dans un premier temps savoir comment activer/desactiver le culling dans opengl.
Les fonctions glEnable(...) et glDisable(...) permettent d'activer et de désactiver un état opengl.
Pour activer le culling il faudra donc utiliser :
glEnable(GL_CULL_FACE);
Utiliser des textures revient à effectuer deux actions :
Il y a quatres fonctions à connaître :
Voici un exemple de création de texture :
... GLuint texid; glGenTextures(1,&texid); glBindTexture(GL_TEXTURE_2D, texid); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data); ...
Il y a trois fonctions à connaître :
Pour pouvoir appliquer une texture à un polygone, il faut d'abord l'activer en utilisant glEnable() et inversement pour les désactiver glDisable(). De plus il faut savoir que les coordonnées de texture sont normalisées, ainsi pour une image donnée son coin supérieur gauche vaut (0.0,0.0) et son coin inférieur droit vaut (1.0,1.0).
Exemple illustrant l'application d'une texture :
... glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, texid); glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE); glBegin(GL_QUADS); glTexCoord2f(0.0f,0.0f); glVertex3f(-2.0f, 2.0f, 0.0f); glTexCoord2f(0.0f,1.0f); glVertex3f(-2.0f,-2.0f, 0.0f); glTexCoord2f(1.0f,1.0f); glVertex3f( 2.0f,-2.0f, 0.0f); glTexCoord2f(1.0f,0.0f); glVertex3f( 2.0f, 2.0f, 0.0f); glEnd(); glDisable(GL_TEXTURE_2D); ...
Pour cet exercice nous utiliserons la fonction glTexEnv de la manière suivante
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE)
De plus toutes les textures seront à deux dimensions (GL_TEXTURE_2D).
NOTE: Une structure d'image PPM, ainsi que les fonctions d'allocation, désallocation, chargement et sauvegarde est présente dans les fichiers libimage.
Remplissez un tableau d'octets non signés afin de pouvoir créer un damier noir et
blanc dont la taille est 8x8. Utilisez ce tableau pour créer une texture RGB et
l'afficher entièrement sur l'une des face de votre demi-cube.
Pour la spécification des paramètres de texture vous utiliserez :
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
Maintenant afficher également l'image knight.ppm de l'archive sur une autre face du demi-cube.
Finalement, pour voir si vous avez tout compris, afficher l'image sur la totalité de votre fenêtre opengl. Si vous l'avez fait correctement, l'image doit s'étirer pour s'adapter à la taille de la fenêtre.
Réaliser une fonction drawTexturedSphere(float size,unsigned int nbPoint);
qui va créer une sphère de rayon size ayant nbPoint points de contrôle sur chaque axe.
Ajouter ensuite un menu permettant d'afficher cette sphère en mode fil de fer ou rempli.
Pour finir modifier cette fonction pour pouvoir appliquer une texture à votre sphère.
Si vous avez toujours un peu de temps, faites la même chose pour un cylindre.
Ces deux fonctions vous servirons plus tard.