Jeux Libres
       
           

» Les Tutoriels » Création d'un jeu vidéo » Dessiner le ciel avec une skybox

Dessiner le ciel avec une skybox


Dans ce chapitre, nous allons voir comment représenter le décor lointain comme le ciel, les montagnes...





Chapitre précédent     Sommaire     Chapitre suivant


Une skybox, c'est quoi ?


Une skybox est un gros cube constitué de 6 textures sur lesquelles sont projetés le ciel, les montagnes, les bâtiments éloignés... recréant ainsi l'illusion d'un environnement éloigné en 3D.

L'observateur doit être situé au centre de ce gros cube. La partie visible de la scène doit être dessinée à l'intérieur de la skybox.


En image, vous allez tout de suite comprendre. Sur cette image, j'ai dessiné 3 textures d'une skybox : nord, ouest, bas.


Lorsque la caméra est placé au centre de la skybox, voici ce que l'on peut voir :


Lorsque les 6 faces seront dessinées, l'observateur pourra regarder tout autour de lui sans voir de discontinuité dans le rendu du décor lointain. La skybox sera fermée.


Dessiner la skybox


Très rapidement, vous pouvez construire votre skybox en ajoutant une méthode dessinerSkybox() à votre classe Scene. Avant de commencer à coder votre méthode, voici les 6 texures de la skybox que j'ai utilisé. Vous pouvez également en trouver sur Internet ou créer votre propre skybox à l'aide d'un logiciel comme Terragen.

Chargement des textures



Le chargement des textures n'a maintenant plus de secret pour vous. Voici mon code de chargement des textures :
1
2
3
4
5
6
7
8
9
10
11
12
13
void Scene::chargerTextures(void)
{
   // Chargement de la texture de l'herbe
   this->textures["herbe"] = loadTexture("herbe.bmp");
 
   // Chargement des textures de la skybox
   this->textures["nord"] = loadTexture("skybox/nord.bmp");
   this->textures["sud"] = loadTexture("skybox/sud.bmp");
   this->textures["ouest"] = loadTexture("skybox/ouest.bmp");
   this->textures["est"] = loadTexture("skybox/est.bmp");
   this->textures["haut"] = loadTexture("skybox/haut.bmp");
   this->textures["bas"] = loadTexture("skybox/bas.bmp");
}

Pour des questions d'organisation, j'ai choisi de placer les textures dans un dossier skybox.


Dessin de la skybox



Pour ne pas être gêné par le terrain précédemment créé, j'ai retiré l'appel à la méthode dessinerTerrain(), puis j'ai ajouté un appel à la méthode dessinerSkybox().
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void Scene::dessiner(void)
{
   // Vidage de l'cran
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
   // Place la camera
   glMatrixMode( GL_MODELVIEW );
   glLoadIdentity();
 
   gluLookAt(3,4,2,0,0,0,0,0,1);
 
   // Dessin du terrain
   //this->dessinerTerrain();
 
   // Dessin de la skybox
   this->dessinerSkybox();
}

Pour le dessin de la skybox, j'ai commencé à faire ceci :

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
void Scene::dessinerSkybox(void)
{
   // Activation des textures
   glEnable(GL_TEXTURE_2D);
 
   // Pas de teinte
   glColor3ub(255,255,255);
 
   // Slection de la texture
   glBindTexture(GL_TEXTURE_2D, textures["nord"]);
   glBegin(GL_QUADS);
   glTexCoord2d(0, 1); glVertex3d(-1, -1, 1);
   glTexCoord2d(0, 0); glVertex3d(-1, -1, -1);
   glTexCoord2d(1, 0); glVertex3d(-1, 1, -1);
   glTexCoord2d(1, 1); glVertex3d(-1, 1, 1);
   glEnd();
 
   glBindTexture(GL_TEXTURE_2D, textures["ouest"]);
   glBegin(GL_QUADS);
   glTexCoord2d(0, 1); glVertex3d(1, -1, 1);
   glTexCoord2d(0, 0); glVertex3d(1, -1, -1);
   glTexCoord2d(1, 0); glVertex3d(-1, -1, -1);
   glTexCoord2d(1, 1); glVertex3d(-1, -1, 1);
   glEnd();
 
   glBindTexture(GL_TEXTURE_2D, textures["bas"]);
   glBegin(GL_QUADS);
   glTexCoord2d(0, 1); glVertex3d(-1, -1, -1);
   glTexCoord2d(0, 0); glVertex3d(1, -1, -1);
   glTexCoord2d(1, 0); glVertex3d(1, 1, -1);
   glTexCoord2d(1, 1); glVertex3d(-1, 1, -1);
   glEnd();
}

Comme vous pouvez le constater, j'ai choisi de faire un cube de 2 unités de côté. La skybox est codée en dur, ce qui n'est pas paramétrable et difficile à manipuler. Remarquez le sens dans lequel j'ai décrit les sommets. Puisqu'on est à l'intérieur, la description du cube se fait dans le sens inverse du cube vu dans l'autre chapitre.


Je ne vais pas m'étendre plus. Vous avez compris comment ça fonctionne, et c'est ça le principal.




Dans le prochain chapitre, nous allons créer un format de modèle 3D qui nous permettera de modéliser tout objet 3D non déformable. De plus, nous créerons une classe capable de construire l'objet 3D à partir de ce format de modèle de telle manière que l'ajout, le dessin et la suppression d'objet 3D tel que les personnages ou la skybox soient très simplifiés.



Chapitre précédent     Sommaire     Chapitre suivant



Rédigé par David
Consulté 24565 fois



Hébergeur du site : David
Version PHP : 5.4.45-0+deb7u2
Uptime : 213 jours 20 heures 11 minutes
Espace libre : 2128 Mo
Dernière sauvegarde : 23/10/2017
Taille de la sauvegarde : 1101 Mo


4253072 pages ont été consultées sur le site !
Dont 888 pages pendant les 24 dernières heures.

Page générée en 0.393 secondes


Nos sites préférés
- Création d'un jeu de plateforme de A à Z avec SDL
- Zelda ROTH : Jeux amateurs sur le thème de Zelda
- Zeste de Savoir : la connaissance pour tous et sans pépins
- YunoHost : s'héberger soi-même en toute simplicité
- Site de Fvirtman : recueil de projets et de codes en C et C++


  © 2005-2017 linor.fr - Toute reproduction totale ou partielle du contenu de ce site est strictement interdite.