
Twilight Tools
2024 - 2025- C++
- Retro-engineering
- Projet perso
- 3D
Twilight Tools est un logiciel qui permet de convertir d'anciens fichiers 3D de jeux GameCube, qui sont inutilisables, en fichiers .fbx utilisables par nos logiciels actuels
Préambule
Ce projet est un outil logiciel expérimental destiné à l'analyse et à la conversion de formats 3D. Il ne fournit aucun contenu protégé par le droit d'auteur (modèles 3D, textures, ROMs). L'utilisateur est responsable de la provenance et de l'utilisation des fichiers qu'il traite.
Contexte
En fin 2024, en tant que fan du jeu The Legend of Zelda : Twilight Princess, j'ai eu l'envie de comprendre comment fonctionnaient certains formats de modèles 3D utilisés dans des jeux vidéo plus anciens. Comme ces formats n'étaient généralement pas compatibles avec les outils 3D modernes, l'idée a été de créer un programme permettant de les convertir vers un format aux normes actuelles (.fbx), principalement pour l'expérimentation et l'apprentissage. Ce projet m'a énormément appris, que ce soit ma compréhension des fichiers binaires, de la façon dont ils stockent les informations, mais il a aussi consolidé mes notions de 3D et mes compétences en C++.
Recherche et compréhension du sujet
Cette partie a sans doute été la plus compliquée étant donné la documentation quasi inexistante. Après quelques semaines de recherches, j'ai réussi à dénicher 2/3 sites comme ce wiki sur Tockdom ou ce wiki sur Luma Workshop qui évoquaient les potentiels sections de données des fichiers BMD, bien que certaines informations soient incomplètes. J'ai également pu trouver quelques projets en rapport avec ce sujet comme BLEMD qui permet l'import de BMD directement dans le logiciel Blender. N'ayant aucune notion de fichiers binaires, j'ai donc appris petit à petit comment cela fonctionnait : les façons dont on peut stocker les données, les notions d'offsets, etc. De même, j'ai dû apprendre comment fonctionnait le format FBX ainsi que son SDK, du moins le strict minimum afin de pouvoir convertir les données récupérées en fichier FBX.
Réalisation du projet
Récupération des données
Architecture
Pour recupérer les données, j'ai voulu organiser le projet de la façon la plus optimale possible. Tout d'abord, j'ai organisé le projet de façon à ce que la gestion de l'extraction des données du fichier .bmd soit séparée en plusieurs fichiers. Il y a donc un fichier pour chaque sous-section principale (exemple : vtx1.cpp pour la section qui stockent les données des sommets).
Fonctions utilitaires
J'ai également créé des fonctions utilitaires qui permettent de recuperer les données primitives (entiers, flottants) du fichier correctement (notamment en gérant l'endianness). Comme exemples de fonctions je peux citer read_int16() pour récupérer les entiers codés sur 16 bits, read_uint32() ou encore read_float() pour récupérer les nombres flottants codés sur 32 bits. À l'aide de ces fonctions utilitaires, j'ai donc pu récupérer pour chaque section du fichier, les données primitives correspondantes que j'ai traité et stocker dans des structures et classes adaptées à chaque cas (Voir exemple ci-contre).
Execution concrète
La partie du programme qui gère l'extraction des données procède de la façon suivante :
- Créer un objet de type BMD.
- Le BMD crée pour chaque sous-section du fichier un objet de la classe correspondante (VTX1, SHP1, JNT1, etc.).
- Les objets des sous-sections extraient chacun leur tour les données primitives, les traitent et les stockent dans des structures et classes appropriées.
- L'objet BMD contient maintenant toutes les données nécessaires pour la conversion en FBX.
Conversion en FBX
Fonctionnement des modèles 3D et vocabulaire associé
Un modèle 3D (ou mesh) est une forme numérique construite à partir de petits points appelés sommets (vertices). Ces points sont reliés entre eux pour former des surfaces (les faces) qui donnent la forme globale de l'objet. Pour que la lumière se comporte correctement sur le modèle, chaque sommet peut avoir un vecteur appelé normal. Pour lui donner une apparence, on utilise des matériaux (materials) et des textures (images qui habillent le modèle). Chaque sommet a une coordonnée UV qui dit "quelle partie de l'image va ici", un peu comme déplier un cube en papier pour savoir où coller chaque motif. Si le modèle doit bouger ou s'animer, il peut contenir des os (bones). Chaque sommet est attaché à un ou plusieurs os avec un poids (weight) qui détermine à quel point il suit le mouvement de l'os. Par exemple, les sommets autour d'un bras suivent beaucoup l'os du bras, alors que ceux du torse bougent peu. Cela permet de faire bouger le modèle de façon naturelle.
Déroulement de la conversion
La conversion en FBX se déroule en plusieurs étapes :
- Extraction des données : On commence par extraire les données du
.bmd, comme expliqué dans les parties précédentes. - Construction de l'arborescence : On crée une structure qui représente l'organisation des éléments du modèle. Elle est composée de shapes (morceaux de mesh), de matériaux et de bones (os).
- Création des bones : Les bones du modèle
.fbxsont créés à partir des données du.bmd. Pour cela, on transforme les informations des bones (avec des calculs), puis on les stocke en matrices, et enfin on les injecte dans un objet FbxMesh fourni par le FBX SDK. - Traitement du mesh : On traite ensuite les données des sommets, qui contiennent beaucoup d'informations : positions, coordonnées UV, normals, etc. Chaque donnée doit être correctement traitée avec les opérations appropriés (exemples de traitements ci-contre) et elles doivent être associées de la bonne façon pour être réutilisées dans la dernière étape.
- Assemblage final : Enfin, toutes les données sont combinées dans l'objet FbxMesh : les sommets sont placés correctement, avec leurs normals, leurs weights pour chaque os et les coordonnées UV adaptées.
Extraction d'autres types de fichiers
Bien que je n'ai présenté que la conversion de fichiers 3D, ce programme peut également extraire certaines types d'archives particulières (Yaz0, RARC, etc.) en faisant notamment appel des programmes tierces comme wszst. J'ai également pu implémenté moi-même la conversion de fichier .gtx (inutilisables par nos logiciels actuels) en .dds, ce qui a en réalité été la toute première fonctionnalité de TwilightToolsCLI.






