Ce projet est né d'un constat simple côté créateurs Minecraft : beaucoup de modèles 3D
sont conçus dans Blockbench, mais restent difficiles à réutiliser en vanilla
sans passer par des mods. J'ai donc développé un convertisseur qui transforme automatiquement
ces modèles au format .bbmodel en structures exploitables par
Block Display Engine (BDEngine), en s'appuyant uniquement sur les entités
d'affichage et les têtes de joueur personnalisées.
Dans Minecraft, les créateurs doivent souvent choisir entre :
L'objectif du convertisseur est de :
.bbmodel Il s'agit d'un projet personnel open-source, que j'ai entièrement conçu et développé :
Blockbench permet de concevoir des modèles à base de cubes en précisant
leurs dimensions (from/to), leurs rotations et les coordonnées
UV des différentes faces. Les modèles sont enregistrés dans un fichier JSON
.bbmodel et sont essentiellement destinés à des mods ou des packs de ressources.
À l'inverse, BDEngine est un moteur open-source mis au point par
illystray pour simplifier la
création d'objets 3D en jeu via les entités d'affichage vanilla. Dans ce moteur, chaque cube
est représenté par une « tête de joueur » dont on contrôle l'échelle, la rotation et
la texture. Mon travail consiste à faire le lien entre ces deux mondes : prendre un
modèle Blockbench et produire automatiquement un fichier .bdengine prêt à être
utilisé dans le jeu.
Un mod est un programme additionnel que les joueurs doivent installer localement. Avec BDEngine et le convertisseur, les objets restent en pur vanilla : une simple commande ou une datapack suffit, ce qui simplifie fortement la distribution.
Dans un modèle Blockbench, la géométrie est composée de plusieurs éléments : parallélépipèdes définis en pixels dans un repère 3D propre au modèle. BDEngine, lui, manipule des entités d'affichage positionnées en blocs, centrées sur la face supérieure d'une tête de 8×8×8 pixels.
La conversion passe donc par :
Pour chaque élément, on détermine :
Le moteur place chaque tête par rapport au centre de sa face supérieure. Si l'élément mesure width × height × depth et repose sur bottom = (b_x,b_y,b_z), alors :
La position en blocs s'obtient en soustrayant le centre du modèle et en divisant par 16 :
L'échelle est déduite du ratio entre la taille de l'élément et la taille native d'une tête (8 pixels) :
Les rotations de Blockbench suivent l'ordre « Z → X → Y ». Pour obtenir la matrice de rotation 4×4 utilisée par BDEngine, on calcule d'abord les rotations élémentaires (en radians) autour des trois axes :
Multipliée à l'échelle, cette matrice de rotation est insérée dans la matrice de transformation 4×4 :
Cette matrice est directement écrite dans le fichier .bdengine et
interprétée en jeu par l'entité head display.
Le projet propose deux stratégies de conversion :
Un algorithme analyse les dimensions de l'élément et ses coordonnées UV pour choisir la meilleure décomposition. Les faces planes sont converties en têtes très fines (épaisseur ≈ 0,011 bloc) pour simuler un panneau sans volume, ce qui réduit le nombre de têtes nécessaires tout en gardant un rendu propre.
Les têtes de joueur disposent d'un template 64×64 pixels où chaque face occupe une
zone 8×8. La conversion calcule les régions UV dans la texture Blockbench, puis
les projette dans les zones correspondantes du template de tête (par exemple,
north sur la zone 8-16, 8-16). Une transformation affine garantit le
ratio 1:1 des pixels pour éviter les déformations.
Le code est structuré en plusieurs modules principaux :
converter.py : point d'entrée qui orchestre la lecture
du .bbmodel, l'extraction des textures et l'écriture du
.bdengine compressé (gzip + base64).conversion_strategy.py : définit les stratégies
StretchConversionStrategy et SmartCubeConversionStrategy.head_factory.py : génère les structures JSON des têtes
BDEngine et les matrices de transformation.math_utils.py : fonctions de trigonométrie, matrices de
rotation 3×3 / 4×4 et transformation de points 3D.texture_manager.py et
texture_subdivider.py : gestion des textures, découpe
UV et subdivision des images.smart_cube_optimizer.py : choix des combinaisons de cubes
et optimisation du compromis nombre de têtes / qualité visuelle.Avant de présenter les résultats du convertisseur, voici quelques exemples de créations réalisées directement avec BDEngine. Ces modèles illustrent le potentiel du moteur en pur vanilla.
Voici maintenant des exemples concrets de modèles Blockbench convertis en BDEngine :
Ces exemples montrent que le convertisseur peut transformer des modèles complexes en structures BDEngine utilisables en vanilla, tout en respectant les rotations, échelles et textures d'origine.
Le convertisseur est encore en évolution :
outliner) peut encore être améliorée pour coller
exactement au comportement de Blockbench