Article     Discussion     Modifier     Historique     Forums     Salon IRC

MS3D

Un article de Games Creators Network.

Sommaire

[modifier] Description

Les fichiers Milkeshape 3d contiennent des informations sur des objets en trois dimensions, ainsi que sur leurs textures et les animations correspondantes.

[modifier] Structure des fichiers

[modifier] Taille des champs

Tout d'abord, je vous donne ci-dessous un tableau récapitulatif pour les tailles et les types en Visual Basic et en C.

Bytes Visual basic C
1 byte Byte Byte
2 bytes Integer WORD
4 bytes Long DWORD
4 bytes floating Single float
8 bytes floating Double double
Multiple text size String char

Pour les utilisateurs de C voici les types Word et Bytes :

#ifndef byte
typedef unsigned char byte;
#endif
 
#ifndef word
typedef unsigned short word;
#endif

[modifier] Définition

  • 4 vertices (pluriel), 1 vertex (singulier).
  • 1 vertex est un point dans l'espace (3 coordonnées, x,y,z).
  • 3 vertices forment 1 triangle
  • Un vecteur est composé de trois variables :
    • x = 4 bytes floating
    • y = 4 bytes floating
    • z = 4 bytes floating
  • floating précise qu'il s'agit de nombres réels, c'est-à-dire par forcément entiers.

[modifier] Structure d'un fichier MilkShape 3d

Dans l'ensemble du fichier il y a des drapeaux (flags), ils représentent les différentes façon d'apparaitre à l'écran, voici les définitions en C :

#define SELECTED        1
#define HIDDEN          2
#define SELECTED2       4
#define DIRTY           8

[modifier] En-tête

Les premiers bytes d'un fichier MilkShape 3d forment une en-tête, ou header. Dix bytes sont réservés pour une identification, de valeur égale à "MS3D000000".

En VB on écrit : Dim Id as String * 10 et en C :

char Id[10]
  • 2 bytes sont utilisés pour la version du fichier, qui est égale à 8.

Ce qui, en C, donne :

typdef struct {
char    id[10];
int     version;
} ms3d_header_t;

[modifier] Récupération des vertices

  • 2 bytes sont réservés à une utilisation ultérieure (dans la plupart des cas c'est 0).
  • Ensuite 2 bytes donnent le nombres total de vertices (short en C).
  • Puis pour chaque vertex :
    • un drapeau As Byte
    • x As Single
    • y As Single
    • z As Single
    • Bone As Byte (comprendre squelette ou structure)
    • reference As Byte

Application en C :

word unknow;
 
word nNumVertices;
 
typedef struct {
byte    Drapeau;
float   vertex[3];
char    boneId;
byte    referenceCount;
} ms3d_vertex_t;

[modifier] Récupération des Triangles

  • Les 2 premiers bytes donnent le nombre total de triangles
  • Puis pour chaque triangle :
    • Drapeau As Integer
    • IndiceVertex0 As Integer
    • IndiceVertex1 As Integer
    • IndiceVertex2 As Integer
  • Les bytes suivant peuvent être ordonnés comme montré dans ce tableau :
NormalVertex_0_X NormalVertex_0_Y NormalVertex_0_Z
NormalVertex_1_X NormalVertex_1_Y NormalVertex_1_Z
NormalVertex_2_X NormalVertex_2_Y NormalVertex_2_Z

En fait, il y a 3 vecteurs pour donner la normale du triangle , au format Single :

  • s1 As Single
  • s2 As Single
  • t1 As Single
  • t2 As Single
  • SmoothingGroup As Byte
  • IndexGroup As Byte

Application à C :

word nNumTriangles;
 
typedef struct {
word    flags;
word    vertexIndices[3];
float   vertexNormals[3][3];
float   s[3];
float   t[3];
byte    smoothingGroup;
byte    groupIndex;
} ms3d_triangle_t;

[modifier] Récupération des Groupes  :

Les Groupes sont aussi appelés Mesh

  • Comme précédement le nombre total de groupes est codé sur 2 bytes
  • Puis pour chaque groupe ::
    • Drapeau As Integer
    • Nom as string (32 bytes max)
    • NumberTriangles As Integer
    • TrianglesIndices as Integer, c'est un grand tableau avec les dimensions de NumberTriangles - 1
    • MaterialIndex as byte, si c'est égale à -1 il n'y a pas de matériaux

Application en C :

word nNumGroups;
 
typedef struct {
byte            Drapeau;
char            name[32];
word            numtriangles;
word            triangleIndices[numtriangles];
char            materialIndex;
} ms3d_group_t;

[modifier] Récupération des Matériaux (si il y en a)  :

  • Number of Material As Integer : Seulement si Number est supérieur à 1 alors pour chaque vertex il y a :
    • Nom As String (32 bytes max)
    • Ambient :
      • Ambient X As Single
      • Ambient Y As Single
      • Ambient Z As Single
    • Diffus :
      • Diffus X As Single
      • Diffus Y As Single
      • Diffus Z As Single
    • Speculaire :
      • Speculaire X As Single
      • Speculaire Y As Single
      • Speculaire Z As Single
    • Emetteur :
      • Emetteur X As Single
      • Emetteur Y As Single
      • Emetteur Z As Single
    • Glow As Single
    • Transparency As Single
    • Mode As String
    • Texture As String (128 bytes max)
    • MapAlpha As String (128 bytes max)

Application en C :

word nNumMaterials;
 
typedef struct {
char            name[32];
float           ambient[4];
float           diffuse[4];
float           specular[4];
float           emissive[4];
float           shininess;
float           transparency;
char            mode;
char            texture[128];
char            alphamap[128];
} ms3d_material_t;

[modifier] Récupération des Animations :

  • Nombre d'images par seconde As Single
  • Temps Courant As Single

Le temps où le fichier 3d est enregistré (l'image selectionnée à l'enregistrement)

  • Nombre d'images As Integer :

Presque fini !! Il faut imaginer qu'une structure c'est un arbre généalogique avec au centre tous les points qui se relient, exemple : la colone vertébrale..

  • Nombre de structures (Bone) As Integer
  • Drapeau As Byte
  • Nom As String (32 byte max)
  • Nom du parent As String (32 byte max)
  • Rotation :
    • RotationX As Single
    • RotationY As Single
    • RotationZ As Single
  • Position :
    • PositionX As Single
    • PositionY As Single
    • PositionZ As Single
  • Nombre de frame clé par rotation As Integer
  • Nombre de frame clé par translation As Integer
  • Pour chaque frame clé de rotation :
    • Temps as Single ---- Temps en seconde
    • Rotation :
      • X as Single
      • Y as Single
      • Z as Single
  • Pour chaque frame clé de translation :
    • Temps as Single ---- Temps en seconde
    • Translation :
      • X as Single
      • Y as Single
      • Z as Single

Application en C:

float fAnimationFPS;
float fCurrentTime;
int iTotalFrames;
 
word nNumJoints;
 
typedef struct {
float           Temps;
float           rotation[3];
} ms3d_keyframe_rot_t;
 
typedef struct {
float           time;
float           position[3];
} ms3d_keyframe_pos_t;
 
typedef struct {
byte            Drapeau;
char            name[32];
char            parentName[32];
float           rotation[3];
float           position[3];
 
word            numKeyFramesRot;
word            numKeyFramesTrans;
 
ms3d_keyframe_rot_t keyFramesRot[numKeyFramesRot];
ms3d_keyframe_pos_t keyFramesTrans[numKeyFramesTrans];
} ms3d_joint_t;

[modifier] Les quelques mots de la fin

Pour obtenir la transformation liée à l'animation, il faut :

  • construire les matrices à partir de la rotation et de la position
  • multiplier les vertices
  • translater le résultat avec les frames clés de translation et de rotation.

 

Rechercher
Installer l'extension de recherche Plus d'informations

 

Comprendre
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends. - Benjamin Franklin

 

Partager
La connaissance est la seule chose qui s'accroit lorsqu'on la partage. - Sacha Boudjema

 

Créer
L'imagination est plus importante que la connaissance. - Albert Einstein

 

 

Le wiki en images Le wiki en images Image du mois: «Snowball: un prototype de jeu développé avec NeL.