[EN STAND-BY] Plaig4Anims, la solution idéale pour vos animations !



  • #PRÉSENTATION(PRÉSENTATION)

    Plaig4Anims est une librairie éponyme, réalisée pour mc, closed-source à l'heure actuelle, débutée sous la 1.7.10 (actuellement en v1.0), permettant le chargement de modèles 3D au format obj, puis d'animations au format mdl (md2 prochainement). Elle a été débutée début Novembre 2017 dans le but de réaliser le jeu Kingdom Hearts 2 dans Minecraft.
    Passons désormais aux fonctionnalités de la lib…

    #FONCTIONNALITÉS(FONCTIONNALITÉS)

    La libairie permet essentiellement le chargement de modèles 3D animés, mais pas que !
    Voici une liste non-exhaustive de toutes les fonctionnalités qu'elle vous promet de remplir:

    1° La vitesse d'exécution des frames composant l'animation est parfaitement ajustable, en fonction des fps ou selon une constante. La librairie permet la customisation du fichier MDL de manière à accélérer/ralentir certaines parties de l'animation (tout est géré via le parser).

    2° La librairie permet de charger une animation, ou de la stopper à une certaine frame, pendant un certain délai. Il est également possible de commencer à une frame n1, puis de finir à une frame n2. En outre, le degrés d'interpolation (entre les frames) est parfaitement réglable (permettant un rendu saccadé ou au contraire linéaire).

    3° Plaig4Anims inclut également un chargeur de modèles OBJ, fonctionnel mais qui sera refait pour la 2.0.

    4° Plaig4Anims comporte un système de synchronisations inter-clients des données relatives aux animations (leur id et leur progression). De plus une persistance via NBT est activable ou non selon les désirs de l'utilisateur (une entité au combat n'a aucun intérêt à subir une persistance, tandis qu'une machine aura tout intérêt à la supporter).

    5° La transition entre 2 animations différentes est facilitée par plusieurs fonctions, de plus, une classe utilitaire est présente pour déclencher des animations à des moments prédéfinies "idle", "attack", "walking" "jump" et "hurt". Ainsi ces actions n'auront pas à être détectées par l'utilisateur, leur "capture" et leur lecture sont automatisées par la librairie.

    6° Une des récentes fonctionnalités est l'utilisation de 2 shaders LIGHT ou CUSTOM tout à fait personnalisables (position de la source lumineuse réglable, matrice de couleur modifiable, taux d'absorption de la lumière par le modèle/luminosité ambiante du rendu ajustable (de manière à adapter selon le daytime), de manière à observer un ombrage de Phong sur le rendu du modèle.

    7° La dernière fonctionnalités est encore en WIP. Il s'agit du suivi de la hitbox par rapport au rendu de l'entité. Par ailleurs la v2.0 permettra d'utiliser un nouveau système de hitbox basé sur différents forme, non plus cubiques (sphère, cylindre et peut-être pyramide).

    #PRISE EN MAIN(PRISE EN MAIN)
    Nouvelle section (26/02/2018)

    Dans ce mini-tutoriel, nous aborderont uniquement l'insertion complète (lecture, gestion en mémoire et rendu) du modèle au format .mdl dans Minecraft.
    De ce fait, j'exclurai la partie "Modélisation" sous 3ds Max. Voici néanmoins deux, trois conseils pour ceux qui s'y intéresseraient:

    1. Si vous débutez dans la modélisation, sachez qu'il serait judicieux d'avoir quelques bases avec le software 3ds max (raccourcis claviers, modélisation avec un blueprint, scale/translate/rotate, connaissance des principaux modiifiers, etc…).

    2. Une fois votre modèle finie, vous devrez export l'uv map, et la remplir. Voici le parfait tutoriel concernant cette tâche

    3. C'est bon! Vous pouvez désormais vous applaudir, le plus dur vient d'être fait, il ne vous reste plus qu'à découper votre modèle, mais vous verrez c'est très facile !
      Pour découper votre modèle, la solution la + simple sera de le rig, c'est-à-dire de lui créer son enveloppe squelettique. Ensuite vous devrez appliquer le processus de "finning", puis ensuite "attacher" le bone à sa mesh dans laquelle il est "caché", où pour faire court skin le modèle 3D. Ces 3 étapes sont d'une longueur relative à la "taille" du modèle. J'ai moi même appris par une suite de vidéos tutoriels, la première ici.

    4. Une fois fait, le reste ne sera que du plaisir, à savoir animer le tout ! Voilà une petite vidéo vous montrant 2 types d'animation sur 3ds max. Enfin une vidéo bonus vous montrant l'animation par suivi de trajectoire. Petit bonus: je vous mets ici à disposition un steve tout prêt à être animer, c'est cadeau !
      A quoi ressemble-t-il ?

    5. Une fois votre animation complètement finie, vous exporterez le modèle au format fbx. Et vous placerez ce dernier + ses textures associées dans un même dossier.

    6. Enfin, la dernière étape avant la partie "code" sera de convertir le modèle du format .fbx vers .mdl. Pour ce faire vous téléchargerez noesis, que je vous mets à disposition ici, puis vous découvrirez par vous-même, c'est très intuitif ! Vous aurez sûrement un souci d'orientation du modèle une fois convertie, pas d'inquiétude, Noesis met à disposition une petite centaine de commande, tel que "rotate x y z", comme le montre ce screen:

    7. Une petite étape alternative, où je vous propose de télécharger ce petit software nommé "qme31", qui vous permet de charger vos animations .mdl, afin de vous assurer qu'elles sont prêtes à être rendue ! De plus, vous pourrez afficher les caractéristiques de votre modèle, en allant sur l'onglet View, puis model properties. La fenêtre ressemblera à ceci, s'offrant une organisation en plusieurs catégories (bounds, skin, eye position, etc…):

    Voici son lien de téléchargement

    [size=large[PARTIE CODE EN RÉDACTION…]]

    #REMERCIEMENTS(REMERCIEMENTS)

    Un grand merci aux quelques personnes m'ayant aidé de loin ou de près:

    • elias54, administrateur de MFF et talentueux graphiste très sympatique, sans qui cette librairie n'aurait jamais pu revêtir ce magnifique logo !
    • steinert1801 (alis Sven), habile développeur germanique, qui par son soutient, a permis l'implémentation de son incroyable et délicieuse Shader API
    • ThinMatrix pour son excellente pédagogie à travers sa super suite de tutos sur OpenGL
    • Yanis qui fut mon ami, mon confident, celui qui m'a redonné du courage, dans les pires moments de détresse du développement, merci à lui ❤
    • Enfin un très très grand merci à [size=x-largeDavid Henry], pour son excellent tutoriel sur le format MDL, sans qui rien de tout cela n'aurait pu se réaliser !

    #VIDÉOS(VIDÉOS)

    v0.1:

    Youtube Video

    v0.2

    Youtube Video

    v0.8:

    Youtube Video

    #CHANGELOG(CHANGELOG)

    v0.1: Version initale, lecture du fichier MDL puis rendu partiel du modèle (uniquement les triangles)
    v0.2: Version ultérieure + avancée par l'implémentation temporaire des Vertices Lists
    v0.2.5: Version + récente tout autant élaborée par l'arrivée du rendu des vecteurs normaux par Normals Lists
    v0.3: Abandon du rendu par Verts/Norms/Text Coords Lists  pour un rendu bien + puissant avec le Tessellator
    v0.3.1: Version + sophistiqué par l'ajout du supporty de plusieurs modèles rendus en même temps
    v0.3.2: Petit soucis de taille grandisssante du modèle fixé, dû à la transition d'animations mal gérée
    v0.5: Implémentation de la Shader API
    v0.7: Synchronisation inter-clients fonctionnelle et persistance NBT réglable à souhait, puis transition d'animations facilitée implémentée
    v0.8: Ajout de la variable uniform brightness, permettant de varier la luminosité absorbée par le rendu du modèle
    v1.0: Version actuelle, portage du système d'incrémentation des animations des # entités du monde, du client vers le serveur (Meilleure sync, moins d'efforts au client, taux d'interpolation server-side désormais)

    #TÉLÉCHARGEMENT(TÉLÉCHARGEMENT)

    v1.5: lien de téléchargement

    #UPCOMING FEATURES(UPCOMING FEATURES)

    • Loader OBJ à refaire (qui supportera les .obj accompagnés de leur fichier mtl).
    • Support des flags Quake (rocket, grenade, gif, rotate, random, etc…).
    • Support des groupes de textures pour les animations de textures.
    • Support du format md2, pour des modèles dont les textures, désormais détachées du fichier modèle, ne seront plus sur une palette à 8 bit.

    #BUGS A FIX/TODO LIST(BUGS A FIX/TODO LIST)

    • Économiser la mémoire allouée à une instance de modèle animé, car jugé encore trop coûteuse
    • Accélérer la lecture (par la librairie) d'un fichier mdl, par séparation en # tronçons binaires de lecture
    • MàJ 1.8+ à effectuer, afin de profiter d'une optimisation par les VBOs/FBOs, et non plus uniquement des Display Lists
    • Optimiser en ne dessinant que les triangles vus par l'utilisateur, optimiser en dessinant avec les Vertices Indices (+ GL_TRIANGLES_FAN/GL_TRIANGLES_STRIP) et optimiser en éviter les tours de boucles inutiles selon le nombre d'entités rendus à l'écran de l'utilisateur, et non plus selon les entités présentes dans le WorldClient de l'utilisateur

    #CONCLUSION(CONCLUSION)

    Voilà c'est tout pour la présentation de ma première librairie. J'espère que ce topic aura été suffisamment clair et bien rédigé (la mise en forme s'est révélé être mon talon d’Achille  :'()
    J'ai mis en place un petit sondage, qui me permettra de savoir si bon nombre de personnes sont intéressées par la release et le repo github, dans le cas contraire, celle-ci restera closed-source sous une certaine license.
    Si vous avez d'autres remarques constructives, n'hésitez pas à laisser un commentaire, j'y répondrai dès que possible 😉


  • Administrateurs

    Whaaa, c'est un projet énorme et impressionnant.
    Je pense que beaucoup ici seront intéressé de voir cette bibliothèque publiée ^^



  • J'adore  😮 les vidéos rendent tellement bien ! Après faut voir l'opti, j'espère que ça passe.



  • Merci des retours.
    Oui, l'optimisation reste un point à travailler, comme le mentionne la section "Upcoming features".



  • Wha c'est génial et ça serait vraiment bien utile ^^
    Gg et vivement le passage en 1.8+ 😉


  • Administrateurs

    Cela mériterai aussi un post sur Minecraft Forum. 🙂



  • WOAW.

    Voilà un parfait remplaçant à la CS API !
    Du très très beau travail l'ami !



  • Bonjour à tous ! Rapide message pour vous avertir que la v2.0 sortira, sauf imprévu(s), début février. Elle regroupera à la fois optimisation, gain de consommation de RAM par les modèles chargés et lecture + rapide du fichier binaire.
    Alors n'oubliez pas, si d'ici là le sondage atteint les 20 réponses positives, alors je compléterai la rubrique "Téléchargement". Merci de votre attention portée et bonne soirée/journée.


  • Correcteurs

    Je ne te savais pas aussi compétent Plaigon, en tout cas moi cette API me fait les yeux, c'est très exactement mon domaine d'activité alors je ne peux que te remercier pour la qualité du travail accomplis et à venir



  • Juste un grand whoua, c'est du grand travail comme les autres l'ont déjà dit ^^ Je me rappelle la galère que c'est l'importation d'animations dans
    minecraft et de garantir leur stabilité, vraiment un grand bravo 😉



  • Merci beaucoup Tristepin, ton message m'a fait extrêmement plaisir. L'importation d'animations a toujours été une vraie galère, mais Ama semble avoir réussi avant moi, d'ailleurs il n'est pas exclu que la 3.0 inclue une compatibilité avec sa CraftStudio API, je n'en dis pas + 😉


  • Correcteurs

    Pour ce qui est des items c'est vraiment un aspect différent concernant les importations d'animations de ce type ou pas?



  • Non, aucune différence par rapport aux entités: lire le fichier binaire, l'enregistrer en mémoire (automatique après la lecture) et le dessiner, via IItemRenderer par exemple.



  • Bonjour, bonsoir chers lecteurs,
    rapide message pour vous signaler une update du post initial. J'ai complété la rubrique "téléchargements", malgré un échec au sondage, enfin bon…
    La vidéo tuto sortira d'ici 1 ou 2 semaines, avec la v2.0, en attendant la v1.5 vous permettra tout de même d'importer des .mdl, n'hésitez pas à poser vos questions, j'y répondrai 😃



  • J'ai vraiment hâte de voir le tuto 🙂 !



  • Salut conquerorguepard, content de voir ton message encourageant, mais gardons à l'esprit que patience est mère de sagesse.
    Néanmoins, ce temps perdu à attendre n'est pas vain, pour preuve, j'ai fini le week-end dernier l'optimisation de la ram allouée par la lib, afin d'en faire une réduction astronomique, car avec ce modèle (voir screen + bas), j'ai atteint une taille en mémoire 4 fois moins élevée avec le loader v2.0! Ce qui est littéralement et incroyablement bénéfique lorsqu'on souhaite charger plusieurs dizaines d'animations !



  • On pourra animer des models Techne avec ça ? Ou faut refaire les models sur ton logiciel 😕 ?



  • Non, techne est vieux, il faut passer à autre chose. Si t'es au-delà de la 1.7.10, encore une fois, la lib d'Ama, sera la meilleure option. La mienne sera utile lorsqu'on souhaite importer des animations qu'on a rip d'un jeux video, ou même lorsqu'on sait modéliser sous blender, maya, 3ds max ou autre…
    La 3.0 sera peut-être l'occasion de collaborer avec Ama pour exporter les modèles de Craftstudio en mdl, lisible par ma lib, mais je doute que ce soit une priorité dans l'absolue.



  • Je sais bien, mais tous les anciens models x) ? J'ai pas envie d'avoir tout à refaire 😮 !
    Faudrait tenter de faire un truc pour insérer tout ça par exemple :

    
    package net.minecraft.src;
    
    public class ModelNew extends ModelBase
    {
     //fields
       ModelRenderer tete;
       ModelRenderer corps;
       ModelRenderer jambe_droite_arriere;
       ModelRenderer jambe_gauche_arriere;
       ModelRenderer jambe_droite_avant;
       ModelRenderer jambe_gauche_avant;
       ModelRenderer queue;
       ModelRenderer machoire_haute;
       ModelRenderer machoire_basse;
       ModelRenderer cou;
       ModelRenderer Dos;
    
     public ModelNew()
     {
       textureWidth = 64;
       textureHeight = 32;
    
         tete = new ModelRenderer(this, 10, 18);
         tete.addBox(-1F, -4F, -3F, 3, 4, 3);
         tete.setRotationPoint(-1F, 19F, -8F);
         tete.setTextureSize(64, 32);
         tete.mirror = true;
         setRotation(tete, 0F, 0F, 0F);
         corps = new ModelRenderer(this, 44, 8);
         corps.addBox(-4F, -7F, -4F, 5, 12, 5);
         corps.setRotationPoint(1F, 17F, 0F);
         corps.setTextureSize(64, 32);
         corps.mirror = true;
         setRotation(corps, 1.570796F, 0F, 0F);
         jambe_droite_arriere = new ModelRenderer(this, 0, 19);
         jambe_droite_arriere.addBox(-1F, 0F, -1F, 2, 5, 2);
         jambe_droite_arriere.setRotationPoint(-3F, 19F, 2F);
         jambe_droite_arriere.setTextureSize(64, 32);
         jambe_droite_arriere.mirror = true;
         setRotation(jambe_droite_arriere, 0F, 0F, 0F);
         jambe_gauche_arriere = new ModelRenderer(this, 0, 19);
         jambe_gauche_arriere.addBox(-1F, 0F, -1F, 2, 5, 2);
         jambe_gauche_arriere.setRotationPoint(2F, 19F, 2F);
         jambe_gauche_arriere.setTextureSize(64, 32);
         jambe_gauche_arriere.mirror = true;
         setRotation(jambe_gauche_arriere, 0F, 0F, 0F);
         jambe_droite_avant = new ModelRenderer(this, 0, 19);
         jambe_droite_avant.addBox(-1F, 0F, -1F, 2, 5, 2);
         jambe_droite_avant.setRotationPoint(-3F, 19F, -5F);
         jambe_droite_avant.setTextureSize(64, 32);
         jambe_droite_avant.mirror = true;
         setRotation(jambe_droite_avant, 0F, 0F, 0F);
         jambe_gauche_avant = new ModelRenderer(this, 0, 19);
         jambe_gauche_avant.addBox(-1F, 0F, -1F, 2, 5, 2);
         jambe_gauche_avant.setRotationPoint(2F, 19F, -5F);
         jambe_gauche_avant.setTextureSize(64, 32);
         jambe_gauche_avant.mirror = true;
         setRotation(jambe_gauche_avant, 0F, 0F, 0F);
         queue = new ModelRenderer(this, 0, 1);
         queue.addBox(0F, 0F, 0F, 1, 2, 12);
         queue.setRotationPoint(-1F, 16F, 3F);
         queue.setTextureSize(64, 32);
         queue.mirror = true;
         setRotation(queue, -0.2617994F, 0F, 0F);
         machoire_haute = new ModelRenderer(this, 36, 0);
         machoire_haute.addBox(0F, 0F, 0F, 3, 2, 4);
         machoire_haute.setRotationPoint(-2F, 16F, -14F);
         machoire_haute.setTextureSize(64, 32);
         machoire_haute.mirror = true;
         setRotation(machoire_haute, 0.2443461F, 0F, 0F);
         machoire_basse = new ModelRenderer(this, 23, 19);
         machoire_basse.addBox(0F, 0F, 0F, 3, 2, 3);
         machoire_basse.setRotationPoint(-2F, 16.8F, -13.3F);
         machoire_basse.setTextureSize(64, 32);
         machoire_basse.mirror = true;
         setRotation(machoire_basse, -0.0523599F, 0F, 0F);
         cou = new ModelRenderer(this, 51, 0);
         cou.addBox(0F, 0F, 0F, 3, 4, 3);
         cou.setRotationPoint(-2F, 15F, -8F);
         cou.setTextureSize(64, 32);
         cou.mirror = true;
         setRotation(cou, -0.3816453F, 0F, 0F);
         Dos = new ModelRenderer(this, 26, 10);
         Dos.addBox(0F, 0F, 0F, 3, 2, 6);
         Dos.setRotationPoint(-2F, 15F, -3F);
         Dos.setTextureSize(64, 32);
         Dos.mirror = true;
         setRotation(Dos, 0F, 0F, 0F);
     }
    
     public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5)
     {
       super.render(entity, f, f1, f2, f3, f4, f5);
       setRotationAngles(f, f1, f2, f3, f4, f5);
       tete.render(f5);
       corps.render(f5);
       jambe_droite_arriere.render(f5);
       jambe_gauche_arriere.render(f5);
       jambe_droite_avant.render(f5);
       jambe_gauche_avant.render(f5);
       queue.render(f5);
       machoire_haute.render(f5);
       machoire_basse.render(f5);
       cou.render(f5);
       Dos.render(f5);
     }
    
     private void setRotation(ModelRenderer model, float x, float y, float z)
     {
       model.rotateAngleX = x;
       model.rotateAngleY = y;
       model.rotateAngleZ = z;
     }
    
     public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5)
     {
       super.setRotationAngles(f, f1, f2, f3, f4, f5);
     }
    
    }
    
    

    Ainsi, ça pourrait rajouter de l'intérêt à ton Plaig4anim 😛 ! On pourrait amener tous les models venant des autres logiciels pour faire les animations sur le tiens 😉



  • Très propre tous ça