23 juin 2012

Gremlin : un générateur de SkyBoxes

 

Ces derniers jours, j’ai quelque peu laissé de côté Newt-Puzzle pour développer une petite application qui va me permettre de créer facilement des skyboxes pour Newt-Puzzle. Pour mes premiers tests, j’avais récupéré les skyboxes d’Extreme Tux Racer. Je vais maintenant pouvoir les remplacer par des images générées spécialement pour Newt.

Une SkyBox, comment ça marche ?

Dans une scène rendue en 3D, une skybox permet de représenter l’environnement éloigné, typiquement le ciel. Concrètement, on plaque 6 images sur les faces d’un cube centré sur la position de la caméra. Ainsi, lorsqu’on fait une translation la caméra, la skybox reste fixe, donnant l’impression qu’elle représente un paysage très éloigné. En revanche, lorsqu’on fait une rotation de la caméra, la skybox se déplace (en sens inverse de la caméra) : on regarde ainsi le ciel dans une autre direction.

La difficulté pour créer les 6 images du cube, est qu’il ne faut pas que dans l’application on se rende compte que le paysage lointain est sur un cube ! Il faut donc que les images se « raccordent » parfaitement au niveau des arrêtes, mais aussi que la perspective soit adaptée. Il est donc impossible de dessiner directement les 6 images, ou d’assembler simplement 6 photos.

On peut citer ces quelques méthodes pour créer ces boîtes de ciel :

  • Utiliser un logiciel de génération de paysages, tel que Terragen ou Vue d’Esprit. On crée son paysage, puis on en tire 6 images carrées prises en regardant suivant les axes d’un repère (une image en regardant vers les X positifs, une pour les X négatifs, etc), avec un angle de vue de 90°. C’est une méthode classiquement utilisée dans les jeux videos. Les images que j’avais provisoirement empruntées à Extreme Tux Racer pour commencer à tester l’affichage d’une skybox m’ont d’ailleurs l’air de venir de Terragen.
  • Créer une scène dans un logiciel de modélisation 3D tel que Blender ou une alternative propriétaire, et faire 6 rendus comme avec la méthode précédente.
  • Créer une skybox à partir d’une photo panoramique, à l’aide d’un logiciel.

Pour Newt-Puzzle, comme je souhaitais utiliser des images faites moi-même, aucune de ces solutions ne me convenait. Je me suis donc tournée vers autre chose.

 

Présentation de Gremlin

Je voulais créer un grand nombre de petites images, et les assembler en tenant compte de la perspective pour créer les 6 textures des faces du cube formant la skybox. Ces images de base représentent des objets simples qui vont être projetés sur les faces du cube, un peu comme si on créait un papier peint en plaçant un grand nombre de petits motifs.

Si les images de base sont suffisamment petites par rapport aux textures finales (c’est à dire si elles ont une petite taille angulaire), on peut les dessiner sans se préoccuper des déformations dues à la perspective. En résumé, on peut les dessiner sans se poser trop de questions ! Ensuite, j’ai utilisé une variante des angles d’Euler pour représenter ces images dans l’espace, comme le montre l’image ci-contre1. Sur le schéma, il n’y a qu’une seule image pour que ce soit plus lisible, il faut imaginer qu’il y en a des dizaines, voire des centaines, et que l’observateur se trouve au centre du repère.

J’ai commencé à développer une petite application qui s’occupe de récupérer chaque image et la place au bon endroit dans l’espace. On peut visualiser le résultat grâce à la magie d’OpenGL, et faire tourner la caméra dans tous les sens. Puis, on peut enregister la scène sous forme de skybox, c’est à dire générer les 6 textures des faces du cube et les enregistrer. Du point de vue de l’application, cela revient simplement à faire 6 captures d’écran en regardant suivant les axes du repère.

J’ai poétiquement appelé ce projet Gremlin, pour Generation of Random Environment Maps et lin parce que ça permet de faire « gremlin » qui est un nom plus mieux que « grem » tout court. On peut spécifier à Gremlin le nom des images que l’on souhaite utiliser, ou indiquer un nombre d’images à prendre au hasard dans un répertoire (ou un mélange des deux, bien sûr : telles images obligatoirement, et n autres au hasard). On peut également indiquer pour chaque image sa position dans l’espace et sa taille angulaire, ou demander un tirage aléatoire. Cela permet de générer facilement une infinité d’environnements à partir d’une série d’images de base.

 

Une première skybox dans l’espace

Pour ma première skybox, j’ai choisi comme thème l’espace, en m’inspirant des œuvres d’Ekho. Comme images de base, on va donc avoir des étoiles, des nébuleuses et divers corps spatiaux plus détaillés. Ci-dessous quelques exemples d’images que j’ai faites pour Gremlin 2 :

Pour l’instant, j’ai une grande quantité d’images d’étoiles de base mais je n’ai fait que 6 nébuleuses et une seule planète. Je compte enrichir ma collection d’images par de nouvelles créations pour obtenir des résultats plus variés.

C’est cependant suffisant pour obtenir une première skybox. J’ai assemblé les 6 images comme un patron de cube pour qu’on voit mieux comment elles se positionnent. On peut voir sur l’image que certaines images de nébuleuses sont utilisées plusieurs fois. Quand j’aurai dessiné davantage de nébuleuses, je compte rajouter dans Gremlin une option pour qu’il n’y ait pas de doublon lorsque plusieurs images sont prises au hasard.

 

Une fois la skybox générée, il ne reste plus qu’à la charger dans Newt-Puzzle :

 
  1. J’en profite pour illustrer l’outil ultime quand on développe avec OpenGL : le gribouillage de schéma…
  2. Pour que les images ce ne soit pas trop lourdes, j’ai ici réduit leur taille. Les artefacts ideux que l’on aperçoit à côté des petites étoiles sont dus à la conversion en jpeg, ils ne seront pas présents dans Newt.
Réactions : 1 Commentaire
 

Commentaires

Vous pouvez poster un commentaire ou laisser un trackback à cette adresse.

 
 
  • Nnexxus
    26 juin 2012
     

    Très sympa ! Ca m’a rappelé un thread que j’avais lu quelque temps en arrière : http://www.hard-light.net/forums/index.php?topic=67899.0

    Il y a des bizarreries liées au moteur graphique de Freespace (si j’ai bien suivi, les textures des faces du cubes doivent se recouvrir légèrement pour éviter les artefacts aux arêtes) mais sinon les méthodes évoquées et le type de rendu ressemblent fortement à ton Gremlin.

    Un des types sur le thread HLP indique qu’il pioche ses nébuleuses sur le site de la NASA, dans les images Hubble. Ca peut être une piste pour augmenter la taille de ta bibliothèque d’images ? Même si tu veux conserver des images faites à la main, ça peut toujours servir de référence ou de source d’inspiration.

 

Réagissez

Vous pouvez utiliser ces balises : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>
 
 
 

© 2012 Eldermaeblog | Joyeusement propulsé par WordPress