Ça faisait longtemps que je ne postais pas tiens !
Ce code est, comme le titre l'indique, un générateur de lightmaps, c'est à dire : on lui fournit une heightmap (une image en niveaux de gris définissant des hauteurs : plus c'est blanc, plus le point est haut, Cf la leçon 34 de NeHe ici :
http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=34 ou même une autre de mes sources lol), et il génère une lightmap, c'est à dire une image, toujours en niveaux de gris, définissant les ombres à appliquer au terrain : on plaque cette texture sur tout le terrain et ça correspond aux ombres que font les reliefs.
Pour fonctionner, ce programme opère donc par lancers de rayons : il part d'une image totalement sombre (à vous de définir le niveau de "sombre" dans l'utilisation du prog) et envoie des rayons suivant un certain angle et de la gauche vers la droite. A vous aussi lors de l'utilisation du programme de spécifier l'angle et la hauteur à partir de laquelle part le dernier rayon (depuis la gauche).
Bon ben globalement c'est tout...le programme enregistre au format PNG mais peut ouvrir dans plusieurs autres formats (merci Gdk-Pixbuf :)).
Je n'ai pas testé le programme sous Windows mais je pense qu'il doit fonctionner.
Pour le compiler, il vous faudra la librairie GTK+ dans sa version 2, récupérable sur
http://gtk.alkia.org/index.php pour les utilisateurs de Code::Blocks ou Dev-C++.
Si vraiment vous voulez une version précompilée pour Windows, faites-le moi savoir...
Source / Exemple :
Cf le zip
Conclusion :
Si ce programme vous est utile, un p'tit commentaire serait le bienvenu :) (même s'il ne vous est pas utile hein :p).
3 sept. 2006 à 13:53
3 sept. 2006 à 12:21
En nommant axe des X l'axe qui va de gauche à droite de l'image, axe des Y celui qui va de haut en bas et axe des Z celui qui va du "haut" (pixel blanc) au "bas" (pixel noir), l'algo donne ça :
On part d'une image entièrement sombre.
Pour chaque ligne horizontale (i.e. on parcourt en Y)
Pour chaque altitude de départ (i.e. en Z, ce que j'appelle z_origine dans mon code)
(tous les rayons partent du côté gauche de l'image avec une altitude croissante)
Tant que le point en bout de rayon (nommons-le P)n'a pas dépassé la largeur
de l'image (axe des X)
Si jamais P est à la hauteur de ou en dessous du point de l'image survolé
(en même position pour X et Y) alors ce point devient blanc et on passe au rayon suivant.
Fin Si
On incrémente la position du point en bout de rayon en X avec un pas de 1
(i.e. on passe au pixel suivant) et
on décrémente sa position en Z (i.e. il descend en avançant)
Fin Tant que
Fin Pour
Fin Pour
Voilà, donc en gros on peut imaginer ça comme un rayon fait de petits cubes qui évolurait au-dessus d'un voxel, fait de petits cubes...
En illustration ça donnerait ça : http://perso.orange.fr/funto/explication.jpg (représentant une "tranche" horizontale de l'image).
Bon là je pense avoir été assez clair? ^^
2 sept. 2006 à 18:35
Bon, déjà, c'est clair qu'il fallait partir des pixels :D C'est comme ça que ça marche pour les raytracers aussi, sinon je vois pas comment on peut faire autrement ^^ (d'ailleurs c'est un peu un raytracer en fait). Mais plus techniquement, tu calcules tous les triangles du relief et tu testes les collisions avec un rayon de lumière? T'utilises des octrees alors? Et tu calcules les normales des triangles pour le degré d'éclairage ou pas?
En fait, je vois quand même pas trop trop comment tu associes un pixel à un triangle ... un pixel c'est plus un sommet de trois triangles voisins (ou plus? je sais pas trop comme ça sans réfléchir). Faut moyenniser les vecteurs normaux alors?
Enfin, détaille quoi ;)
2 sept. 2006 à 13:42
J'avais fait mon propre format aussi, d'ailleurs c'est dans mes sources :p Avec compression RLE, mais si ton truc c'est avec des flottants ça doit pas être possible ^^
Sinon peut-être qu'avec le OpenEXR y'a possibilité d'avoir une + grande résolution...
2 sept. 2006 à 12:40
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.