Worldedit
  Worldedit
Le site sur l'éditeur de warcraft 3 !
 
  FAQFAQ   RechercherRechercher   Liste des MembresListe des Membres    Groupes d'utilisateursGroupes d'utilisateurs   medals.php?sid=cf596f6e2e0cce4e4fff7269ffc1e533Médailles   S'enregistrerS'enregistrer 
 ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 
  FAQFAQ World Editor   UploadUploader une map ou une image    UploadAjouter sa map à l'annuaire   UploadConsulter l'annuaire

Le format MDL

 
Poster un nouveau sujet   Répondre au sujet    Worldedit Index du Forum -> Tutoriels
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
 profet
Instanton Gravitationnel Singulier


Inscrit le: 21 Aoû 2007
Messages: 1633
Sujets: 53
Spécialité en worldedit: Pain d'épice multitâche (terrain, scripts, textures, modèles...)
Médailles: 2 (En savoir plus...)
Rédacteur de tuto #3 (Quantité : 1) Profet (Quantité : 1)

MessagePosté le: 02/02/08 15:39    Sujet du message: Le format MDL Citer

J'ai retrouvé ce vieux tuto que j'avais écrit il y a longtemps en rangeant mes disques durs et je le reposte au cas ou.

Le format .mdl est le format des modèles de WarcraftIII dans leur version "texte" utilisée pour le débuggage principalement.
On peut l'obtenir à partir de la version compressée du modèle (mdx) avec Yogbul Converter.


Language:
Code:
// MDLFile version   Jul 22 2003 15:06:04
// Exported on Sun Feb 20 15:19:42 2005
Version {
   FormatVersion 800,  // Ceci est la version du format
}


Le mdl est une structure de données (Ressemblant aux classes pour ceux qui ont fait de la POO).
On va donc appeler classe chaque type de structure de données que contient le mdl,
ainsi dans l'exemple ci-dessus on a la classe Version, celle-ci est la classe la plus petite du MDL
puisqu'elle ne contient qu'une propriété. On remarque que les classes sont ouverte et fermé avec les accolades { }.
Il en ira de même lorsque nous aurons plusieurs valeurs à entrer dans une propriété (nous verrons cela par la suite).
Nous remarquons également que la fin d'instruction n'est pas indiqué par le retour à la ligne mais par une virgule.
Ainsi nous pouvons très bien écrire
Code:
Material { Layer { FilterMode None, static TextureID 0, } }

Vous remarquerez également que nous avons des classes dans d'autres classes.

Lorsque nous avons plusieurs valeurs alors elles sont séparé par une virgule
Code:
static Color { 0, 0, 0.870588 },

Le séparateur décimale est le point.
Nous n'avons pas de pourcentage mais c'est sur 1.
Ainsi nous avons ici 0.870588 ce qui donnerais en pourcentage environ 87%.
Pour simplifier j'appellerais cela tout de même un pourcentage (pourunage ...).

Le commentaire se fait par le double slash. Le commentaire n'est pas enregistré dans le mdx.
Code:
FormatVersion 800,  // Ceci est la version du format


Le texte (pour le peu que l'on rencontre) est entre double-strophe (")
Citation:
Image "PandarenBrewMaster.blp",






intro/ Structure générale

Code:

MDL {
   Model {
      FormatVersion
   }

   struct Anim (
      Name
      Interval
      NonLooping
      MoveSpeed
      Rarity
   )
   Sequences = #()
   GlobalSequences = #()

   struct Bitmap (
      Image
      WrapWidth
      WrapHeight
      ReplaceableId
   )
   Textures = #()

   struct Material (
      struct Layer (
         FilterMode
         Unshaded
         Unfogged
         TwoSided
         NoDepthTest
         NoDepthSet
         TextureID
         Alpha
      )
      PriorityPlane
   )
   Materials = #()

   struct TVertexAnim (
      Transformations
   )
   TextureAnims = #()

   struct sGeoset (
      Vertices = #()
      Normals = #()
      TVertices = #()
      VertexGroup = #()
      Faces = #()
      Groups = #()
      MaterialID
      SelectionGroup
      Unselectable
   )
   Geoset = #()

   struct GeosetAnim (
      Alpha
      Color
      GeosetId
   )
   
   struct Bone (
      Name
      Parent
      DontInherit
      Rotation
      Billboarded
      GeosetAnimId
   )
)




I/ Identification

Comme la plupart des formats afin de savoir s'il s'agit du format que l'on a besoin,
vu que l'on peut donner n'importe quel nom au fichier et donc changer son extention,
et qu'il y a beaucoup de chances que cette extention de trois lettres soit déjà utilisé
(ex: les modèles de counter-strike sont aussi en .mdl, on en retrouve également dans nwn)
On utilise en début de fichier un identifiant, on peut également indiqué de la sorte sa version.

On le retrouve dans le MDL:
Code:
Version {
   FormatVersion 800,
}

Vous trouverez toujours ces lignes au début de MDL.



II/ Récapitulatif

Code:
Model "planche" {
   NumGeosets 1,
   NumBones 2,
   BlendTime 150,
   MinimumExtent { -377.644, -80.2222, -32.6375 },
   MaximumExtent { 411.107, 973.145, 865.599 },
   BoundsRadius 735.673,
}

Il s'agit d'un aperçut du nombre de chaque classe.
Inutile de modifier ou ajouter tous les Num, ce ne sont pas des données enregistrées dans le MDX.
MinimumExtent,MaximumExtent,BoundsRadius servent aux calcules de collisions,
c'est à dire de la place qu'occupera le modèle dans l'espace, leur précision n'est pas très importantes.
Vous pouvez changer le nom du modèle (planche), mais à ma connaissance il se sert à rien.
BlendTime est le temps pour qu'une bone s'oriente via un ordre extérieur (make bone face unit, canon de la tourelle)





III/ Séquences

Code:
Sequences 2 {
   Anim "Birth" {
      Interval { 333, 1333 },
      NonLooping,
      MinimumExtent { -171.171, -165.605, -73.7988 },
      MaximumExtent { 225.334, 216.131, 258.499 },
      BoundsRadius 279.53,
   }
   Anim "Stand - 1" {
      Interval { 1833, 4833 },
   }
   Anim "Stand - 2" {
      Interval { 5833, 7833 },
      MoveSpeed 220,
      Rarity 3,
      MinimumExtent { -181.442, -165.605, -73.7988 },
      MaximumExtent { 161.931, 166.693, 258.499 },
      BoundsRadius 245.878,
   }
}

Comme expliqué le nombre de séquences ne sert pas.
Les séquences servent à délimiter une animation. Blizzard les a normaliser, vous avez un tableau de cette norme dans le manuel des art tools. Ainsi Stand est l'animation joué par défaut, Birth est joué lors de sa création, walk lorsque l'unité marche, ... .
Interval indique de quel frame à quel frame sera joué l'animation, les frames sont les images à l'écran (fps: Frames Per Second, notre cerveau enregistre 25 frame par seconde), pour des raisons techniques dans le MDL nous avons 1000 frames/secondes, soit 1 frame/ms
(ce qui ne veux pas dire que war3 affiche 1000 frame en 1 secondes ^^). Ainsi l'animation Birth a ici une durée d'une seconde.

Par défaut une animation est joué en boucle, on met alors NonLooping pour éviter cela, ainsi si l'unité meurt et qu'on a dans animation Death NonLooping, alors elle ne tombera qu'une fois.

On n'est pas obligé de changer la valeur de toute les clés pour changer la vitesse d'une animation, on peut utilser MoveSpeed.
Rarity sert à jouer des animations plus rarement que d'autres (pour les animtions de même nom). Ainsi on verra souvent l'animation
Stand - 1 mais ponctué quelque fois par l'animation Stand - 2.



IV/ GlobalSequences

Code:
GlobalSequences 2 {
   Duration 1600,
   Duration 1300,
}

Les Séquences globales servent à jouer une animation en continu, par exemple
_________________

Bêta Systems: 70%
Bêta Spells: 13%
Bêta Arts & graphics: 70%
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur
 Troll-Brain
Ri1kamoua


Inscrit le: 23 Aoû 2007
Messages: 7146
Sujets: 147
Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance
Médailles: 2 (En savoir plus...)
Grand mage créateur de sort (Quantité : 1) Rédacteur de tuto #3 (Quantité : 1)

MessagePosté le: 14/02/08 19:10    Sujet du message: Citer

ce qui m'intéresserait vraiment c'est comment modifier un modèle pour que cela affecte le jeu.

- Dupliquer le modèle et créer des animations insélectionnables
- savoir modifier les traces de passages sur l'herbe la glace, etc
_________________
Le violet, c'est moche.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Anthelme
Anomalie floodiforme


Inscrit le: 28 Aoû 2007
Messages: 1857
Sujets: 93



MessagePosté le: 14/02/08 19:49    Sujet du message: Citer

Je suppose que avec cette technique on peut aussi modifié les animations d'un model nan ?
_________________
Ancien The.gosu
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger
 Troll-Brain
Ri1kamoua


Inscrit le: 23 Aoû 2007
Messages: 7146
Sujets: 147
Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance
Médailles: 2 (En savoir plus...)
Rédacteur de tuto #3 (Quantité : 1) Grand mage créateur de sort (Quantité : 1)

MessagePosté le: 14/02/08 19:53    Sujet du message: Citer

The.gosu a écrit:
Je suppose que avec cette technique on peut aussi modifié les animations d'un model nan ?


euh il n'a exposé aucune technique mais simplement une vague description un peu brouillon d'une partie de ses connaissances dans le domaine Razz
_________________
Le violet, c'est moche.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Anthelme
Anomalie floodiforme


Inscrit le: 28 Aoû 2007
Messages: 1857
Sujets: 93



MessagePosté le: 14/02/08 20:17    Sujet du message: Citer

Oui enfin je ne suis pas complètement con non plus, je sais que avec le format mdx on ne peut pas modifié les animations ( et d'ailleur pas faire grand chose ) mais avec ce que vient d'expliquer profet je suppose que avec le format mdl c'est possible.
_________________
Ancien The.gosu
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger
 profet
Instanton Gravitationnel Singulier


Inscrit le: 21 Aoû 2007
Messages: 1633
Sujets: 53
Spécialité en worldedit: Pain d'épice multitâche (terrain, scripts, textures, modèles...)
Médailles: 2 (En savoir plus...)
Rédacteur de tuto #3 (Quantité : 1) Profet (Quantité : 1)

MessagePosté le: 14/02/08 20:47    Sujet du message: Citer

The.gosu a écrit:
Oui enfin je ne suis pas complètement con non plus, je sais que avec le format mdx on ne peut pas modifié les animations ( et d'ailleur pas faire grand chose ) mais avec ce que vient d'expliquer profet je suppose que avec le format mdl c'est possible.
Tu peux très bien modifier des animations avec un mdx, simplement les données sont en binaire, ou en hexa si tu l'ouvres avec un éditeur approprié ce qui n'est pas évident ^^
_________________

Bêta Systems: 70%
Bêta Spells: 13%
Bêta Arts & graphics: 70%
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur
 Gevans
Back


Inscrit le: 21 Aoû 2007
Messages: 1930
Sujets: 85

Médailles: 2 (En savoir plus...)
Rédacteur de tuto #1 (Quantité : 1) Gevans (Quantité : 1)

MessagePosté le: 26/03/08 16:05    Sujet du message: Citer

Je poste ici un tuto d'Ayane datant de l'ancien forum



Dans ce tutorial nous allons voir comment créer un modèle assez simple: une aura (un heroglow ici). Celle-ci sera donc attachable par effet spécial. L'objectif étant de se familiariser avec le format et savoir ainsi en modifier avec un simple éditeur de texte.

Outils:
- Editeur de texte (comme le bloc-note).
- Yogbul's Converter
- WC3 Viewer

Yogbul's Converter nous permettra de convertir un fichier MDL en MDX et vice-versa, bien que WC3 accepte le MDL c'est un format de déboguage (textuel) il prendra plus de place et sa lecture mettra plus de temps.
WC3 Viewer va nous permettre de visualiser le résultat sans passer par WC3. Néanmoins aillez toujours à l'esprit qu'il ne traîte pas les données de la même manière que WC3 surtout aux niveaux des erreurs que vous pourrez faire. Ainsi un modèle qui s'affiche correctement sous WC3Viewer poura ne pas s'afficher sous WC3 et il peut aussi arriver le contraire.


Ouvrons donc notre éditeur de texte et commençons à créer notre modèle:



Code:

// Name: HeroGlow
// Author: Ayane

Version {
   FormatVersion 800,
}


Les doubles slashs permettent d'indiquer qu'il s'agit d'un commentaire, cela ne sera donc pas enregistrer dans le MDX.
Pour un bloc Version avec pour seule propriété FormatVersion nous lui affectons la valeur 800.
Autrement dit nopus définissons la version du format du modèle, on mettra donc toujours 800.

NB: Pourquoi 800? 800 en hexadécimale c'est $0320, hors en MDX le mode de stoquage est en little endian, autrement dit il faut inverser chaque octet d'un nombre, ce qui donne $2003 lorsqu'on lit le fichier avec un héditeur hexadecimal. 2003 cela correspond à l'année de sortie de WC3.



Code:
Model "HeroGlow"


On définis le nom du modèle: "HeroGlow"


On va commencer par indiquer la texture que l'on va utiliser
Code:
Textures 1 {
Bitmap {
Image "",
ReplaceableId 2,
}
}

On aurais put mettre un chemin pour la propriété Image ("mondossier\\matexture.blp"), mais à la place ici j'ai mis le chemin du heroglow grâce à ReplaceableId car la texture change suivant le joueur. La valeur 1 est le teamcolor et 3 c'est pour les arbres.


La texture n'est pas directement appliquée, la manière dont elle doit être traîtée et qu'elle doit être appliquée est déterminer dans un material. Celui-ci peut être composer de plusieurs couches, chaque couche ayant une texture.


Code:
Materials 1 {
   Material {
      Layer {
         FilterMode Transparent,
         Unshaded,
         static TextureID 0,
      }
   }
}


On défini donc un material n'ayant qu'une couche, celle-ci indique qu'elle utilise la texture 0, qu'il utilise un filtre de trnasparence, c'est à dire qu'il en compte la couche alpha, Unshaded indique qu'il ne faut pas faire d'ombres dessus.


Maintenant qu'on a notre début on va définir la structure géométrique de notre aura, on va donc donner les données nécessaires au dessinage d'une plaque (un simple carré). Pour rappel une forme géométrique est composé de points que l'on appel vertices (un vertex, des vertices), ceux-ci sont relier afin de former des faces. On y rajoute également des normales à chaque points qui vont servir à calculer la réflection de la lumière (autrement dit les ombres), et on peut grouper les vertices afin de les mettres dans des matrices de tranformations et ainsi faire des animations (ce sera pour plus tard).

NB: Un vertex n'est pas un point car par définition un point est caractérisé par sa position, hors un vertex comprend d'autres données comme par exemple sa normale, sa couleur, sa position sur les textures, ...

Geoset est un ensemble géométrique, en gros il comprend l'ensemble ayant la même texture.

Code:
Geoset {




Code:
   Vertices 4 {
      { -100, -100, 0 },
      { 100, -100, 0 },
      { 100, 100, 0 },
      { -100, 100, 0 },
   }



On indique pour cheque vertex sa position sur la texture (de 0 à 1)
Code:

   TVertices 4 {
      { 0, 0 },
      { 1, 0 },
      { 1, 1 },
      { 0, 1 },
   }




Maintenant on va indiquer les faces à dessiner

Code:
   Faces 1 4 {
      Quads {
         { 0, 1, 2, 3 },
      }
   }


Quads indique qu'il s'agit de quadrilatères, généralement vous retrouverez Triangles et il y très peu de personnes qui savent que l'on peut faire autre chose que des triangles (avec deux triangles on peut faire un quadrilatère). Il y en a une dizaine d'on notament les lignes (fil de fer), et les points.
Donc on a fait une face carré qui relie les vertices 0, 1, 2, 3, autrement dit les 4 vertices de notre geoset.
NB: l'ordre de liaison d'un face est important car une face n'est visible que d'un côté. C'est en fonction des positions des vertices, pour la rendre visible "de votre côté" faîtes "tourner" dans le sens des aiguilles d'une montre. Il existe une propriété qui permet de rendre visible les faces d'un geoset des deux côtés: il faut ajouter dans le material la propriété TwoSided (en dessous de Unshaded). Vous pouvez aussi refaire une deuxième de l'autre sens.

On va terminer en indiquant le material utilisé par le geoset et on va le rendre insélectionnable

Code:
   MaterialID 0,
   Unselectable,
}



Donc voila ce que donne notre modèle
Code:
// Name: Aura
// Author: worldedit
// http://worldedit.free.fr

Version {
   FormatVersion 800,
}

Model "HeroGlow"

Textures 1 {
   Bitmap {
      Image "",
      ReplaceableId 2,
   }
}

Materials 1 {
   Material {
      Layer {
         FilterMode Transparent,
         Unshaded,
         static TextureID 0,
      }
   }
}


Geoset {

   Vertices 4 {
      { -100, -100, 0 },
      { 100, -100, 0 },
      { 100, 100, 0 },
      { -100, 100, 0 },
   }

   TVertices 4 {
      { 0, 0 },
      { 1, 0 },
      { 1, 1 },
      { 0, 1 },
   }

   Faces 1 4 {
      Quads {
         { 0, 1, 2, 3 },
      }
   }

   MaterialID 0,
   Unselectable,

}




Je l'ai fait de tête et je n'en ais pas fait depuis longtemps, donc des erreurs ce sont peut-être glissées, je corrigerai plus tard.


Question : Cette méthode n'est-elle pas un peu hard pour des models en 3D ??



Réponse :
En effet on ne va pas concevoir de modèles d'unités comme cela car on n'a pas vraiment de support visuel, on ne fait que manipuler les données, cela prendrais donc trop de temps.
Par contre c'est très bien pour éditer un modèle, comprendre ce qu'est un modèle, modifier des données que les éditeurs ne gèrent pas, et par extention créer ses propres programmes d'éditions.

Ayant fait pendant un bon moment du MDL editing, j'ai du coup développé mes propres scripts.
Le premier, pour le geoset voulue me changeait sa position, c'est à dire que dans notre exemple

Code:
Vertices 4 {
      { -100, -100, 0 },
      { 100, -100, 0 },
      { 100, 100, 0 },
      { -100, 100, 0 },
   }


Si je voulais le déplacer en hauteur de 30 cela devenait

Code:
Vertices 4 {
      { -100, -100, 30 },
      { 100, -100, 30 },
      { 100, 100, 30 },
      { -100, 100, 30 },
   }



Après j'ai fait la rotation, puis le redimensionnement (homothétie). Ainsi que les symétries.
Je m'en suis également fais un qui me servait beaucoup pour répondre aux demandent, car à cette époque on faisait les modèles à la demande et à la volée, il me permettait de comparer deux MDL et de supprimer dans le premier ce qui apparaissait dans le deuxième. En gros il n'y avait pas d'importeurs/exporteurs d'animations, j'importais sous 3dsmax, je gardais seulement ce que je voulais supprimer, puis je l'exportais, ensuite je faisais appel à mon script. Du coup j'obtenais par exemple une unité sans armes tout en conservant ses animations.

Enfin c'était il y a longtemps, à l'époque il n'y avait qu'un tutorial qui montrais comment faire un cube et lui appliquer une texture. J'ai mené beaucoup d'études et de testes sur ce format. Uniquement avec le bloc-note j'ai ainsi put sortir la panthère et le tigre sans cavaliers, c'est long et fastidieux mais le résultat est là. Je suis également l'auteur du HeroGlow qu'on ajoute par effet spécial ainsi que de l'épée du Zealoth de Côtel.

Je vais donc essayer lorsque j'en ais le temps d'en transmettre un maximum. Je devrais aussi fournir une librairie de lecture/écriture et peut-être de visualisation, ainsi vous pourrez plus facilement développer vos propres scripts et peut-être développer un logiciel commun.



Chaque vertex a un groupe, à chaque groupe on lui attribue une matrice de transformation. Cette matrice pointe sur un ou plusieurs bones (os), des objets contenant les transformations à effectuer.
Donc par exemple:

On a deux vertices
Code:
Vertices 2 {
{ 0, 0, 0 },
{ 10, 20, 30 },
}


C'est deux vertices appartiennent au groupe 0
Code:
VertexGroups 2 {
0,
0,
}


On a la matrice du groupe 0 qui pointe vers l'objet 0 et 1
Code:
Matrices 1 {
{ 0, 1 },
}


Nos deux bones
Code:
Bone "Bone0" {
ObjectId 0,
Translation { 0, 0, 50 }, // ce n'est pas vraiment comme cela que c'est écrit
}

Bone "Bone1" {
ObjectId 1,
Translation { 24, 0, 0 }, // ce n'est pas vraiment comme cela que c'est écrit
}



Donc lors de l'animation la matrice aura cette transformation:
Translation { 24, 0, 50 }
Qu'elle appliquera à chaque vertex de son groupe.
Donc les positions des vertices deviendront
Code:
{ 24, 0, 50 },
{ 34, 20, 80 }
,


Enfin j'en ai beaucoup dis, ce sera développé plus en détail pour une prochaine fois.
_________________
Si vous recherchez quelque chose, il y a de très grandes chances que vous trouviez la réponse ici alors jetez y un oeil.
Topic indispensable
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Envoyer l'e-mail Visiter le site web du posteur MSN Messenger
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Worldedit Index du Forum -> Tutoriels Toutes les heures sont au format GMT + 1 Heure
Page 1 sur 1

 
Sauter vers:  
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com