retour

Créer ses modèles pour Panda3D avec Blender et Chicken (et GIMP)

Dans ce tutoriel, on va apprendre à générer des modèles pour panda3D à partir de Blender. On considère ici que vous avez déjà installé le moteur panda3D, et même que vous avez réussi à faire courir le panda au milieu des bambous. Avant de démarrer, assurez-vous d'avoir également :

De plus, si panda3D est correctement installé (ce qui devrait être le cas arrivé ici), vous disposez d'une commande "pview" qui permet de visualiser les modèles egg, ce qui se révèlera super-utile dans un moment (on verra alors quelques options de pview).




1. Premiers pas avec Chicken

1.1. Installation de Chicken

Dans les précédentes versions, Chicken tenait dans un seul script qu'on se contentait d'exécuter sous Blender, et tout se passait très bien, très simplement. Dans les versions plus récentes, vous aurez probablement deux dossiers au dézipage, en plus du script chicken_export.py. Il vous faut copier le contenu de ces dossiers dans les dossiers de même nom qui se trouvent dans le dossier de scripts de blender. Sous pas mal de linux, ça donne un truc du genre (on est en root, vu à quoi on touche là) :

# cp /chemin/vers/bpydata/* /usr/share/blender/scripts/bpydata/
# cp /chemin/vers/bpymodules/* /usr/share/blender/scripts/bpymodules/

Ceci fait, vous pourrez lancer le script chicken_export.py de n'importe où sans problème.

Note : Faites gaffe si vous choisissez d'installer chicken pour votre utilisateur principal seulement : si vous vous contentez de dézipper chicken dans le dossier de scripts de votre utilisateur (généralement : /home/user/.blender/scripts, ou "user" est le nom de votre utilisateur), les dossiers bpymodules et bpydata seront écrasés pour cet utilisateur. Bien que chicken fonctionne avec cette configuration, ça risque de vous faire drôle quand vous appellerez un autre script (comme par exemple le script "Save UV Face Layout", super utile dans le processus d'UV-mapping, comme on va le voir plus bas).

1.2. Lancement de Chicken

Dans Blender, ouvrez une fenêtre de texte (en splittant la fenêtre 3D par exemple). Pour ceux qui ne sauraient pas comment on divise un cadre Blender en deux, ça se passe avec un click droit entre deux cadres, et avec l'option Split Area.

Chargez le script chicken_export.py, et lancez-le. Si tout se passe bien, et selon les versions, vous devriez voir quelque chose comme ça :

1.3. Utilisation de base de Chicken

On va maintenant exporter notre premier modèle egg. En mode Object sous Blender, sélectionnez l'objet que vous voulez exporter (avec un click droit), cliquez sur le bouton Update Selection de la fenêtre où chicken s'exécute (si tout va bien, un message rassurant vous le dira), cliquez sur Select pour choisir un chemin et un nom pour votre fichier egg à exporter, et enfin cliquez sur Export.

Si tout s'est bien passé, vous avez maintenant un modèle au format .egg, que vous pouvez visualiser grâce à pview. Dans pview, servez-vous de la souris et de ses trois boutons pour bouger le modèle. Pour quitter pview, appuyez sur la touche 'q' ou 'Esc'. Comme vous pouvez le constater, on a bien le cube de base de blender, mais il est tout blanc. C'est normal, on n'y a pas encore collé de texture :

C'est l'étape suivante : on va maintenant voir comment coller des textures à nos modèles sous Blender de façon à ce que Chicken les exporte (et ne vous emmerdez pas à essayer de faire des Materials et autres textures sous Blender, tout cela sera ignoré à l'exportation par Chicken).


2. UV-mapping sous Blender

L'UV-mapping est une technique qui consiste à "envelopper" une image en 2D autour d'un modèle en 3D. Pour préciser comment l'image 2D vient se caler sur le modèle en 3D, on découpe notre modèle en 3D à certains endroits, de façon à pouvoir le déplier (comme un patron pour ceux qui ont des notions de couture, comme le passage d'un globe terrestre à un planisphère pour ceux qui ont déjà constaté que bien que la Terre soit ronde, les cartes qui la représentent sous souvent plates). En dépliant notre modèle en 3D, on en a une représentation en 2D, sur laquelle on va pouvoir poser l'image 2D qui nous servira de texture pour ce modèle. Si ça ne vous paraît pas clair, patientez jusqu'aux images, tellement plus explicites quand on parle d'UV-mapping.

2.1. UV-unwrapping de base

Pour "découper" un modèle en 3D sous Blender, il faut lui indiquer des seams, les seams étant les lignes du modèle (les edges) suivant lesquelles on va découper le modèle. Pour faire un seam, sélectionnez les vertices du modèle que vous voulez découper, Ctrl+E, et cliquez sur Mark Seam. Pour enlever un seam, même principe mais évidemment avec Clear Seam à la place. La façon la plus simple de découper un modèle est souvent celle qui consiste à sélectionner tous les vertex du modèle (touche A en mode Edit) avant de faire "Mark Seam". Bien que ce soit la façon la plus simple, c'est rarement la plus pertinente, cependant, pour notre cube, ça fait très bien l'affaire. Illustration :

A peine aurez-vous cliqué sur "Mark Seam" que les seams apparaîtront. Nous allons maintenant pouvoir le déplier (unwrap en VO), mais pour voir le résultat de la découpe, et pouvoir caler une image dessus, il nous faut maintenant une fenêtre d'UV, ajoutez-la en splittant celle du script Chicken par exemple :

Un petit rappel (ou une super découverte pour ceux qui n'étaient pas au courant) : on peut faire passer n'importe quel cadre de Blender en pleine fenêtre avec Ctrl+flèche vers le haut, et revenir à la vue précédente avec Ctrl+flèche vers le bas.

Une fois que votre cadre UV/Image Editor est ouvert, revenez sur celui de la 3D View, et, toujours avec tous les vertices de notre cube sélectionnés, appuyez sur la touche "U", et cliquez sur Unwrap. Si tout s'est bien passé, le patron du cube apparaît dans le cadre UV/Image Editor.

2.2. UV-mapping de base

Maintenant, nous allons coller une image sur ce patron, pour ce faire, dans la fenêtre UV/Image Edit, cliquez sur Image -> Open, et sélectionnez une image quelconque. J'ai pris le limba.jpg qui sert de texture au labyrinthe dans le tutorial Maze de panda3D, c'est un joli bois clair, ça fera très bien l'affaire :

Une fois que vous avez ouvert une image, elle vient se mettre en fond de notre patron :

Revenez sur la 3D View, repassez en mode Object (touche Tab depuis le mode Edit), cliquez sur le bouton Update Selection, puis sur le bouton Export. Votre modèle egg exporté devrait maintenant avoir une texture correspondant à l'image ouverte, visualisez-le avec pview pour vous en assurer.

Note : Un truc important à savoir, à propos des images utilisées ainsi comme texture : panda3D utilise des images dont les dimensions sont des puissances de 2, et si une image a des dimensions qui ne sont pas des puissances de 2, elle doit être convertie avant d'être utilisée comme texture par panda3D, ce qui déforme l'image, et prend plus de temps. Utilisez donc des images dont les dimensions sont des puissances de 2 (par exemple 512*512, 1024*256, etc.).

2.3. UV-mapping d'une boule : Pin et Live Unwrap Transform

Notre premier exemple un peu plus avancé est la boule, on va essayer de faire une planète avec une jolie texture. Il est délicat de découper une boule de façon réaliste, et il existe plusieurs méthodes plus ou moins heureuses. Pour nos besoins, nous allons nous contenter d'un seul seam. Commencez par créer une boule (j'ai choisi l'UV-sphere par défaut, à 32 segments et 32 rings), passez en mode édition et sélectionnez un demi-cercle de vertices, comme ça :

Faites-en un seam (Ctrl+E -> Mark Seam), deux fois A pour sélectionner tous les vertices, et U pour déplier tout ça, ce qui nous donne :

Si vous vous contentiez de cette découpe, et que vous exportiez le modèle ainsi obtenu, ça donnerait quelque chose comme ça :

Comme vous voyez, on voit très bien où le modèle a été découpé, ce qui gâche un peu le réalisme. Pour arranger ça, on peut déplacer les vertex dans le cadre UV/Image Edit pour mieux caler l'image sur le modèle en 3D. Si pour le cube, il était envisageable de déplacer les vertex un par un à la main, pour notre boule, ça se complique. Heureusement, Blender permet de fixer des points (pin en VO), ce qui rend les déplacements de vertex moins hasardeux et plus réalistes (tout ça ne doit pas être clair, mais comme souvent sur ce sujet, tout s'arrange avec des images). Dans le menu UV, cliquez sur Live Unwrap Transform. Sélectionnez quatre points (j'ai pris ceux qui forment les deux axes de symétrie de notre patron), et appuyez sur P : les points sélectionnés affichent maintenant du rouge, ils sont fixés :

C'est là que ça devient rigolo : lâchez tous les points (A), et avec un click droit sélectionnez-en un (parmi les quatre que vous venez de fixer). Déplacez-le (touche G pour grab). Magique, non? Il existe d'autres options (notamment la possibilité d'aligner les points horizontalement ou verticalement, touche W), et il vous faudra un peu de pratique avant de trouver rapidement une bonne façon de découper un nouveau modèle pour lui coller une texture.

Avec un minimum de tâtonnements, on arrive déjà à quelque chose de plus réaliste. Par exemple, avec cette mise en forme dans le cadre UV/Image edit :

On obtient ce modèle :

Note : On peut (et il est même généralement recommandé) découper le patron en plusieurs morceaux (ces morceaux sont généralement appelés seam islands en VO, dans la documentation de Blender ou dans les tutoriels). Différents morceaux d'un patron peuvent se superposer pour utiliser les mêmes portions de l'image qui sert de texture (méfiez-vous : un coup de U pour unwrap dans la 3D View, et vous avez perdu toutes les modifications de placement des points dans le cadre UV/Image Edit si vos points n'étaient pas fixés, et là, Ctrl+Z est souvent votre sauveur).


3. Utilisation de normal maps

Nous allons voir ici comment créer une normal map, comment la placer sur un modèle blender, et comment exporter le tout avec Chicken. Je suppose que vous savez ce qu'est une normal map et à quoi ça sert, mais un petit rappel en images ne fait jamais de mal :

Ca a de la gueule, non?

J'ai été assez étonné de ne pas trouver un seul mot sur les normal maps dans la documentation de Chicken, parce que je trouve les normal maps super utiles, et que je trouve que la méthode pour les appliquer dans Blender et les exporter avec Chicken ne coule pas de source, n'est pas évidente, bref, ne s'invente pas. J'en dis ici tout ce que j'en sais, mais j'imagine qu'il y aurait beaucoup plus à dire, et que ce pourrait être mieux dit. N'empêche, ce qui va suivre, j'aurais aimé le trouver sur le Web plutôt que d'avoir à me le faire expliquer. J'en profite pour saluer au passage la communauté de panda3D, que vous pouvez contacter dans leurs forums ou sur IRC (serveur Freenode, canal #panda3d). Ce sont des gens vraiment extraordinaires, particulièrement patients avec les débutants les moins dégourdis (on a tous été débutant un jour, certes, mais ils sont vraiment super patients).

Bon alors c'est parti pour l'application d'une normal map. D'abord, on va faire un modèle sous Blender, voilà celui que j'ai modelé (et découpé/déplié) vite fait pour l'exemple :

Dans la fenêtre d'UV/Image Edit, lancez le UVs -> Scripts -> Save UV Face Layout, vous obtiendrez une image de notre patron (voir ci-dessous), qui nous permettra de dessiner une texture.

Là, j'ai dessiné une texture super simple et pas très jolie, en me calant sur l'export qu'on a fait juste avant.

Appliquée à notre modèle, cette texture nous donne donc pour le moment ceci :

Pour fabriquer une normal map, on va se servir de notre modèle en 3D, mais comme on va le compliquer, et qu'on aura à nouveau besoin de la version simple tout-à-l'heure, il est judicieux de sauver maintenant. Une fois que c'est fait, déformez le modèle en fonction du résultat que vous voulez obtenir (beaucoup de tâtonnement en perspective pour les débutants). Utilisez pour cela ce que vous voulez, personnellement je rajoute des niveaux de Multires, puis je déforme un peu les surfaces, à coups de Sculpt (appuyez sur N pour avoir les propriétés de cet outil et les modifier). N'oubliez pas de mettre un coup de Set Smooth à la fin pour lisser tout ça... Ici, notre modèle déformé ressemble à ça :

Maintenant, on passe à la génération de notre normal map proprement dite. Repassez sur la Scene, cliquez sur l'onglet Bake, choisissez Normals, et cliquez sur le gros bouton Bake :

Vous devriez avoir une nouvelle image de fond dans la fenêtre UV/Image Edit, et une astérisque apparaît maintenant devant le menu Image : sauvez l'image obtenue (sous un autre nom, évidemment, que celui de la texture qu'on avait avant, pour finir nous nous servirons des deux).

Vous pouvez ensuite fermer sans sauver, et rouvrir votre fichier blend, pour vous retrouver de nouveau avec le modèle simple et sa texture de base. Il nous faut maintenant appliquer la normal map à notre modèle. D'abord, appliquez lui un Material quelconque :

Ensuite, associez à ce Material deux textures images. La première est une texture image avec comme image la texture que nous avons fabriquée précédemment, la seconde est également une texture image, avec cette fois la normal map que nous avons créée. Pour les deux textures, passez de "Orco" à "UV" dans l'onglet Map Input. Dans l'onglet Map To, laissez "Col" pour la première texture, mais décliquez "Col" et cliquez "Nor" (une seule fois, "Nor" doit apparaître en blanc, pas en jaune) pour la seconde.

Cliquez aussi sur le bouton Normal Map de l'onglet Map Image pour la deuxième texture.

Il ne reste plus qu'à exporter le modèle avec Chicken. Lorsque vous le visualiserez avec pview, vous ne verrez pas immédiatement l'effet produit par la normal map, il faut pour cela activer une option d'éclairage particulière. Dans pview, appuyez successivement sur les touches P et L. Maintenant, vous devriez voir l'effet de la normal map :


accueil