Générateur de lightmaps à partir d'une heightmap

Soyez le premier à donner votre avis sur cette source.

Vue 7 679 fois - Téléchargée 394 fois

Description

Ç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).

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 décembre 2008

Super le dessin, très clair là :). Merci :).
Messages postés
1267
Date d'inscription
mercredi 1 janvier 2003
Statut
Membre
Dernière intervention
28 février 2007
3
Non non pas d'association entre un pixel et un triangle, comme tu dis, dans une heightmap un pixel serait plutôt un sommet, qui serait commun à 4 triangles voisins.

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? ^^
Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 décembre 2008

Intéressant. Mais tu pourrais pas détailler l'algo?

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 ;)
Messages postés
1267
Date d'inscription
mercredi 1 janvier 2003
Statut
Membre
Dernière intervention
28 février 2007
3
Ok je vois, ton propre format quoi :)
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...
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Pour le moment, j'enregistre mes floatant bout a bout :) Evidemment c'est illisible sur un logiciel de dessin, mais ca reste une heightmap.
Afficher les 9 commentaires

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.