Tutoriel: Lightmaps pour Contact en utilisant 3dsmax.
But: Transformer vos scènes VRML en scènes lightmappées.
Cliquez
ici pour un exemple
Pre-requis:
--- avoir le plug-in
Luminaire (gratuit)
--- 3dsmax (le tutoriel est écrit pour 3dsmax4+ mais Luminaire existe aussi
pour R2 et R3)
--- utiliser l'exporter VRML (gratuit) de Blaxxun est recommandé (non-testé
avec celui par defaut). (téléchargez
le ici)
Note: je ne dis pas que c'est la seule façon, ni même la meilleure, mais
une d'entre elles.
Partie 1: Préparer la scène.
Alors vous voulez avoir des lightmaps et êtes tout excité qu'il y ait un plug-in
gratuit pour celà, mais en lisant sa documentation, vous tombez sur un os: VRMLent
parlant, vous ne devriez utiliser qu'une seule texture par objet (c.a.d que
la texture ne pourrait pas être utilisée sur un autre objet), ni utiliser de
TextureTransform{}. Aïe.
Mais ne vous inquiétez pas, il y a toujours une solution comme vous allez le
voir :-)
Si ce n'est pas déjà le cas, ouvrez votre scène dans 3dsmax (si vous n'en avez
pas, vous pouvez utiliser celle-là)
pour le tutoriel.
Exportez en VRML tel-quel, mais vérifiez bien que:
- tous les objest qui seront illuminés ont des coordonnées
UVW
- vous n'exportez pas en tant que primitives pour être
sûr que les UVW correspondront bien à ce que vous attendez
Nommez-la mascene_normale.wrl
Partie 2: Exporter les lightmaps.
Maintenant, nous allez tricher pour avoir les lightmaps: dans l'éditeur de matériaux
(tapez "M" pour l'ouvrir), désactivez la map diffuse (pas la couleur, la map),
s'il y en a une, pour TOUS les matériaux utilisés par les objets futurs-illuminés.
Puis dans Tools, cliquez le bouton "More.." et trouvez "Lum. Lightmap".

Paramétrez comme sur l'image ci-dessous, puis sélectionnez tous les objets et cliquez
"Render Selected Objects" (n'oubliez pas de donner un nom au(x) fichier(s) générés en
cliquant le bouton "...").
Explication: nous avons remplacé la map diffuse de chaque objet par sa lightmap. Si
nous n'avions pas désactivé les maps diffuse, les lightmaps auraient été intégrées
dans les textures au lieu d'être des images séparées (en résumé).
Maintenant, exportez en VRML et nommez-la mascene_illuminee.wrl
Partie 3: Editer le code VRML.
La partie sympatique :-)
Créez une scène vide (nommez-la mascene_lightmappee.wrl) et tapez ce qui suit:
#VRML V2.0 utf8
EXTERNPROTO DrawGroup[
exposedField SFVec3f bboxSize
exposedField SFVec3f bboxCenter
exposedField SFBool sortedAlpha
exposedField MFNode drawOp
exposedField MFNode children
eventIn MFNode addChildren
eventIn MFNode removeChildren
][
"urn:inet:blaxxun.com:node:DrawGroup",
"http://www.blaxxun.com/vrml/protos/nodes.wrl#DrawGroup",
"nodes.wrl#DrawGroup"
]
EXTERNPROTO DrawOp[
exposedField MFInt32 op
exposedField MFFloat args
][
"urn:inet:blaxxun.com:node:DrawOp",
"http://www.blaxxun.com/vrml/protos/nodes.wrl#DrawOp",
"nodes.wrl#DrawOp"
]
DrawGroup {sortedAlpha FALSE children [
### Normal
#
# Point A
#
DrawOp {op [2 3 6 1 7 5 8 2]}
### Lightmaps
#
# Point B
#
DrawOp {op [2 4 6 0 7 2 8 2]}
] }
### Reste de la scene
#
# Point C
#
Notez que les valeurs données dans les DrawOp ne sont pas forcément les meilleures
dans votre cas particulier. Plus d'infos sur la syntaxe de DrawOp et DrawGroup
ici
(en anglais).
Ouvrez mascene_normale.wrl et copiez les éléments qui ne seront pas illuminés (genre proximitysensors
et autres) dans mascene_lightmappee.wrl au Point C.
Faites de même pour les éléments qui eux seront illuminés, mais mettez-les au Point A.
Ouvrez mascene_illuminée.wrl et répétez l'opération pour les éléments qui seront illuminés,
mais cette fois au Point B.
Partie 4: Conclusion.
Ca y est :-) Mais vous pouvez (et c'est même conseillé) de traficoter des variantes,
exemple: render les lightmaps assignées en "self-illumination" au lieu de "diffuse",
ré-activez les maps diffuse et exportez en multitexturage, mais vous aurez à convertir
en png avec un masque alpha dans PaintShopPro/Photoshop/autre.
Egalement, si vous avez des nodes redondants, vous devriez penser à éditer
votre code pour utiliser DEF...USE afin d'avoir de plus petits fichiers.
Annexe: questions/(débuts de) réponses.
Q: Localement, pas de problème, mais sur internet j'obtiens des erreurs "Missing
or bad image file" (image corrompue ou manquante), pourquoi ?
-> Vérifiez la casse de vos noms de fichiers, certains sont probablement en
majuscules alors que d'autres sont en minuscules: en effet, Luminaire tend à
exporter en majuscules tandis que c'est le contraire avec l'exporter VRML.
Q: Cà produit une lightmap noire, où me suis-je trompé ?
-> Essayez de mettre du blanc comme couleur diffuse (dans 3dsmax) et ré-essayez.
Si c'est toujours noir, il se peut que l'objet soit tout simplement trop loin
des sources lumineuses, essayez d'augmenter le rayon des lumières.
Q: J'ai renderé les lightmaps assignées en self-illumination comme vous avez
dit et voulu exporter en multitexturage, mais l'exporter a planté :-(
-> Vérifiez que vous n'avez pas de maps non-VRML dans vos matériaux genre Gradient
Linéaire, convertissez-les en Bitmaps/Images à la place.
Q: Ok, c'est pas mal, mais je voudrais que çà paraisse plus réaliste !
-> Lisez la documentation de
Luminaire (en anglais), c'est un plug-in puissant s'il est manié de la bonne
façon, mais celà dépasse le cadre de ce tutoriel. Egalement, documentez-vous
sur les techniques d'éclairage naturel en général, même si ce n'est pas forcément
pour la 3D.
Q: Je ne veux pas une lightmap par objet, je les veux toutes dans un seul
fichier :-(
-> Dans la partie 2, compactez tous vos objets-à-illuminer ensemble (Tools>Collapse),
mais vous perdrez alors les spécificités de chaque materiau (le bump par exemple)
lors du calcul des lightmaps, sans compter que quand elles sont séparées, vous
pouvez compresser chaque lightmap avec un ratio différent, les animer plus facilement
et aussi leur donner une résolution différente (genre 128*128 pour un petit
objet et 512*512 pour un plus gros).
|