Utiliser l'UV-mapping avec les mesh POV-Ray

Qu'est ce que l'UV-mapping ?

Imaginez que vous vouliez plaquer une texture réaliste sur un modèle de corps humain. "Réaliste" signifie que votre texture doit recréer les variations subtiles de la couleur de la peau, qui doit être plus rose ici, plus brune là, etc. Comme cela semble très difficile à réaliser en procédural (c'est à dire avec des textures définies algorithmiquement comme bozo ou gradient), il semble logique d'utiliser une image map, peinte à la main ou d'origine photographique. Mais comment faire alors pour projeter cette image sur le modèle ? Il y a dans POV-Ray différents types de mapping disponible, pour des primitives simples : plan, sphère, cylindre... Mais, même en faisant l'hypothèse qu'un corps humain est plus ou moins cylindrique, il va être très difficle de positionner une couleur donnée à un endroit particulier. Heureusement, l'UV-mapping permet de résoudre ce genre de question.

Une map UV ressemble aux images ci-contre :

La première image est un gabarit UV pour une tête humaine (Femme Nue Poser 4), tandis que la seconde est la version peinte (en l'occurence celle utilisée dans  Eve au réveil). Contrairement à une image map classique, qui est projetée selon une géométrie indépendante du modèle, cette image est en correspondance précise avec le modèle sur lequelle elle doit s'ajuster. Ainsi, les lignes du gabarit correspondent à ses polygones. Le modèle sera peint en fonction de sa couleur sur l'image : pour cela, à chaque sommet (vertex) du maillage est associé une coordonnée de l'image (le vecteur <u,v>).

Poser 4 UV template
Poser 4 UV map

Quels objets peuvent-être texturés en UV-mapping ?

Note : ce tutoriel ne couvre que l'UV-mapping pour les mesh. Pour d'autres utilisations, voir la documentation de votre version de POV (Megapov et POV 3.5).

Quels formats de mesh pour POV?

Dans Megapov et POV 3.5 et supérieur, deux formats de mesh supportent l'UV-mapping. Ces mesh UV contiennent donc, outre l'information sur leur géométrie et leurs normales, l'information (les coordonnées UV) concernant leur texture.

Il faut noter qu'il y a une différence fondamentale de comportement entre un mesh de type mesh2 et un mesh classique. Dans ce dernier cas, chaque copie du mesh présente dans la scène peut être texturée indépendamment sans avoir à re-parser le mesh. Avec un mesh de type mesh2, la texture est donnée au moment du parsing : toutes les copies ultérieures ont la même texture. Pour avoir une texture différente, il faut reparser le mesh.

De quoi a-t-on besoin pour faire de l'UV-mapping sous POV?

D'abord, il faut une version de POV qui supporte l'UV-mapping : soit POV 3.5 et supérieur, soit un patch comme Megapov.

Parce que l'UV-mapping n'a été supporté que récemment par POV-Ray, il y a encore peu d'utilitaires dédiés. Ce tutoriel ne concerne que Windows, mais certains des utilitaires ci-dessous disposent également de version Mac et Linux.

Les utilitaires suivants seront également utiles :

Vous aurez également besoin d'un programme de retouche d'images bitmaps comme Photoshop ou Paintshop Pro, pour pouvoir lire et écrire les principaux formats de fichiers graphiques (JPG, TIFF, TGA, PNG et BMP).

Conversion de mesh vers POV

Tout mesh peut théoriquement être UV-mappé et converti pour être utilisé sous POV. Présentement (Juillet 2000), il n'y a pas de solution 100% fiable pour convertir un fichier OBJ ou 3DS contenant des informations d'UV-mapping vers POV. Tous les convertisseurs listés plus haut ont tendance soit à planter sur certains fichiers, soit à produire des fichiers qui ne marchent pas bien. Cela semble dû au fait que les convertisseurs ne sont pas 100% compatibles avec l'ensemble des spécifications de ces fichiers : un convertisseur marchera avec un OBJ issu de Poser, mais produira un fichier erroné avec un OBJ issu de Lightwave. En règle générale, si un convertisseur ne marche pas, essayez-en un autre. Mon outil favori reste 3DS2POV, que j'ai utilisé intensivement en 1999-2000. Cependant, il requiert une conversion préalable au format 3DS, ce qui peut être plus compliqué que prévu.

Conversion de mesh UV-mappé dont les maps sont déjà fournies

L'utilisation de Poser, un logiciel commercial dédié à la création de personnages, est une des raisons principales pour laquelle de nombreux utilisateurs de POV se sont intéressés à l'UV-mapping. J'utiliserai donc Poser comme exemple. Poser exporte vers de nombreux formats, dont OBJ et 3DS, qui sont déja UV-mappés ; l'image map et la bump map sont fournies avec les modèles.

De Poser vers mesh2

Il y a deux façons de faire.

Une fois le modèle exporté au format mesh2, le convertisseur produit plusieurs fichiers. Dans le cas de 3DS2POV, et dans l'hypothèse que le fichier 3DS de base s'appelle TOTO.3DS, alors:

- TOTO_O.INC est le fichier objet lui-même.
- TOTO.POV est un fichier POV prêt à l'emploi.
- TOTO_M.INC contient les informations de textures.
- TOTO_A.INC contient les informations d'animation.

Modification des textures

Le fichier TOTO_M.INC contient une ou plusieurs définitions de textures. En fait, un mesh UV peut faire appel à de nombreuses textures, chacune étant attachée à une zone particulière du mesh. Classiquement, les modèles Poser utilisent une douzaine de textures.

Cependant, les textures présentes dans TOTO_M.INC ne sont que des gabarits de textures. Il faut les changer et remplacer les informations de pigment par la bonne image map. On peut aussi modifier le "finish" et ajouter un "normal", qui peut être une bump_map. Avec 3DS2POV, une texture appelée "default_texture" peut servir de point de départ. Après édition, le fichier des textures devrait ressembler à ceci :

#declare default_texture = texture {
pigment{image_map{png "p4woman.png"}} // la map UV
finish{metallic brilliance 2 ambient 0.01 diffuse 0.6 specular 0.03 roughness 0.05}
}
#declare Mskin=texture{default_texture} // la texture principale
#declare Meyeball =texture{Mskin finish{reflection 0.3}}
#declare MeyeBrow = texture{Mskin}
#declare Mnipple = texture{Mskin}
#declare Mlips = texture{Mskin finish{ambient 0.1 diffuse 0.3 specular 1 roughness 0.01}}
#declare MinnerMouth = texture{Mskin}
#declare Mtongue = texture{Mskin}
#declare Mteeth = texture{Mskin}
#declare Mlashes = texture{Mskin}
#declare Mpupil = texture{Meyeball}
#declare Miris =texture{ Meyeball}

Les noms de textures sont en général explicites, au moins pour les modèles Poser. Ce n'est pas le cas pour tous les modèles, et il faut parfois faire des tests pour déterminer le rôle exact de chaque texture.

Dans l'exemple ci-dessus, toutes les textures sont basées sur l'image_map fournie avec le modèle Poser. Il faut éventuellement convertir l'image (souvent au format TIFF) dans un format lisible par POV. Les fichiers de bosselage (*.BUM) sont en fait des fichiers BMP, du moins dans la version Windows : il suffit de changer l'extension (et d'en augmenter le contraste pour améliorer l'effet).

En règle générale, l'image map est définie une fois pour toutes et utilisée pour toutes les parties du corps. En effet, une map Poser couvrent l'intégralité du corps : le même fichier image est utilisé pour les yeux et la peau, par exemple. Cependant, rien n'empêche de modifier cette texture au passage : dans l'exemple ci-dessus, de la réflexion a été ajoutée aux textures des yeux (iris, blanc, pupille).

Certains modèles peuvent nécessiter plusieurs maps. Par exemple, le modèle "Victoria" de chez Zygote, qui est beaucoup plus détaillé que le modèle Poser 4 standard, requiert une map pour le visage et une autre pour le reste du corps. Cheveux, vêtements et accessoires utilisent leurs propres maps.

L'utilisation d'une image map n'est en rien obligatoire. On peut mettre n'importe quoi à la place. En fait, on peut ne pas fournir de map et n'utiliser l'UV-mapping que pour colorer indépendamment chaque partie du modèle, ou on peut mélanger bitmaps et pigments procéduraux classiques. Dans l'exemple ci-dessus,

#declare Miris = texture{pigment{SkyBlue}}

remplace la couleur de l'iris telle qu'indiquée dans l'image map par la couleur SkyBlue.

Le procédé sera plus ou moins similaire avec les autres convertisseurs.

Une dernière chose à bien comprendre : parce que les maps UV s'ajustent précisémment à la géométrie d'un modèle, il est préférable de ne rien changer à la position des éléments sur l'image (mais cela est possible : voir la page d'UVMapper pour les détails). Bien sûr, on peut changer les couleurs, ou même la taille de l'image (les coordonnées UV sont relatives).

Placer le modèle dans la scène POV

Une fois les textures prêtes, il n'y a plus qu'à mettre le modèle dans la scène. Dans le cas de 3DS2POV et toujours dans l'hypothèse d'un fichier de départ TOTO.3DS, le fichier TOTO.POV est prêt à l'emploi et peut s'utiliser comme base de travail. Ce fichier fait appel aux fichiers TOTO_O.INC, TOTO_A.INC et TOTO_M.INC). En règle générale, on peut enlever la référence à TOTO_A.INC et modifier la caméra et les lumières. TOTO.POV contient aussi les coordonnées min et max du mesh. Les modèles Poser sont souvent très petits (une unité POV de haut). D'autres modèles peuvent avoir n'importe quelle taille.

Parfois, 3DS2POV fournit plusieurs mesh dans le fichier *.INC résultant. Tous ces mesh sont listés dans *.POV et rassemblés dans une seule union{ }.

Si vous utilisez l'UV-mapping avec Megapov ou une autre version non officielle, il vous faudra éventuellement ajouter quelque chose comme ça au début du fichier *.INC:

#version unofficial Megapov xxx.yyy; // où xxx.yyy est le numéro de version de Megapov.

Résumé

Pour utiliser l'UV-mapping, il vous faudra :

Conversion de mesh UV-mappé sans maps fournies

Le procédé est globalement le même que précédemment avec une différence : vous devrez générer la map vous-même. Heureusement, cela est presque automatique.

La première étape consiste à convertir le fichier au format OBJ, par exemple par 3DWIN, ou par tout autre logiciel qui peut exporter au format OBJ sans toucher aux informations UV. NE PAS UTILISER CROSSROADS, car il ignore les infos UV.

La seconde étape consiste à utiliser un utilitaire d'UV mapping pour recréer la map. Le plus populaire est l'UVMapper de Steve Cox. Il suffit de charger le mesh OBJ : UVMapper recrée la map sous forme de gabarit à partir des informations UV du fichier. Ce gabarit est sauvé au format BMP 8 bits (noir et blanc). Vous devrez le convertir en 24 bits pour pouvoir le peindre.

Après cela, continuer comme indiqué dans la section précédente.

Conversion de mesh sans UV-mapping

Dans les cas précédents, l'information UV était fournie. Selon toute vraisemblance, elle a été créée avec des outils permettant de peindre interactivement sur un modèle 3D. Comme il n'existe pas, à ma connaissance, d'outils de ce type existant en shareware ou en freeware, il faudra utiliser UV-mapper pour faire le travail.

Voici un exemple détaillé basé sur sPatch, Crossroads, UVMapper et POSE2POV. Les fichiers (mais pas les programmes) nécessaires à la démonstration sont fournis ici. La technique est la même avec OBJUVPOV.

1. Créer le modèle dans sPatch
  • Il s'agit d'un simple cylindre courbé (TESTUV.SPT).
  • Exporter vers DXF, avec File>Export>DXF>Low (8 poly/patch) sous le nom TESTUV.DXF

2. Convertir le modèle au format OBJ par Crossroads

  • Charger le DXF dans Crossroads
  • Selectionner le modèle avec le bouton gauche de la souris
  • Cliquer ensuite sur le bouton droit (un menu apparaît), puis sur "smooth". Cette opération crée le lissage des triangles (normales).
  • Sauver le modèle OBJ sous le nom TESTUV.OBJ

 

sPatch
3. Créer les informations UV
  • Charger le modèle OBJ dans UV-mapper.
  • UV-mapper fournit des statistiques, puis, une fois que l'on a cliqué sur OK, il vous informe que l'objet n'a pas de coordonnées de texture UV
  • Choisir Edit>New UV Map>Cylindrical
  • Donner 150 pour la taille de la map (pas la peine d'une map plus grande pour l'instant) et cliquer sur OK
  • La map UV apparaît
  • Choisir Edit>Select>All. La map est sélectionnée.
  • Choisir Edit>Assign>To Material
  • Créer un "material" appelé TESTUVMAP. Cela est fondamental, car sinon le convertisseur ne saura pas attribuer la texture au modèle.
  • Choisir File>Save model>OK. Sauver le modèle sous le nom TESTUV2.OBJ. Ce fichier OBJ contient les informations UV. Vous pouvez l'ouvrir dans l'éditeur POV et voir que des lignes commençant par "vt" ont été ajoutées.
  • Choisir File>Save Texture Map>OK. Sauver comme TESTUVTEMPLATE.BMP.

 

uv template map uv

4. Conversion au format mesh2
  • Sous MS-DOS, aller dans le répertoire POSE2POV
  • Taper pose2pov -uv TESTUV2 TESTUV2 (TESTUV2.OBJ file est ici dans le répertoire POSE2POV)
  • POSE2POV crée plusieurs fichiers dont 3 nous intéressent : TESTUV2.POV (scène prête à l'emploi), TESTUV2.INC (mesh) et TESTUV2T.INC (textures)

 

5. Modifier les fichiers et lancer POV
  • Ouvrir POV et charger les 3 fichiers.
  • Si vous utilisez une version non officielle de POV, il vous faudra peut-être rajouter au début de TESTUV2.INC une ligne telle que : "#version unofficial Megapov 0.4." Cela devrait être inutile avec POV 3.5.
  • Ouvrir TESTUV2T.INC. Ce fichier contient la définition de la texture. Remplacer le pigment par pigment { image_map{sys "TESTUVTEMPLATE" }}
  • Lancer TESTUV2.POV. Vous devriez obtenir la première des deux images ci-contre. Mais les lignes du gabarit ne collent pas à l'objet !!! En fait la map est inversée (y au lieu de 1-y). Si on scale la texture par <1,-1,1> le problème disparaît... Cela semble dû au fait que la map est codée sur 8-bit en noir et blanc.
  • Dans votre logiciel de retouche favori, augmentez la profondeur des couleurs à 24 bits (16 millions de couleurs) puis peignez ce que vous voulez dessus en suivant le gabarit.
  • Dans TESTUV2T.INC, remplacez le nom du gabarit par le nom de l'image map finale.
  • Lancer TESTUV2.POV. Vous devriez obtenir une image comme celle du bas (et le problème d'inversion a disparu du fait de la conversion en 24 bits).
Render with template map

Render with a very nice map

Notes:

Problèmes connus et solutions

Faire de l'UV-mapping avec des outils shareware ou freeware demande une certaine obstination, car il y a BEAUCOUP d'occasions où cela ne marche pas, ou mal. Les normales et les vecteurs UV peuvent disparaître ; les listes d'indices mesh2 causent des erreurs ; les maps n'apparaissent bien, et j'en passe.... Si mesh2 vous rend fou, essayez le format mesh classique avec OBJUVPOV. Essayez aussi plusieurs convertisseurs.

Voici quelques solutions à des problèmes que j'ai rencontré.

Mon modèle Poser 3DS est tordu après sa conversion, ou il refuse d'être exporté, ou il fait planter les convertisseurs

Vous avez une version de Poser buggée. Allez chercher le patch chez CuriousLabs, et s'il n'existe pas, sauvegardez au format OBJ, réimportez le fichier OBJ, exportez-le comme 3DS. Ou alors, passez par un convertisseur OBJ->POV. Si votre modèle comprend des accessoires (cheveux, vêtements), il peut être nécessaire d'exporter les objets séparément (en faisant attention à ce qu'ils restent à leur position absolue).

L'image map n'apparaît pas correctement

Voici deux raisons possibles :

L'image map apparaît correctement, sauf au niveau des "sutures" ; des triangles semblent mappés de façon erratique

Les maps Poser donnent parfois des "sutures" visibles (lignes blanches) au niveau du dos, des membres ou au sommet du crâne. Le mieux est encore de ne laisser aucune surface blanche sur l'image map, et de faire déborder les zones de couleurs au-delà des limites du gabarit.
Avec les mesh produits par OBJ2POV, j'ai noté des triangles bizarres apparaissant sur le dos ou sur un côté. Pas de bonne solution, à part montrer le bon profil à la caméra...

 

Macros et sources
Sommaire
tran@inapg.inra.fr