Developpez.com - Rubrique 2D-3D-Jeux

Le Club des Développeurs et IT Pro

OpenCTM : Format de fichier ouvert pour la compression de meshes 3D

Le 2009-09-02 15:01:55, par loka, Rédacteur


OpenCTM est un format de fichier et une librarie pour les meshes 3D (CTM = Compressed 3D Triangle Meshes). La geométrie est compressée à une fraction de formats de fichiers comparable(3DS, STL, VRML...) et le format est facilement accessible via une API simple et portable.

Les grandes geométries supérieurs au milliard de triangles et arêtes peuvent être stockées (OpenCTM utilise des indices de face 32-bit). Le SDK OpenCTM est open source et est écris en C.

Voici comment charger un fichier ctm :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include 
CTMcontext context;
CTMuint  vertCount, triCount, * indices;
CTMfloat  * vertices;

 // Create a new context
 context = ctmNewContext(CTM_IMPORT);

 // Load the OpenCTM file
 ctmLoad(context, "mymesh.ctm");
 if(ctmGetError(context) == CTM_NONE)
 {
    // Access the mesh data
    vertCount = ctmGetInteger(context, CTM_VERTEX_COUNT);
    vertices = ctmGetFloatArray(context, CTM_VERTICES);
    triCount = ctmGetInteger(context, CTM_TRIANGLE_COUNT);
    indices = ctmGetIntegerArray(context, CTM_INDICES);

    // Deal with the mesh (e.g. transcode it to our
    // internal representation)
    // ...
 }

 // Free the context
 ctmFreeContext(context);
et voici comment créer un fichier ctm à partir de votre propre géométrie :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include 
CTMcontext context;
CTMuint  vertCount, triCount, * indices;
CTMfloat  * vertices;

// Create our mesh in memory
vertCount = 100;
triCount = 120;
vertices = (CTMfloat*)malloc(3*sizeof(CTMfloat)*vertCount);
indices = (CTMuint*)malloc(3*sizeof(CTMuint)*triCount);
// ...

// Create a new context
context = ctmNewContext(CTM_EXPORT);

// Define our mesh representation to OpenCTM (store
// references to it in the context)
ctmDefineMesh(context,
                       vertices,
                       vertCount,
                       indices,
                       triCount,
                       NULL);

// Save the OpenCTM file
ctmSave(context, "mymesh.ctm");

// Free the context
ctmFreeContext(context);

// Free our mesh
free(indices);
free(vertices);
Vous pouvez télécharger le SDK OpenCTM Ici.

Pensez-vous qu'il soit necessaire de créer de nouveau format de compression pour les meshes 3D ?
Ces nouveaux formats de compression vont-il permettre aux graphistes 3D de mieux s'exprimer ?
  Discussion forum
2 commentaires
  • Lucyberad
    Membre du Club
    Je suis pas franchement emballé.
    Le collada est son principal concurrent et il peine déjà à être porté sur de nombreux éditeurs. Sa force vient pourtant de sa simplicité de syntaxe.
    Il a un défaut qu'OpenCTM corrige: il ne propose pas officiellement de version binaire (alors que FBX lui le possède).
    Je n'y voit pas vraiment l'intêret au sein d'un jeu (peut-être ailleurs) puisqu'un moteur digne de ce nom possède un principe de "content processing" qui consiste à transformer le modèle donné en binaire "prêt à être chargé en objet" dans le programme (plus clairement: un dump de l'objet qui va être fournit au client (et donc légèrement obsfuqué de la sorte) et rapidement lu par le moteur puisque c'est lui qui crée le dump sans donnée superflues).
    Mais ca peut fournir un solution rapide à mettre en place au sein d'un moteur qui n'a pas le temps de voir du content processing s'y greffer.
  • Kromagg
    Membre habitué
    Bonjour

    Je voulais savoir si OpenCTM supporte les submesh quand il y a différents matériaux appliqués sur un même mesh ?

    Kromagg