====== Modélisation d’objets 3D pour le client Godot ======
WIP - Rédaction en cours : [[https://git.khaganat.net/khaganat/mmorpg_khanat/khanat-client/-/issues/7|ticket sur la Forge]] --- //[[wiki:user:yannk|YannK]] 2021/09/28 20:26//
Nous utilisons le logiciel [[https://www.blender.org/|Blender]] pour la modélisation, les captures d’écran et les indications sont fournies pour ce logiciel.
De nombreux termes techniques sont conservés en anglais, pour faciliter la recherche de documentation sur Internet, celle-ci étant presque exclusivement écrite dans cette langue.
===== Modélisation ''hard surface'' =====
{{ :fr:capture_d_ecran_2019-10-09_12-35-46.png?direct&400 |}}
Nous envisageons de partir sur une chaîne de production de type ''medium poly'' : nous ne faisons qu’un objet, dont nous éditons les ''Normals'' afin de ne pas avoir à baker celles-ci depuis une version ''high-poly'' sur la version ''low-poly'' avec une topologie optimisée.
Pour l’instant, Godot ne les supportant pas encore (c’est prévu sur leur Roadmap toutefois), nous n’avons pas de ''Decals'' appliquées sur le modèle, mais c’est envisagé à terme afin de permettre l’ajout de détails.
Le but est d’employer des matériaux avec des textures standards dans le client, qui se déploient indépendamment des UV. Le dépliage des UVs ne servira qu’à calculer des effets, en se basant sur les textures de type ''Curvature'' et ''World Position map'' qui devront être fournies pour chaque objet. La définition de celles-ci sera à adapter en fonction de la taille de l’objet et il est possible qu’à terme les deux soient combinées en une seule image avec RGB pour la ''World Position map'' et Alpha pour la ''Curvature''.
==== Modélisation de l’objet 3D ====
=== Organisation de la hiérarchie des objets ===
Le but est de conserver le plus possible l’objet éditable de façon non destructive, pour permettre à la fois la retouche aisée et l’adaptation à de nouvelles demandes, de nouvelles contraintes. Comme le client exigera des cartes graphiques récentes (Godot se basant sur OpenGL3, et en cours de portage sous Vulkan), il ne faut pas trop se compliquer la tâche avec le ''Vertex count''. Supprimer les ''Edges'' redondants suffira, en ayant suffisamment de courbes pour soutenir la forme de l’objet à sa taille de rendu vu depuis 1 m ou 2.
Nous prendrons le modèle [[gitlab>khaganat/mmorpg_khanat/khanat_assets_sources/blob/master/meshes/props/travel_box/travel_box.blend|travel_box.blend]] du [[gitlab>khaganat/mmorpg_khanat/khanat_assets_sources|dépôt des sources d’assets]] comme base d’étude pour cet article.
Le modèle est organisé de façon hiérarchique claire : dans l’''Outliner'' tous les éléments sont rassemblés dans une ''Collection'' au nom de l’asset. Il faut veiller à bien nommer aussi les ''Mesh Data Blocks'' pour être certain qu’on s’y retrouve, en leur donnant le même nom que l’objet en lui-même. En cas de partage du ''Data Block'', cela évitera de se perdre.
{{ :fr:capture_d_ecran_2019-10-09_12-39-27.png?direct&400 |}}
Au sein de la ''Collection'', les objets sont parentés entre eux pour faciliter le déplacement et la compréhension des blocs à éventuellement rendre animés dans le client. Ici nous avons le ''travel_box_lid'' qui est parenté au ''travel_box_bottom'' et chacun de leurs éléments parentés à ceux-ci afin de permettre d’ouvrir le couvercle de façon cohérente.
Si jamais vous avez utilisé des ''Booleans'', des formes intermédiaires, ou tout autre objet qui ne doit pas être intégré au modèle final, veillez à les placer dans d’autres ''Collections'', bien distinctes de celle qui porte le nom de l’asset à exporter.
=== L’usage des ''Modifiers'' ===
Les objets ont leurs ''Modifiers'' non appliqués, pour permettre l’édition et la retouche ultérieures. N’hésitez pas à recourir le plus possible à ceux-ci, ils garantissent un workflow non destructif qui fait gagner beaucoup de temps.
{{ :fr:capture_d_ecran_2019-10-09_12-59-24.png?direct&400 |}}
Il est juste essentiel de placer en bas de la liste, soit en dernier à appliquer sur l’objet les trois ''Modifiers'' suivants (dans cet ordre) :
* ''Generate'' > ''Bevel''
{{ :fr:capture_d_ecran_2019-10-09_12-48-10.png?direct&400 |}}
Nous recommandons d’appliquer des ''Bevels'', de façon à éviter les angles trop aigus irréalistes. Un seul segment suffit, de très petite ampleur (1mm est en général suffisant).
Peu importe la façon dont vous les appliquez. Sur le modèle, les grands blocs ont eu une ''Limit method'' de type ''Angle'', de 25° chacun, et les serrures ont eu des ajustements de type ''Bevel Weight'' sur les segments concernés, avec donc une application de ''Limit method'' de type ''Weight''.
* ''Modify'' > ''Weighted normals''
{{ :fr:capture_d_ecran_2019-10-09_12-52-05.png?direct&400 |}}
Une fois l’objet muni de ses ''Bevels'', il faut faire en sorte que les Normales soient correctes au niveau des ''Faces''. Nous allons donc appliquer les paramètres suivants : ''Weigthing Mode'' > ''Face Area'', avec un ''Weight'' de 100. En général ces paramètres suffisent si les ''Bevels'' sont corrects.
Il faut penser à mettre l’objet en ''Shade Smooth'' et à activer dans l’''Editor'' > ''Context'' > ''Object Data'' > ''Normal Maps'' : ''Auto Smooth''. Couplé aux ''Bevels'', cela permet d’avoir un objet dont les ''normals'' seront visuellement correctes. N’hésitez pas à jouer avec le ''Bevel weight'' des ''Edges'' qui posent souci si vous constatez des artefacts visuels.
{{ :fr:capture_d_ecran_2019-10-09_12-54-53.png?direct&400 |}}
Le but est d’avoir un objet en ''Solid view'' qui soit visuellement correct au niveau des angles et des reflets de plans. Vous pouvez appliquer une ''MatCap'' brillante le temps de vérifier que tout est ok, cela aide bien à pointer les défauts de ''Normals''.
{{ :fr:capture_d_ecran_2019-10-09_12-56-47.png?direct&400 |}}
* ''Generate'' > ''Triangulate''
{{ :fr:capture_d_ecran_2019-10-09_12-58-15.png?direct&400 |}}
Vu que le moteur de jeu triangulera toutes les faces, il vaut mieux contrôler cette étape afin de s’assurer que les ''normals'' ne seront pas faussées. Le paramètre important à cocher est ''Keep Normals'' qui devrait garantir la consistance du résultat.
==== Baking des textures liées à fournir ====
==== Texturage de l’objet ====
==== Export vers le client Godot ====
Vérifier Scale et Rotation, à 0
{{tag>graphisme}}