====== Objets du mois : Déployer en Jeu des peluches « mobs d'Atys » ======
{{ 00-tuto-peluche.png?200 |}}
Le but de ce tutoriel est de montrer comment réaliser des peluches basées sur les modèles des animaux atysiens.
Pré-requis pour modéliser uniquement la peluche :
* Avoir installé les assets ryzom et configuré correctement les lecteurs (les outils NEL s'attendent à trouver les données des assets dans le dossier ( W:\database ).
* Avoir installé 3DSMax et configuré le plugin NEL ( Attention le plugin ne fonctionne qu'avec les version 32bits de 3DSmax et de la versions 9 à la version 2012).
* Conseillé mais non nécessaire : avoir installé l'outil NEL "//tga2dds.exe//".
Pré-requis pour déployer la peluche sur un serveur de jeu :
* Avoir compilé et installé un serveur de jeu et configuré un client pour l'utiliser
Note : il est possible de tester cette peluche IG sans disposer d'un serveur de jeu via une astuce qui sera expliquée plus loin dans ce tutoriel.
Quelques liens utiles pour ces pré-requis :
* Liens de téléchargement des assets et outils : https://ryzomcore.atlassian.net/wiki/display/RC/Downloads+for+Windows
* Configuration des lecteurs :https://ryzomcore.atlassian.net/wiki/display/RC/How+to+set+up+the+Build+Pipeline
* Installation du plugin NEL de 3dsmax :https://ryzomcore.atlassian.net/wiki/display/RC/Installing+the+Max+Plugins
===== Étape 1: choisir le modèle qui servira pour notre peluche =====
L'ensemble des modèles 3d de la faune de ryzom sont regroupés dans le dossier « W:\database\stuff\tryker\agents\monsters » par famille de créature. Dans ce tutorial nous allons utiliser le modèle du « Gubani » qui est situé dans le sous-dossier des créatures « chevalines » pour réaliser notre peluche :
W:\database\stuff\tryker\agents\monsters\cheval\h12\tr_mo_h12.max
{{ 01-tuto-peluche-dossiers-mobs.png?600 |}}
===== Étape 2 : Reprendre le modèle et se créer un dossier dédié pour travailler =====
Dans 3ds max ouvrir le fichier « W:\database\stuff\tryker\agents\monsters\cheval\h12\tr_mo_h12.max »
Nous consultons la liste des fichiers utilisés par le modèle, notamment les textures via le menu => «Fichier» => « Manage » => « Asset Tracking ». On note deux fichiers :
* Le modèle 3d : « tr_mo_h12.max »
* La texture du gubani « ju_mo_h12.png »
{{ 02-tuto-peluche-asset-tracking.png?800 |}}
Le but ici étant de déployer des peluches monstres pour les objets du mois, nous allons donc se créer un dossier dédié pour nos futures peluches et respecter les conventions de nomination de ryzom.
Nous allons donc créer un dossier « soft-toy » dans le dossier « W:\database\stuff\generique\agents\accessories ». Nous y sauvegarderons notre modèle en le renommant : ge_acc_teddy-gubani_01.max
* le premier préfixe «ge_» du nom de fichier est pour spécifier l'écosystème, ici __gé__nérique (tr : tryker, fy : fyros, etc...)
* le second préfixe du nom du fichier est pour spécifier le type de modèle ( hom : homin masculin, mo : monstre, wea weapon, etc... ), ici « acc » pour __acc__essoire.
* Enfin le nom de notre modèle « teddy-gubani » que nous suffixons par un numéro afin de pouvoir créer plusieurs variantes de peluches gubani.
Pour la texture, nous devrions aussi la copier dans « W:\database\stuff\generique\agents\_textures\accessories », mais nous allons faire plus simple. Nous allons la mettre dans le même dossier que le modèle 3d et la renommer en suivant la même convention : « ge_acc_teddy-gubani_01.png »
Cependant, le moteur de ryzom ne sait afficher que les textures au format ".tga" ou ".dds". TGA est un format brut sans compression ce qui le rend pratique pour l'édition mais moins performant en espace mémoire occupé. le format DDS est un format d'image compressée qui comme le jpep est destructeur. C'est le format utilisé en interne par ryzom pour minimiser l'espace des textures en mémoire. Avec votre éditeur préféré convertissez l'image ".png" en ".tga". C'est elle-ci que nous garderons pour l'édition. Nous allons utiliser l'outil NEL "//tga2dds//" pour générer une image texture au format ".dds" pour le modèle 3d. C'est celle que nous utiliserons dans 3dsmax
tga2dds ge_acc_teddy-gubani_01.tga
Si vous n'avez pas l'outil, vous pouvez garder la version ".tga". Elle fonctionne pour les tests IG.
Dans le dossier soft-toy vous devriez avoir comme résultat :
{{ 03-tuto-peluche-dossier-soft-toy.png?600 |}}
===== Étape 3 : Nettoyer le modèle 3D sous 3dsmax =====
Le modèle 3D du monstre contient un squelette et toutes ce qu'il faut pour l'animer. Cela n'est pas nécessaire pour un accessoire peluche et surchargerait inutilement le modèle ryzom final. Nous allons dons les supprimer.
{{ 04-tuto-peluche-animation.png?800 |}}
Sélectionner le modèle "Gubani" avec la souris. Dans le panneau latéral droit, sélectionner l'onglet "//modify//". Vous devez voir apparaître le mesh dénommé "TR_MO_H12" et dans la pile des "//modifiers//" celui nommé "physique". Nous allons le supprimer
{{ 05-tuto-peluche-physique.png?600 |}}
Ensuite nous allons ouvrir l'écran affichant les éléments de la scene via le menu "Tools"=> "New Scene Explorer" et supprimer tous les éléments constituant le squelette du modèle pour ne garder au final que le mesh de l'animal.
{{ 06-tuto-peluche-bones-01.png?800 |}}
Au final nous n'avons plus qu'un seul élément dans notre "scène" : le mesh du gubani "TR_MO_H12" :
{{ 07-tuto-peluche-nettoyer-modele.png?800 |}}
Dans le panneau latéral droit, nous allons renommer ce mesh en "ge_acc_tedy-gubani_01". C'est ce nom qui sera utilisé par l'export "NEL" pour nommer le fichier "shape" généré lors de l'export.
{{ 07-tuto-peluche-nettoyer-modele-fin.png?800 |}}
===== Étape 4 : Modifier le mapping des textures du modèle =====
Dans cette partie, nous allons revoir la texturation du modèle 3d. A priori, il faudrait juste changer la texture de base «ju_mo_h12.png» pour pointer sur la notre «ge_acc_teddy-gubani_01.dds» (ou «.tga» à défaut) puis l'adapter comme nous le voulons visuellement. Cependant, cela va être un peu plus compliqué :
Nous allons d'abord ouvrir l'écran "Material Editor" (1), puis sélectionner le seul matériel de la scène (2) en double cliquant dessus. Dans l'écran centrale sélectionnez le noeud dénommé "Map #1 Nel Multi Bitmap" en double cliquant dessus (3). Vous verrez alors s'afficher dans le panneau latéral de droite le détail de ses propriétés (4). Le "Nel Multi Bitmap" permet de définir 8 images différentes. Il ne s'agit pas de multi-texturing, mais de la possibilité de configurer plusieurs images de texture. Seule une est appliqué à un instant donné sur le modèle. Cela est utilisé pour les mobs pour spécifier une texture par écosystème et par certains objets environnementaux pour spécifier une texture différente par saison.
{{ 08-tuto-peluche-texture.png?800 |}}
Le slot ID 1 est utilisé pour les textures de l'écosystème tryker, le second (ID 2) pour l'écosystème fyros, le troisième (ID 3) pour l'écosystème zoraï et le quatrième (ID 4) pour l'écosystème des primes racines. Ne cherchez pas de slot matis, en bon esthètes, ils ont compris que la beauté résidait dans la nature zoraï et utilisent donc les textures zoraï pour tous leurs animaux. Notez qu'ici le gubani n'étant présent qu'en jungle et en primes racines, seuls les slots 3 et 4 sont utilisés
Le même système est aussi utilisé pour d'autres objets IG, comme les bâtiments.dans ce cas, les 4 slots correspondent aux quatre saisons. C'est ainsi que l'on peut noter la présence de neige sur certaines bâtisses zoraï en hiver.
{{ 09-tuto-peluche-multi-texture.png |}}
De notre coté nous n'allons pas utilisé ce mécanisme. Nous allons donc supprimé le "NEL Multi Bitmap" et le remplacer par un simple "Bitmap" en tirant avec la souris sur la sortie de la "//tTexture 1//" comme le montre l'image ci-dessus. En relâchant la souris, un menu contextuel apparait (2), sélectionner l'entrée "Bitmap" :
{{ 10-tuto-peluche-bitmap.png?800 |}}
Puis aller chercher notre image dans "W:\database\stuff\generique\agents\_textures\accessories\soft-toy\ge_acc_teddy-gubani_01.dds" (ou ".tga").
{{ 11-tuto-peluche-bitmap.png?800 |}}
Répéter l'opération pour l'autre "Nel Multi Bitmap" qui référence la même image.
===== Étape 5 : Mise à échelle du modèle =====
Note modèle 3d est presque prêt à l'emploi. Cependant sa taille ne correspond pas à celle attendue d'une peluche. Si vous utilisez l'outil de mesure de 3dsmax vous verrez que le gubani mesure plus 2m de haut. Le plus simple pour le mettre à la bonne taille est de charger un modèle d'homin afin d'avoir un comparatif visuel et s'assurer que la peluche peut être prise en main.
On va donc insérer temporairement dans notre scène 3dsmax une référence vers un autre modèle 3d en passant par le menu Fichier (1) => References (2) => Xref Scène (3) et en cliquant sur le bouton Add (4) de la fenêtre qui apparait :
{{ 15-tuto-peluche-xref.png?800 |}}
Sélectionner alors le modèle d'homin "W:\database\stuff\generique\agents\actors\male\ge_hom_armor02.max" qui devrait apparaître dans votre scène 3d.
{{ 15-tuto-peluche-xref-02.png |}}
Mettre a échelle le modèle de gubani et le déplacer via les outils "Scale" et "Move" du menu contextuel apparaissant lorsqu'on clique sur le modèle avec le bouton droit de la souris.
{{ 16-tuto-peluche-echelle.png |}}
Une fois la peluche à la bonne échelle, il ne reste plus qu'a supprimer la référence au modèle d'homin en repassant par le menu Fichier => References => Xref Scene.
Repositionner le modèle gubani à l'origine de la scène (x=0, y=0, z=0), car lorsqu'un objet est porté la position (0,0,0) se place au niveau de la main.
===== Étape 6 : modifier la texture pour un rendu peluche =====
Au niveau de la texture, pour donner un effet peluche, laissez libre court à votre imagination
{{ 17-tuto-peluche-texture-source.png |}}
Ici j'ai édité l'image "ge_acc_teddy-gubani_01.tga" dans l'outil Gimp. J'ai utilisé le filtre "Artistiques > GIMPressioniste" en utilisant le modèle "canvas" pour obtenir un effet trame de tissu.
{{ 17-tuto-peluche-texture-peluche.png |}}
Une fois l'image sauvegardée, j'ai re-généré la texture au format ".dds" via la commande :
tga2dds ge_acc_teddy-gubani_01.tga
Voila le résultat obtenu sur le modèle 3d dans 3dsmax :
{{ 18-tuto-peluche-modele3d.png |}}
===== Étape 7 : Export du shape =====
Il est temps de tester cette peluche en jeu. Pour cela il va falloir exporter le modèle en générant le fichier "shape" utilisé par le moteur Ryzom
Si ce n'est pas déjà je cas, ajouter le bouton //d'export NEL// au panneau latéral droit en cliquant sur l'onglet "//utilities//", puis "//More//" et en sélectionnant l'option "//NEL Export//" :
{{ 20-tuto-peluche-export-nel-01.png |}}
Ensuite sélectionner le mesh du gubani puis cliquer sur le bouton "Export Model". Il vous faut alors spécifier le dossier où sera crée le fichier "ge_acc_teddy-gubani-01.shape"
{{ 20-tuto-peluche-export-nel-02.png |}}
===== Étape 8 : Tester la peluche IG =====
Pour bien faire les choses, il faudrait ajouter le //datasheet// de la peluche au serveur de jeu et patcher le client. Cette méthode sera détaillée plus loin. Cependant il existe une solution de contournement si vous n'avez pas votre propre serveur de jeu pour réaliser ces opérations.
Il faut savoir qu'une peluche n'est rien d'autre qu'une arme équipée. Ainsi nous pourrions remplacer le modèle de la dague par celui de notre gubani pour le tester sur le serveur officiel. Il existe une astuce simple pour cela. Le client de jeu recherche les modèles et textures dans le dossier "user" avant d'aller voir le dossier "data". Il suffit de copier notre fichier shape et la texture associée dans le dossier "user", puis de renommer le shape du gubani en celui de la dague : "GE_Wea_Dague.shape"
A présent lorsque vous équiperez une dague IG, vous aurez en main notre peluche "gubani".
Pour retrouver la dague d'origine, il suffit de supprimer le fichier shape du dossier "user" :
{{ 21-gubani-peluche-axe.png?400 |}}
En réalisant ce test vous pouvez noter une anomalie : la peluche est tenue par le pied, ce qui n'est pas forcément ce que nous voulons
===== Étape 9 : orientation et positionnement d'un objet porté =====
Le point de fixation d'un objet tenu en main correspond au point de coordonnée (0,0,0) de l'objet.Son orientation suit la règle suivante :
l'axe X remonte le long de l'avant-bras ;
l'axe Y part depuis le dos de la main vers l'extérieur ;
l'axe Z pointe vers le haut de l'objet tenu fermement en main.
Nous réorientons la peluche gubani dans 3dsmax comme le montre l'image suivante : l'axe X sort du dos du gubani pour remonter le long du bras qui le portera. L'axe Z sort de la main et est donc dans le prolongement de la tête de la peluche :
{{ 22-gubani-peluche-axe-3dsmax.png |}}
Après réorientation du modèle gubani et réexportation du shape nous obtenons enfin une peluche qui est tenue par le tronc :
{{ 22-gubani-peluche-axe.png?400 |}}
Pour aller plus loin sur les objets portés, je vous conseille de lire [[creation_d_un_objet_prehensible_en_jeu|ce tutorial]].
===== Étape 10 : Créer l’icône pour l'inventaire et la barre d'actions =====
Il faut créer un icône pour l'affichage de l'item peluche gubani dans l'inventaire et dans la barre d'actions.
Cet au icône au format tga doit faire 40x40 pixels avec un fond transparent. Nous le nommerons "icon_teddygubani.tga"
L'icône de 40x40 pixels :
{{ 23-icone-gubani.png?80 |}}
Pour des questions de performance, ces icônes ne sont pas stockés individuellement mais regroupés dans une seule image dénommée : "texture_interfaces_v3.tga". Le fichier texte associé dénommé "texture_interfaces_v3.txt" liste les icones présents et leur position dans l'image :
{{23-icone-gubani-contexte-txt.png |}}
le fichier texte utilise le format suivant pour chaque ligne :
NomFichierIcone u1 v1 u2 v2
Avec :
* u1,v1 la position du point supérieur gauche de l'icône
* u2,v2 la position du coin inférieur droit de l'icône
A la différence des coordonnées en pixels, ces coordonnées qui utilisent la technique du UV Mapping en 3d ont leurs valeurs dans l’intervalle [0 .. 1]. la coordonnée (0,0) correspond au point supérieur gauche de l'image et (1,1) au point inférieur droit de l'image.
Le passage d'un système à l'autre est simple. Soit (x1,y1) la position en pixels du coin haut gauche de notre icône dans l'image globale et (x2,y2) la position du point inférieur droit de l'icône dans l'image, alors :
* u1 = x1 / largeur-image
* v1 = y1 / hauteur-image
* u2 = x2 / largeur-image
* v2 = y2 / hauteur-image
Sachant que la texture "texture_interfaces_v3.tga" fait 1024x1024 pixel, et que dans l'exemple l'icône "icon_teddygubani.tga" se situe à la position (x1=118,y1=798), que le point inférieur gauche étant à la position (x2=157,y2=837), le fichier txt contient donc la ligne :
icon_teddygubani.tga 0.115234375 0.779296875 0.1533203125 0.8173828125
Même si cela peut être ajouté à la main, la bonne méthode et d'utiliser l'outil dédié de NEL //build_interface// comme indiqué dans [[creer_icone_objet|ce tutorial]], qui recrée la texture globale et le fichier txt à partir d'un dossier contenant tous les icones.
Note: L'ajout de l'icône ne suffit pas, il faut également créer le datasheet de l'objet peluche et spécifier dedans le nom de notre icône à utiliser comme nous le verrons plus loin dans ce tutorial. Au final nous obtenons le résultat suivant IG :
{{23-icone-gubani-contexte.png |}}
===== Etape 11 : créer le fichiers des noms =====
A compléter.
{{30-tuto-peluche-txtfile.png |}}
===== Étape 12 : créer le datasheet =====
A la base, une peluche reste est un objet porté comme une arme. De fait le datasheet de la peluche est trs semblable à celui d'une arme une main, comme l'exemple de la dague ci-dessous.
__icrm1pd.sitem ( datasheet de la dague du réfugié ) :__
Ce qui change c'est :
* la référénce au shape dans la section "3d"
* la référence à l'icone utilisé dans la barre d'état et l'inventaire dans la section "3d"
* les caractéristiques de base qui diffèrent d'une arme : pas de niveau requis, pas de brique de plan, etc..
Voila donc le datasheet de la peluche gubani que nous nommerons "teddygubani.sitem" :
===== Étape 13 : Déployer la peluche sur le serveur et le client de jeu =====
Afin de déployer la peluche en jeu la méthode officielle consiste à utiliser la pipeline "build_gamedata" (cf. https://ryzomcore.atlassian.net/wiki/display/RC/Gamedata+Build+Pipeline). Je vais vous proposer une méthode différente, où les opérations seront effectués à la mains, mais uniquement celles nécessaires à notre peluche :
Nous avons besoin des fichiers suivants :
* teddygubani.sitem ( le datasheet de la peluche gunabi )
* ge_acc_teddy-gubani_01.shape ( le modèle 3d NEL de la peluche )
* ge_acc_teddy-gubani_01.dds ( la texture du modèle 3d )
De plus le déploiement de cette peluche va impacter les fichiers suivants :
* les fichiers "*.packed_sheets" utilisée par le serveur et le client qui sont une version compilé des datasheets
* le fichier "sheet_id.bin" qui est un index de tous les datasheets utilisés par le jeu
* le fichier "visual_slot.tab" qui liste les éléments affichables coté client
Pour bien faire les choses, nous allons également créer un fichier "soft-toy.bnp" qui contiendra les shapes et les textures de toutes les futures peluches.
Pour la suite des opérations nous partons du principe que notre serveur de jeu fonctionne sous linux, et que les variables d'envrionnement suivantes sont définies :
* LEVELDESIGNPATH pointe sur le dossier des datas du level design
* RYZOM_HOME sur l'installation des sources du serveur
==== Ajout du datasheet "teddygubani.sitem au serveur ====
Coté serveur nous allons créer un dossier dédié pour les datasheets des peluches et y placer celui du gubani :
$ mkdir $LEVELDESIGNPATH\leveldesign\game_element\sitem\soft-toy
$ cp teddygubani.sitem $LEVELDESIGNPATH\leveldesign\game_element\sitem\soft-toy
==== Nettoyages préalables ====
==== Re-générer le fichier "sheet_id.bin" ====
La première étape consiste à regénérer le fichier d'index des datasheet via la commande "make_sheet_id". Il reprend le fichier d'index existant et va le compléter avec les datasheets du dossier $RYZOM_LEVELPATH/leveldesign/game_element/sitem/soft-toy c'est-à-dire les datasheets de nos peluches
$ make_sheet_id -o$LEVELDESIGNPATH/leveldesign/Game_elem/sheet_id.bin $LEVELDESIGNPATH/leveldesign/game_element/sitem/soft-toy
==== Re-générer les "*.packed_sheets" et "visual_slot.tab" ====
Il faut regénérer les "*.packed_sheets".Ce sont les versions pré-compilées des datasheets :
$ sheets_packer
Cette commande va également re-générer le fichier visual_slot.tab
==== Copier les fichiers nécessaires coté client ====
* Nous copions le fichier "visual_slot.tab" généré dans le dossier courant dans le dossier "user" du client de jeu
* Nous copions le fichier $LEVELDESIGNPATH/leveldesign/Game_elem/sheet_id.bin dans le dossier "user" du client de jeu
* Nous remplaçons les fichiers packet_sheets du dossier "data" du client par ceux générés ici $RYZOM_HOME/code/ryzom/client/data/*.packed_sheets par la commande //sheets_packer//
==== Créer un bnp pour le modèle de la peluche ====
Pour finir il faut copier le shape et la texture de la peluche dans le dossier "data" du client.
Cependant pour bien faire les choses, autant créer un fichier ".bnp" dédié.
Un fichier ".bnp" est une sorte de zip regroupant les différents fichiers shape, dds, txt, ou autres par thème.
Créer on dossier "soft-toy", copions y tous les shapes et textures de nos peluche, à savoir pour le moment "ge_acc_teddy-gubani_01.shape" et "ge_acc_teddy-gubani_01.dds" et créons un fichier BNP pour les contenur
bnp_make /p soft-toy
La commande va créer un fichier "soft-toy,bnp" qui contiendra nos deux fichiers. A présent il faut le copier dans le dossier "data" du client.
==== Tester IG ====
Relancer le serveur avec la commande //shard start// puis connectez vous avec votre client.
Si tout c'est bien déroulé, en lançant votre client de jeu, vous pouvez créer une peluche dans votre inventaire avec la commande :
/a createItemInBag teddygubani 1 5
{{tag>Tag_a_ajouter client_rc_obsolete}}