GÉNÉRATEUR DE LIGHTMAPS À PARTIR D'UNE HEIGHTMAP

luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 - 1 sept. 2006 à 20:35
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008 - 3 sept. 2006 à 13:53
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/39387-generateur-de-lightmaps-a-partir-d-une-heightmap

cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
3 sept. 2006 à 13:53
Super le dessin, très clair là :). Merci :).
Funto66 Messages postés 1267 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 28 février 2007 4
3 sept. 2006 à 12:21
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? ^^
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
2 sept. 2006 à 18:35
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 ;)
Funto66 Messages postés 1267 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 28 février 2007 4
2 sept. 2006 à 13:42
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...
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
2 sept. 2006 à 12:40
Pour le moment, j'enregistre mes floatant bout a bout :) Evidemment c'est illisible sur un logiciel de dessin, mais ca reste une heightmap.
Funto66 Messages postés 1267 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 28 février 2007 4
2 sept. 2006 à 11:50
Ok je vois ^^
Euh non en effet comme tu le dis la composante est codée sur 8 bits...

J'ai fait ce prog pour un autre projet que j'ai en cours et qui utilise le moteur 3D OGRE, et la heightmap qu'ils fournissent (image PNG) n'utilise que 8 bits...
Pour utiliser ces 16 ou 32 bits, on utilise le plus souvent les différents canaux rouge/vert/bleu ou un format de heightmap spécial? (ou du OpenEXR?)
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
1 sept. 2006 à 23:25
lool :) oue partir de la heightmap, ca me parait plus logique en soi.

Sinon pour une heightmap 16 bit ou plus, je parlais du codage des données. Comme je ne peux que regarder le code, j'ai du mal a voir ce qui se passe. Mais l'altitude tu l'extrais a partir d'une composante de couleur codé sur 8 bits non ? Or c'est fréquent (voir systématique) d'utiliser des heightmaps codés sur 16 ou 32 bits pour avoir une meilleur précision sur la hauteur.
Funto66 Messages postés 1267 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 28 février 2007 4
1 sept. 2006 à 20:40
tu veux dire quoi par heightmap 16 bits?

Et pour le système en fait non je ne pars pas de la heightmap (en fait t'as raison j'aurais dû...tant pis ^^ Quoi que je peux encore le faire après tout...), je pars d'une espèce de mur vertical situé à gauche, et je lance tous les rayons en direction de la heightmap avec l'angle donné.

A la base tout est sombre, si le rayon arrive sur un pixel, celui-ci devient blanc.

('tain c clair que j'aurais dû partir de la heightmap...pff...)
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
1 sept. 2006 à 20:35
Quand tu fais un lancé de rayon, tu lances plein de rayon aléatoirement ? je pensais qu'on partait de chaque point de la heightmap et qu'on se déplacait ensuite dans la direction de l'éclairage et si on rencontre un obstacle, alors le vertex est dans l'ombre.

Sinon, t'as pas prévu de truc pour pouvoir charger une heightmap 16 bits ou plus ? Car avec la faible résolution, on voit des artefacts apparaitrent sur la lightmap de ta screen.
Rejoignez-nous