Tutoriel en profondeur sur les collisions de divers types

 
 
Dans Skyrim, tous les décors sont composés d'objets utilisants divers types de collision. Il y a les objets mobiles qu'on peut porter, pousser, jeter. Il y a les objets fixes qui sont placés dans la carte et qu'on ne peut pas déplacer et il y a aussi les éléments de cloisons qui divisent le monde en zone comme les murs parois etc...
En effet dans Skyrim, l'éditeur ne crée pas les éléments du décor, il peut seulement mettre en place des éléments préfabriqués et leur attribuer certaines propriétés.
 
C'est pourquoi, si on désire créer un environnement complètement différent de celui du jeu, il faudra en créer les éléments de base avec un programme comme Blender ou 3DSMax et en configurer la collision.
 
Le problème c'est que Bethesda ne fournit pas de documentation sur ce genre de chose, leur vision de l'édition se limite à utiliser les éléments existant, ils ne fournissent pas de support pour la création de nouveaux.
Heureusement le moteur du jeu est ancien et a servi pour de nombreux jeux depuis des années, ce qui a permi à des amateurs éclairés de comprendre en grande partie comment ça fonctionne. L'équipe de NifTools et NifSkope a beaucoup travaillé sur ce problème et leurs plugins d'exportation ainsi que NifSkope permettent de créer de tels modèles 3D avec un système de collision qui fonctionne.
 
Une autre difficulté, c'est que ces collisions ne sont pas toutes identiques, selon le type d'objet et d'utilisation il y a des différences.
 
Le système de collision est géré par le moteur physique Havok et tout ce qui s'y attache a une dénomination particulière reconnaissable, les élement qui le composent commence par bhk....
 
Lors de la création d'un modèle d'armure et de sa partie World Model on a du créer un objet doté de collision et on a remarqué que le fichier NIF était composé d'un FadeNode.
 
Dans ce FadeNode, il y a le modèle géométrique de l'objet et un autre bloc appelé bhkCollisionObject. C'est cet objet qui gère la collision, il est lui même composé d'autres objets.
 
Dans l'exemple du World Model de l'armure, on a eu une structure faisant appel à un autre objet 3D de type Convex verts, mais ce n'est pas le seul moyen de calculer une collision. On peut aussi utiliser le système Mopps surtout pour les objets statiques, ou encore des Primitive.
 
Voyons le choix du système en fonction des objets:
 
 
Tout d'abord voyons les divers types d'objets qu'utilise le jeu:
 
Les Statics : pour l'architecture, les donjons, constructions, rochers. Une grande partie du jeu est constitué par ces objets et il faut qu'ils soient performants, car on va marcher dessus se cogner contre etc...
 
Les AnimStatics : les objets animés qui sont les portes, parois, ascenseurs, projectiles, tout ce qui doit être animé.
 
Les Debris : tous les objets de décoration avec interaction comme les modèle world des armes et des armure, des objets divers.
 
 
Voyons maintenant les type de collision :
 
Primitives : bhkBoxShape, bhkCapsuleShape, bhkSphereShape qui sont comme on le comprend des formes simple ou primitives.
 
Convex Verts : bhkConvexVerticesShape, qui sont des modèles 3D simplifiés convexes liés au modèle principal.
 
Mopps : bhkMoppBvTreeShape, qui sont des triangles calculés à partir de l'objet et exportés avec lui.
 
 
Voyons les utilisations pour chaque cas :
 
Pour les objets de type Statics on va utiliser de préférence des Mopps mais aussi des Primitives moins performantes
 
Pour les objets de type AnimStatics on va utiliser des Primitives ou des Convex Verts moins performantes
 
Pour des objets de type Debris on va utiliser des Primitives ou des Convex Verts moins performantes
 
 
 
 
 
On comprend que lorsqu'il faut calculer des collisions, ça peut couter pas mal de temps de calcul au moteur Physique, si l'objet est très complex, c'est pourquoi on va simplifier au maximum la forme. Si la forme elle même est proche d'une forme basique comme un cube ou une sphere on aura avantage à la représenter par cette forme primitive simple.
Mais si la forme ne peut pas être représentée par une primitive simple sans que la collision soit peu réaliste (interpénétration des objets), on va utiliser un objet plus complexe. On va réaliser une forme qui englobe au mieux la forme générale de notre objet sans en représenter les détails, c'est un objet de type Convert Verts. C'est assez simple à comprendre, on enveloppe notre objet d'une boite approximative avec un minimum de sommets.
Pour les objets statique de décor on va utiliser un système plus précis, les Mopps. C'est un objet formé de triangles calculés à partir de la forme géométrique de base qui sera optimisé, mais qui rendra la forme avec plus de précision au prix d'un cout en performance. C'est pour ça qu'on ne l'utilise que pour des objets statiques, les objets animés ou mobiles demanderaient trop de calculs et ne seraient pas performants.
La performance c'est capital dans un moteur physique, si le calcul des interactions de collision prend trop de temps le jeu va devenir très saccadé. Pour éviter ça on ne va pas faire les calculs physiques à chaque image, mais avec un cadence plus faible. Mais alors on risque de gros bugs du moteur physique car certains objets vont s'interpénétrer pendant le temps entre deux calculs et le résultat peut être un objet qui traverse un mur, un joueur qui passe à travers le plancher ou encore des objets qui rebondissent comme des dingues.
Ceux qui ont joué à Fallout 3 se souviennent certainement des sorpions ou des robots qui partent comme des boulets de canon à travers toute la carte. Dans Skyrim, c'est moins fréquent, mais j'ai déjà assisté à des mammouths ou d'autres animaux projetés en l'air, ou encore le coup de masse des géants qui t'envoie sur la lune!
Dans Skyrim si on a une machine très performante et qu'on dépasse les 60 FPS, on a un autre bug, celui des objets qui partent dans tous les sens lorsqu'on entre dans une pièce et que le moteur physique entre en fonction pour les objets présents.
Ces problèmes physiques sont donc causés par des problèmes de synchronisation entre le moteur physique et le moteur du jeu général, d'où l'intérêt d'optimiser au mieux le calcul des objets physiques.
 
 
Collision de type Primitives:
 
Les collisions de type primitive sont utilisées pour les armes principalement parce qu'elles utilisent des formes très simple elle sont donc très rapide à calculer.
 
Par contre c'est un peu plus délicat à mettre en oeuvre dans Blender car comme pour les Convex Verts, il faut réduire l'échelle du modèle de collision par un facteur 10 mais en maintenant toutes les primitives dans leur positions respectives.
Si on a un objet qui nécessite plusieurs primitives, comme la hache d'arme que j'ai choisi pour le tutoriel, il faudra mettre à l'échelle 1/10 ces primitives en gardant le même centre pour l'ensemble des éléments.
Pour le faire il faudra joindre ces primitive en un seul objet, définir le centre de cet objet au centre du modèle, le rétrécir par un facteur 10, puis séparer cet objet en plusieurs objets indépendants avant de les transformer en primitives de collision.
 
Pour le tutoriel j'ai importé une hache d'arme en acier avec ses primitives de collision comme élément de comparaison. Une telle importation n'est pas très aisée car de nombreux éléments du nif sont incompatibles avec le plugin d'importation. Même si on change le header du fichier, qu'on supprime les shaders, il y a encore souvent des messages d'erreur car les matériaux de Skyrim de sont pas tous traduits en texte par NifSkope. En effet NifSkope semble incapable de lire les nombres supérieurs à 2 et quelques millions et comme les numéros d'identification des matériaux de Skyrim sont pour la plupart au delà de cette limite, NifSkope les laisse tels quels.
On a donc pas toujours des matériaux nommés SKY_HAV_MAT_MATERIAL_SOLID_METAL par exemple, mais un simple numéro comme 3969592277 et pour le plugin d'importation ce n'est pas une identification de materiau valide.
Il faudra donc remplacer ces chiffres par un autre matériau de la liste de NifSkope.
Pour indication voilà la liste des matériaux non reconnus par NifsKope, ça peut vous servir pour en choisir un qui conviendra. Il faudra simplement mettre le chiffre correspondant dans NifSkope car dans le fichier NIF, ce sont des nombres et pas du texte qui définissent un matériau, ces noms sont utilisés par NifSkope pour pouvoir mieux identifier le matériau désiré.
Après teste, il semble qu'on ne peut pas mettre ces nombres supérieurs à 2020000000 dans NifSkope, le programme refuse de les écrire parce qu'il comporte une limitation de taille pour les nombres entiers. La seule solution c'est d'attendre une nouvelle version de NifSkope qui probablement corrigera ce problème.
Si vous devez impérativement utiliser un tel matériau, il faudra faire du copier / coller dans un fichier originel qui utilise déjà ce matériau.
 
"2229413539" name="SKY_HAV_MAT_HEAVY_METAL"
"2617944780" name="SKY_HAV_MAT_MATERIAL_BLADE_1HAND_SMALL"
"2974920155" name="SKY_HAV_MAT_ORGANIC"
"3070783559" name="SKY_HAV_MAT_HEAVY_WOOD"
"3725505938" name="SKY_HAV_MAT_MATERIALARROW"
"3741512247" name="SKY_HAV_MAT_STONE"
"3839073443" name="SKY_HAV_MAT_CLOTH"
"3969592277" name="SKY_HAV_MAT_MATERIAL_BLUNT_2HAND"
 
 
 
 
Mise en place des primitives de collision pour le modèle dans Blender :
 
 
Une fois le modèle 3D de notre arme terminé, avant d'exporter on va lui créer un ensemble de primitives (bes boites) pour le système de collision.
On utilise des boites parce que ça permet un calcul rapide durant le jeu et que c'est suffisant pour des objets simples.
On va donc placer des boites rectangulaires qui vont recouvrir le modèle. Les boites ne doivent pas être liées en une seule mesh pour la collision, mais comme nous devons redimentionner le modèle de collision à une échelle 10 fois plus petite, mieux vaut joindre ces boites en une seule mesh.
 
Avant de redimentionner, il faut placer le centre de cette mesh exactement au centre du modèle. On fait CTRL +A pour remettre Transform Properties à zéro, puis on définit l'échelle à 0.1
 
Une fois qu'on a notre mesh prête, il faut la divier en objets indépendants, on sélectionne les sommets en edit mode et on presse sur (P). Il faut encore replacer les centres de chaque objet à leurs positions initiales ( bouton Center New ).
 
On peut alors définir les propriétés de collision pour ces ces boites.
 
On va d'abord définir le mode de visualisation des boites dans Object ( F7 ) on va définir Bounds et Wire. Puis on va définir le type de collision dans Logic ( F4 ).
On choisi Bounds pour lier l'objet et on choisi Box (boite) comme type de mesh de collision. On peut définir l'objet en tant que Rigid Body pour pouvoir mesurer le Radius (rayon) de chaque élément. En fait cette donnée ne sera pas exporté, mais il faudra la noter et la définir dans NifSkope en lui faisant subir une échelle de 1/10 à cause du fait que dans Blender l'échelle est 10 fois plus grande que dans le jeu.
Cette valeur de radius est assez importante car elle définit la distance de contact, si elle est trop grande, l'objet va flotter un peu au-dessus du sol, si elle st trop petite, il va s'enfoncer partiellement dans le sol.
Les valeurs que j'ai choisi proviennent des boites de la hache d'arme d'acier d'origine qui ma servi d'exemple ici. Je les ai lues dans NifSkope et je les ai reportées ici avec une échelle de 10 pour voir ce que ça représentait.
Ca nous aide à choisir cette valeur, mais il faudra peut-être retoucher avec NifSkope après test dans le jeu.
 
On peut maintenant exporter le modèle et ses boites de collision :
 
 
On sélectionne le tout et on ouvre le plugin d'exportation de modèles nif.
Comme réglages on va faire les suivants:
On choisi Weapon (arme) et Metal, mais en fait ce n'est pas vraiment nécessaire, on reconfigurera ça avec NifSkope.
Mais si on a plusieurs boites, il faut choisir Use bhkListShape pour réunir ces boite en une liste, sinon la collision risque de ne pas se faire correctement.
 
On a maintenant un fichier NIF au format Fallout 3 qu'il faut convertir au format Skyrim.
 
Conversion du fichier NIF au format Skyrim:
 
Pour le faire, on va utiliser la méthode du copier coller avec l'aide d'un fichier nif équivalent du jeu originel pour garantir la compatibilité.
En effet essayer de convertir le fichier nif qu'on a créé est long et difficile, mieux vaut copier certaine partie de notre fichier dans un fichier valide du même type.
 
On ouvre donc deux instance de NifSkope avec par exemple le fichier nif de la hache d'arme d'acier dans l'un et notre fichier exporté dans l'autre.
 
Avant de procéder il faut faire une première conversion de notre fichier nif en modifiant son Header, on change User Version : 11->12 et User Version 2 : 34->83. Ensuite on sauvegarde, on ferme le fichier et on l'ouvre à nouveau.
 
On va commencer par copier la partie modèle 3D, notre NitriShape, dans le fichier provenant du jeu originel.
On copie le bloc NitriShape ( CTRL+C )
On le colle dans 0 BSFadeNode ( CTRL+V )
Il va se rajouter à celui qui est déjà présent et qu'on va supprimer, mais avant de le supprimer on va récupérer son shader BSLightingShaderProperty et le coller dans 0 BSFadeNode.
On le réadresse à notre NitriShape selon la méthode habituelle de remplacement des numéros de bloc.
 
On peut maintenant copier les données du bloc de collision:
 
On va prendre le bloc bhkLisShape de notre fichier nif ( CTRL+C ) et on va le coller dans 0 BSFadeNode.
On va le réadresser ensuite à bhkRigidBody selon la méthode habituelle de remplacement des numéros de bloc.
 
Il faut encore définir les radius comme mesuré dans Blender en divisant par 10 dans chaque bhkBoxShape. J'ai remarqué que la valeur Unknown Float 1 de bhkConvexTransformShape avait la même valeur, mieux vaut y définir ce radius là aussi.
Il faut encore définir le materiau qui convient sinon dans le jeu on risque de ne pas avoir l'effet sonore voulu. Il faut utiliser les materiaux du Type SKY_HAV_MAT..... spécifiques à Skyrim, mais comme je l'ai dit plus haut si on met la valeur en texte ça ne marchera pas pour ceux qui ne sont pas dans la liste que NifSkope propose, il faut mettre la valeur en chiffre selon la liste que j'ai donné un peu plus haut. Par exemple la hache d'arme d'acier utilise 3969592277 qui correspond à SKY_HAV_MAT_MATERIAL_BLUNT_2HAND.
 
Le fichier nif qu'on a créé de cette manière contient l'arme et sa collision, mais il faut encore quelques objets pour avoir les effets de sang sur l'arme et finalement importer l'arme dans le Creation Kit.
Cette seconde partie va être abordée dans un autre tutoriel indépendant : Finalisation et importation d'une arme dans le CK.
 
Collision de type Convex verts:
 
On va lier l'objet à un autre objet 3D simplifié qui représentera sa forme et rendra le calcul du moteur physique plus simple et rapide.
 
1 BSInvMarker : nécessaire pour que l'objet puisse être pris dans l'inventaire
2 BSXFlags : flags généraux
 
5 bhkCollisionObject : objet utilisé pour la collision
4 bhkRigidBody : définit un objet rigide soumi aux forces physiques
3 bhkConvexVerticesShape : objet géométrique convexe simplifié pris en compte pour le calcul physique des collisions
 
6 NitriShape : Objet géométrique lié à l'objet de collision à travers le 0 BSFadeNode
7 NitriShapeData : données géométriques
8 BSLightingShaderProperty : shader
9 BSShaderTextureSet : set de textures
10 NiAlphaProperty : transparence
 
1 BSInvMarker : ce sont les données pour l'affichage dans l'inventaire. La valeur 4712 définit l'orientation de départ dans l'inventaire, ça varie suivant le positionnement de l'objet dans Blender ou 3DSMax avant l'exportation, on trouve aussi souvent la valeur 1570. Si dans l'inventairte l'objet est cul par dessus tête il faudra mettre l'un ou l'autre. La valeur zoom permet de rendre de petits objets plus grand et mieux visibles dans l'inventaire.
 
5 bhkCollisionObject :
4 bhkRigidBody : Il y a beaucoup d'inconnues dans ces paramètres, mais certains peuvent être déchiffrés. OblivionLayer, c'est la couche de visibilité de l'éditeur, ça permet de classer les objets dans l'éditeur OL_CLUTTER c'est l'ensembles des objets de décor. Il y a un autre paramètre qu'on peut définir, c'est Mass : le poids de l'objet. Il y a aussi tous les effets de réaction du moteur physiaque Havok, mais mieux vaut ne pas trop y toucher si on n'est pas sur de ce qu'on fait. Un autre paramètre c'est le type de mouvement : Motion System, MO_SYS_SPHERE_INERTIA, il y a divers types selon les besoins on peut en avoir un aperçu en mettant le curseur sur MotionSystem dans NifSkope.
 
3 bhkConvexVerticesShape : c'est l'objet 3D simplifié pour calculer la collision, sa taille n'est pas forcément la même que celle de l'objet, le moteur Havok recalcule la taille d'après la géométrie du modèle de façon a avoir moins de problèmes d'interpénétration sur des objet complexes. C'est dans cette partie qu'on va définir le matériau qui compose l'objet, ce qui va influencer sur les sons et réaction diverses. La forme de cet objet va influence le comportement de l'objet, si le fond est cônique, l'objet sera instable et aura tendance à se balancer, si il est plat, il sera plus stable. La forme va conditionner sa faciliter se retourner et à se stabiliser sur une face.
 
 
 
 
Collision de type Mopps :
 
 
Ce type de collision est réservé aux objets statique comme l'architecture, le terrain, les roches, les donjons etc...
 
Dans l'éditeur de modèle, Blender ou 3DSMax, on va générer un objet de collision composé de triangles.
On verra un peu plus loin comment générer un tel objet avec Blender.
 
Voyons un exemple de collision Mopps, l'enclume de forgeron:
 
0 BSFadeNode
1 BSXFlags
 
6 bhkCollisionObject : objet pour la collision
5 bhkRigidBodyT : objet rigide soumis aux forces physiques, le suffixe T est pour translation et rotation
4 bhkMoppBvTreeShape : l'objet Mopps
3 bhkCompressedMeshShape: l'objet géométrique en triangles utilisé pour la collision
2 bhkCompressedMeshShapeData : les données géométriques de l'objet
 
7 NitriShape
8 NitriShapeData
9 BSLightingShaderProperty
10 BSShaderTextureSet
 
 
 
6 bhkCollisionObject
5 bhkRigidBodyT : on y trouve la couche pour l'éditeur, OL_STATIC. La masse qui est 0, c'est important! sinon il parait qu'on peut passer à travers. Le Motion System qui est du type MO_SYS_BOX_STABILIZED
 
4 bhkMoppBvTreeShape : on y trouve le matériau Havok qu'on peut configurer.
 
3 bhkCompressedMeshShape : c'est le sous groupe du Mopps utilisé, une forme compressée.
 
2 bhkCompressedMeshShapeData: les données géométrique compressées des triangles du Mopps
 
 
 
Créer des objets de collision du type Convex verts :
 
 
On va commencer par ce type d'objet, car on va l'utiliser le plus souvent pour les objets tels qu'armes, armures, boucliers et les objets interactifs du jeu.
 
Première partie: création de l'objet convexe dans Blender:
 
Pour ce tutoriel j'ai utilisé un modèle de bouclier d'acier du jeu originel que j'ai importé, de façon à pouvoir facilement comparer le comportement de mon modèle avec mon enveloppe de collision avec celui du jeu d'origine.
Une fois qu'on a terminé notre modèle dans Blender, avant d'exporter au format NIF, on va ajouter à la scène un objet de collision convexe.
 
Pour le faire, c'est facile, on commence par dupliquer en object mode notre modèle.
 
On sélectionne ce modèle dupliqué, on le met dans une nouvelle couche pour mieux visualiser ce qu'on fait et on passe en edit mode. On sélectionne tous les sommets, puis on va dans le menu Mesh et on choisi Scripts tout en haut, dans la liste on va choisir le script Hull avec l'option Convex. Attention si votre modèle a un grand nombre de sommets le script peut planter. Dans ce cas, il faudra appliquer un modificateur Decimate pour optimiser le modèle et diminuer le nombre de sommets. Si vous avez un message d'erreur lorsque vous voulez appliquer décimate, il faut d'abord appliquer un modificateur Edge split avecune valeur de 90.00 degrés pour corriger le modèle. On peut simplifier le modèle énormément vu qu'on va ne faire qu'une enveloppe générale qui n'a pas besoin de détails. On peut aussi créer une sorte de boite qui englobe le modèle et ensuite lui appliquer le script au lieu du modèle lui-même.
 
On laisse la Precision à 0.1 et on clique sur OK.
On va obtenir une enveloppe pour notre modèle, on peut maintenant supprimer le modèle dupliqué en object mode.
 
Lorsqu'on observe le résultat, on remarque que c'est bien une mesh convexe, c'est à dire qu'elle n'a pas de forme en 'creux'. Ceci a une conséquence, c'est que si votre modèle lui a des 'creux' importants, ils ne seront pas pris en compte pour les collisions. Par exemple, si vous faites une coupole creuse et que vous la déposez sur un autre objet plus petit dans le jeu, cet objet ne sera pas recouvert par la coupole, mais la coupole restera posée dessus comme si elle avait un fond plat.
 
 
On sélectionne l'enveloppe et on va dans le mode Editing (F9), on vérifie qu'on a bien convexpoly comme nom.
 
 
On vérifie en mode Object (F7) que dans la section Draw on a bien Bounds et Wire qui sont sélectionnés.
 
On passe dans la section Logic (F4) et on va choisir comme Object Type : Rigid Body, on peut y définir le poids (Mass) et le rayon (Radius), mais ce n'est pas nécessaire on fera ce genre de chose lors de l'exportation et dans NifSkope. Parfois, selon le type d'enveloppe qu'on obtient on ne peut pas choisir Rigid Body dans le menu, ce n'est pas grave parce que ces données seront de toute façon reconfigurées avec NifSkope pour cause d'incompatibilité avec Skyrim. Il suffit de configurer bounds Et pour définir le Radius, il suffit de créer un cercle ou une sphère temporaire et d'en prendre la mesure.
 
Juste au-dessous on clique sur Bounds et on choisi Convex Hull comme type d'enveloppe (Triangle Mesh c'est pour les Mopps et les autres c'est pour les Primitives)
 
On va maintenant mettre à l'échelle 1/10 l'enveloppe, c'est ce qui est utilisé pour Skyrim je ne sais pas pourquoi exactement.

 
 
On va donc obtenir une enveloppe 10 fois plus petites que le modèle. Il faut encore mesurer le rayon (Radius) de cette enveloppe, la valeur n'est malheureusement pas exportée, il faudra la noter. Dans le mode Logic (F4) on ajuste donc Radius pour que ce rayon englobe la forme générale. Si vous avet une forme non symétrique, il faudra probablement estimer le rayon le plus adapté. Reportez vous à des exemple des modèles du jeu d'origine. Ouvrez un modèle similaire et regardez la valeur du Radius dans NifSkope dans la partie bhkConvexVertices Shape.
 
On retoune dans la fenêtre 3D et on rend tout visible si ce n'est pas le cas.
N'oubliez pas que les valeurs dans Blender sont 10 fois plus grande que dans NifSkope, en effet Blender travaille a une échelle 10 fois plus grande et le plugin d'exportation met à l'échelle les valeurs.
Une fois que c'est terminé, on peut passer à l'exportation.
 
On sélectionne le modèle et l'enveloppe et on ouvre le plugin d'exportation.
 
Dans la section Collision Option on va définir le type d'objet, dans notre cas, pour les armes, boucliers et objets divers, on va choisir soit Weapon (armes) ou Clutter (objets divers).
On va en dessous définir le matériau, mais en fait les autres paramètre ne sont pas utiles car ils sont invalides pour Skyrim de toute façon et il faudra les modifier dans Nifskope.
On peut finalement exporter le modèle du Type Fallout 3 pour la suite de la conversion au format Skyrim.
 
 
Conversion au format Skyrim :
 
Pour la conversion, on va encore une fois utiliser la vieille méthode du copier/ coller à l'aide d'un fichier au format Skyrim.
Comme l'exportateur exporte un NiNode et pas un BSFadeNode dont nous avons besoin, convertir notre fichier est assez compliqué, c'est pourquoi il est bien plus simple et fiable de copier nos données de NitriShape et des bhkConvexVerticesShape dans un fichier NIF déjà au format Skyrim. Bien sur il faut utiliser un fichier aussi proche que possible de celui qu'on désire créer.
 
Mais avant de commencer il faut mettre notre fichier dans la bonne version compatible avec Skyrim, sinon on ne pourra pas copier les données.
La première chose à faire c'est bien sur de changer les User Version du Header avec NifSkope, comme d'habitude, de 11 à 12 pour User Version et de 34 à 83 pour User Version 2.
On sauvegarde, on ferme le fichier et on l'ouvre à nouveau. On voit bien également en jaune l'enveloppe qu'on a créé.
 
Dans une autre instance de NifSkope on ouvre un fichier nif le plus proche possible de ce que nous avons réalisé comme modèle.
 
 
 
Copie de la partie NitriShape de notre modèle :
 
 
On va d'abord faire la partie classique, on va copier le bloc NitriShape (CTRL + C) de notre modèle et le coller (CTRL + V) dans 0 BSFadeNode du modèle de référence.
 
On va maintenant copier le shader BSLightingShaderProperty du NitriShape du modèle de référence (CTRL + C). Il faut le faire avant de supprimer le NitriShape sinon il faudra ouvrir un autre fichier nif pour en récupérer un. Mais si vous avez besoin d'un autre type de Shader, il faudra en trouver un compatible avec vos besoins.
 
On supprime le bloc NitriShape du modèle de référence (CTRL + DEL)
On Colle le shader BSLightingShaderProperty dans 0 BSFadeNode, puis on l'attribue au Nitrishape de notre modèle.
Il faut encore configurer le si nécessaire, changer l'adresse des textures dans BSSHaderTexturesSet et éventuellement ajouter un NIAlphaProperty si on a desoin de transparence.
 
On réadresse le shader avec la méthode habituelle qu'on a déjà utilisé plusieurs fois dans ces tutoriels.
 
 
 
On va maintenant copier les données de l'enveloppe de collision dans 0 BSFadeNode:
 
On copie le bloc bhkConvexVerticesShape (CTRL + C) et on le colle dans 0 BSFadeNode du modèle de référence.
 
On va ensuide réadresser ce bloc, dans bhkRigidBody sous Shape, on a le numéro de bloc de l'enveloppe de l'autre modèle, on remplace ce numéro par celui du bloc qu'on vient de copier et qui est tout en bas de la liste des blocs.
Il n'y a plus qu'à supprimer le bloc bhkConvexVerticesShape qui a été extrait.
 
On peut procéder à quelques ajustements comme le rayon de collision.
Sous bhkConvexverticesShape, on va ajuster le Radius avec la valeur notée dans Blender (n'oubliez pas de diviser par 10!)
Il faut également ajuster le Material avec un choix qui correspond au matériau de votre modèle. Il y a une liste déroulante avec les choix possible. Cette liste n'est pas complète pour Skyrim, les noms qui commencent pas SKY sont typiques de Skyrim, mais les autres ne fonctionnent pas forcément. Si vous n'avez pas de son lors de chocs, il faudra mettre un materiau de type SKY_HAV_MAT_...
 
Avant de sauvegarder, il faut encore bien vérifier que dans bhkRigidBody les valeurs Motion System sont correctes pour un objet comme une arme ou un bouclier ou les objets manipulable.
MO_SYS_SPHERE_INERTIA
DEACTIVATOR_NEVER
SOLVER_DEACTIVATION_LOW
MO_QUAL_MOVING
 
Ces réglages sont bien entendu valides uniquement pour des modèles d'objets mobiles qu'on peut manipuler et en aucun cas des objets fixes du décor.
 
 
Voilà, on peut sauvegarder le fichier NIF et le tester dans le jeu après l'avoir importé comme on l'a vu dans le tutoriel sur le World Model pour une armure.
 
 
 
 
Créer un modèle statique avec collision :
 
 
Pour les modèles statique on utilise de préférence des collision de type Mopps, mais l'exportateur de Blender ne peut pas en créer de valides pour Skyrim.
En plus il n'y a pas de moyen simple comme pour les Primitives ou les Convex Verts de convertir le fichier NIF avec NifSkope.
 
Mais grace aux développeurs de NifTools qui font les plugins d'exportation et NifSkope, on a un petit programme qui permet de convertir un modèle nif sous forme de NiTriShape en modèle de collision du type Mopps compressé.
 
Pour obtenir un bon résultat optimisé, on va procéder en deux étapes :
 
Premièrement on va créer un modèle normal et détaillé de notre objet dans Blender, puis on va l'exporter sans y ajouter un objet de collision et on le converti au format Skyrim selon la méthode habituelle.
 
Deuxièmement, on va créer un modèle très simplifié soit par décimation du modèle détaillé, soit en en créant un directement en suivant la forme générale de l'autre. Ce modèle n'a pas besoin de détails, seule la forme générale qui sera nécessaire pour une bonne collision doit être créée. La décimation a forte échelle ne donne pas forcément un résultat optimal, de plus mieux vaut décomposer le modèle en plusieurs objets si le modèle utilise plusieurs matériaux. Par exmeple l'enclume qui nous a servi de modèle pour l'explicatuion des Mopps est composée d'un socle en bois et d'une enclume en fer. Dans ce cas on va faire deux objets de façon à ce que lorsqu'il y a choc sur l'enclume ou sur le socle, les effets ne soient pas les mêmes.
On va ensuite exporter ce modèle en plusieurs parties comme un modèle standard, on n'y pas besoin de le convertir au format Skyrim.
 
 
Une fois qu'on a les deux modèles, celui du modèle normal détaillé sans collision au format Skyrim et l'autre simplifié au format Fallout3, on peut convertir le NitriShape du modèle simplifié en collision du type Mopps à l'aide de ChunkMerge.
Ce petit utilitaire va ajouter au fichier détaillé les données converties en collision et on obtiendra un fichier NIF pour un objet statique avec une collision Mopps optimisée.
Il va utiliser comme template un fichier nif du jeu originel semblable à celui qu'on veut réaliser, ensuite on peut encore ajuster les paramètres avec NifSkope, pour les matériaux par exemple.
 
 
Exemple pratique de modèle statique avec collision Mopps:
 
Nous allons utiliser comme exemple pratique l'enclume.
 
Première partie, création du modèle de collision dans Blender :
 
 
Voilà le modèle de l'enclume détaillé, on voit qu'on peut en faire une version simplifiée rapidement en deux objets disctincts pour séparer le bois du métal.
J'ai choisi ce modèle parce qu'il se compose de deux matériaux distincts, une enclume en fer et un socle en bois. Le but final est de réaliser un modèle qui va réagir différemment si on frappe sur le métal ou sur le bois.
Il est donc nécessaire de diviser le modèle de collision en deux partie, deux objets dans Blender. Le modèle 3D normal lui est d'une seule pièce du moment qu'il n'utilise qu'une seule texture.
ATTENTION !!! Le modèle d'origine n'a pas son origine centrée sur (0,0,0), probablement parce qu'il fait partie d'un ensemble de modèle qu'on peut placer en une fois. La conséquence pour ce tutoriel c'est que lorsqu'on va importer le modèle dans Blender, on va certainement recentrer son origine sur (0,0,0). Par la suite lorsqu'on va exporter les deux modèles et utiliser ChunkMerge pour recréer une collision, on va avoir un problème. La cause est que ChunkMerge prend un modèle de référence de l'enclume originelle pour le bloc de collision et dans bhkRigidBody, on va avoir une translation qu'on aura plus dans le NitriShape de notre modèle. Lorsqu'on utilisera notre enclume dans le jeu on n'aura pas de collision, en fait le modèle de collision sera à peu près 10 mètre à côtè!
Pour corriger ça il suffite de mettre à zéro la translation du bhkRigidBody.
 
Le socle est représenté par un cylindre octogonal très simple, l'enclume est réalisée avec un cube divisé en quelques éléments et un cone hexagonal. Pour la collision ça suffira amplement à représenter l'objet. L'objet détaillé a 397 sommets et le modèle de collision simplifié en a seulement 61.
 
On va commencer par exporter le modèle normal vers un fichier nif comme d'habitude. On va le nommer enclume-tutoriel.nif
 
Puis on va exporter le modèle de collision simplifié de la même façon avec un autre nom bien sur. On va le nommer enclume-tutoriel-lowpoly.nif
 
 
Deuxième partie, conversion au format Skyrim et ajout de la collision :
 
 
On va commencer par convertir au format Skyrim notre enclume de la façon traditionnelle en modifiant le header, puis en lui ajoutant le Shader BSLightingShaderProperty d'un autre fichier nif valide et semblable.
Je ne vais pas détailler cette procédure qui a déjà été décrite plusieurs fois sur cette page et dans ces tutoriels.
Il y a aussi un petit utilitaire contenu dans le pack NifUtils créé par Skyfox, un membre du groupe de développement de NifTools.
Je donnerais le lien vers ces utilitaires que nous allons utiliser ici, personnellement je préfère convertir à la main, car souvent avec l'utilitaire de conversion, il faut ensuite de toute façon retoucher le modèle avec NifSkope.
Mais tout à l'heure nous allons également nous trouver devant un problème dans NifSkope, en effet, le support pour Skyrim est très incomplet et si la dernière version 1.1.0 RC7 a un support pour les Mopps, malheureusement lors de la mise à disposition de la RC7, il y a un un petit bug qui fait que le fichier nif.xml qui contient les informations nécessaires à NifSkope n'a pas été complètement adapté. Je ne sais pas si c'est volontaire ou accidentel, mais la section qui traite les Chunks (morceaux) n'a pas été mise à jour.
J'ai donc recherché moi-même sur les forume de NifTool des informations à ce sujet et j'ai retrouvée les informations sur la section des Chunks nécessaire pour pouvoir utiliser plusieurs matériaux divers.
 
Voici le liens vers NifSkope RC7 : NifSkope 1.1.0 RC7 at SourceForge
 
Vers le pack NifUtils : Skyfox NifUtils version 1.5.3
 
Vers mon fichier nif.xml que j'ai mis à jour: Fichier nif.xml à placer dans le dossier de NifSkope
 
Depuis Octobre 2012, il y a une nouvelle version de NifSkope corrigée avec un nif.xml corrigé : NifSkope 1.1.1 avec bug des matériaux corrigé
 
 
On a donc notre fichier nif au format Skyrim prêt à recevoir le bloc de collision nécessaire : bhkCollisionObject
 
 
On va maintenant lancer ChunkMerge et préparer la conversion.
Il faut définir les trois champs de ChunkMerge, en haut le fichier converti au format Skyrim qui recevra les données de collision, au milieu le fichier nif simplifié qui servira de modèle de collision et en bas le fichier de référence qui ressemble au mieux à ce qu'on veut faire.
Si on veut exporter une objet de collision multiple de type Mopps avec plusieurs matériaux, on est obligé de se baser sur des NitriShape comme source et d'utiliser le nom des NitriShape comme nom de matériau. Ce qui veut dire que dans Blender on devra renommer chaque objet avec un nom de Materiau que NifSkope peut lire, par exemple SKY_HAV_MAT_METAL pour l'enclume et SKY_HAV_MAT_WOOD pour le socle en bois.
 
Si tout se passe bien on obtient un fichier Nif au format Skyrim avec la collision au bon format également.
Mais on a un petit problème si on a défini deux matériaux pour un même objet, dans NifSkope on voit que dans bhkCompressedMeshShapeData, on a Num Material 1, alors qu'on en2 a besoin de deux. Il faut donc corriger et mettre la valeur 2 comme dans l'image ci-dessous et sauvegarder pour que NifSkope mette à jour le fichier NIF et qu'on puisse ensuite définir ces deux matériaux.

On voit qu'on a le materiau par défaut : HAV_MAT_STONE qui correspond au numéro 0 pour les deux matériaux listés, il faut changer ces valeurs parce que Skyrim n'utilise que les matériau de type SKY_HAV_MAT...

 
On va ouvrir alors Chunk Materials pour définir ces deux matériaux:
Après avoir mis la valeur 2 comme Num Materials, on a deux possibilités pour la liste de matériaux Chunk Materials , on va mette le bois dans la première : SKY_HAV_MAT_WOOD et le métal dans la deuxième : SKY_HAV_MAT_SOLID_METAL.
Maintenant reste à définir quel materiau chaque Chunk doit utiliser, un Chunk c'est bien entendu un objet de collision, on en a deux ici puisqu'on a divisé notre collision en deux parties, une pour le bois et une pour le métal.
On va remarquer que dans Chaque Chunk on a la valeur Chunk Material Index, ça signifie que la valeur définie va désigner un materiau de la liste juste au dessus. Si on a besoin du premier matériau de la liste on va mettre la valeur 0, si on a besoin du deuxième, on va mettre la valeur 1.
 

Dans le fichier de référence de l'enclume on voit bien ces deux matériaux , 1288358971 (SKY_HAV_MAT_SOLID_METAL) et 3070783559 (SKY_HAV_MAT_HEAVY_WOOD), malheureusement NifSkope a un problème avec les nombres entiers plus grands que 2020000000, il affiche bien la valeur 30707835559, mais si on essaie de la modifier, on ne pourra pas réécrire le dernier chiffre.

Problème corrigé depuis Octobre 2012 NifSkope 1.1.1

Si on veut impérativement utiliser un matériau incompatible avec NifSkope, il faudra probablement travailler en copier/coller des blocs et de données sans toucher à ce numéro de matériau.
 
On a maintenant un fichier prêt à être utilisé dans Skyrim, en testant vous constaterez que les sons et effets de chocs sont différents pour les deux parties, bois ou métal.
Si par hasard c'est inversé, il suffit de modifier les Chunk Material Index en conséquence.
 
Et si lorsque vous testez votre modèle, vous n'avez pas de collision fonctionnelle, vérifiez que votre modèle de collision est bien au même endroit que le modèle de base. Avec cet exemple d'enclume, il y a ce problème parce que le modèle de référence n'est pas centré sur l'origine (0,0,0).
Il suffit alors de modifier la translation du bhkRigidBody
Ci-dessous, on en a l'exemple, la translation doit être mise à : X 0.0000 Y0.0000 Z 0.0000 W 0.0000