Parse WaveFrontObject Mesh

Généralités sur la programmation 3D
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Parse WaveFrontObject Mesh

Message par Guimauve »

Bonjour à tous,

Tel que promis dans le sujet Un plugin 3ds pour la 3D voici le code de chargement d'un fichier WaveFrontObject complet en mémoire.
Comme je l'ai mentionné, le passage entre la WaveFrontMesh vers le système de commande interne n'est implémenté à vous de le faire.

De plus, le code n'a été testé uniquement sur des fichiers WaveFront généré par Rhinceros 3D 2.0, il est donc possible qu'un autre fichier généré par un autre logiciel cause des problèmes ce sera à vous de corriger le tir.

L'archive contient un répertoire "Data" avec un fichier *.obj, un fichier *.mtl et un fichier *.bmp et bien entendu le code source de la WaveFrontMesh et un exemple de démonstration. WaveFrontObjectLoader.zip

Dernier point, le chargement total fonctionne uniquement si les fichiers *.obj et *.mtl se trouvent dans le même répertoire. De plus, le code de chargement de texture que j'utilise est pour de l'OpenGL pure, il n'est pas inclut. Mais il est possible de l'ajouter à la fin de la commande ParseWaveFrontObjectMesh() et dans ce cas de figure la texture doit également accompagner les fichiers *.obj et *.mtl dans le répertoire de chargement.

A+
Guimauve
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Parse WaveFrontObject Mesh

Message par Cool Dji »

Bonjour Guimauve,

J'ai testé avec un export fait sous Deled, ça passe pas mais je vais pousser les tests car il y a plusieurs options dans l'export. Je regarde ça et merci encore pour le partage.
Only PureBasic makes it possible
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Re: Parse WaveFrontObject Mesh

Message par Guimauve »

Cool Dji a écrit :Bonjour Guimauve,

J'ai testé avec un export fait sous Deled, ça passe pas mais je vais pousser les tests car il y a plusieurs options dans l'export. Je regarde ça et merci encore pour le partage.
Normalement, le fichier WaveFrontObject est standardisé, donc il ne devrait pas y avoir de problème en théorie. En pratique par contre je sais que ce n'est pas toujours le cas.

S'il y a un problème, signale le ici puisque je risque de le rencontrer moi aussi dans mon projet.

A+
Guimauve
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Re: Parse WaveFrontObject Mesh

Message par Guimauve »

Bonjour à tous,

Je viens de mettre à jour le code source (l'archive compressée est au même endroit), j'ai apporté quelques changements au niveau du chargement du fichier *.mtl. Il prend maintenant en compte :
  • le paramètre : Dissolved
  • le paramètre : Illumination (J'ai ajouté les constantes voir fichier Material.pb)
  • le paramètre : SpecularCoeff
  • la texture : Ambient
  • la texture : Specular
  • la texture : Alpha
  • la texture : Bump
Pour le chargement des Indices, il y a un trruc que je ne comprend pas bien. Dans le cas d'un triangle il y a :

f v1/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3

Seulement les valeurs de v1, vt1, et vn1 peuvent être différente. Dans le cas des modèles générés pas Rhinocéros 3D 2.0, les valeurs sont les mêmes ce qui me semble logique. Cependant comment on passe vers un moteur 3D où même vers OpenGL les indices si ces derniers sont différents pour les vertex, les Coordonnées de texture et les normales. Bien entendu, mon code ne prend pas cet aspect en compte pour le moment.

A+
Guimauve
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Re: Parse WaveFrontObject Mesh

Message par Guimauve »

Bonjour à tous,

Et une autre mise à jour (Voir le premier message pour le lien de téléchargement) :

Récupération du nom du fichier *.mtl --> S'il y avait un espace dans le nom il était tronqué et causait des problèmes
Récupération du nom d'une sous-mesh --> S'il y avait un espace dans le nom il était tronqué et causait des problèmes
Sélection du nom de material --> S'il y avait un espace dans le nom il était tronqué et causait des problèmes
Par défaut le nom de la Mesh est le nom du fichier, si un nom d'objet est trouvé c'est ce nom d'objet que prendra la mesh.

Ajout d'une variante pour le paramètre "Dissolve" qui est en fait le niveau de transparence.

Dans l'archive j'ai ajouté un modèle généré par Ultimate Unwrap 3D pour voir la différence entre la forme des données par rapport à celui généré par Rhinocéros 3D.

A+
Guimauve
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Parse WaveFrontObject Mesh

Message par Cool Dji »

Bonjour Guimauve,

tu as récupéré les spécifications du format .obj sur quel site ?
j'ai chopé ça via wikipedia : http://people.sc.fsu.edu/~jburkardt/txt/obj_format.txt

Les deux exemples .mtl n'ont pas le même format et j'aurais plus fait confiance au format que tu génères par Ultimate Unwrap3D que celui généré par Rhino. Comme quoi...
Only PureBasic makes it possible
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Re: Parse WaveFrontObject Mesh

Message par Guimauve »

Cool Dji a écrit :Bonjour Guimauve,

tu as récupéré les spécifications du format .obj sur quel site ?
j'ai chopé ça via wikipedia : http://people.sc.fsu.edu/~jburkardt/txt/obj_format.txt

Les deux exemples .mtl n'ont pas le même format et j'aurais plus fait confiance au format que tu génères par Ultimate Unwrap3D que celui généré par Rhino. Comme quoi...
Pour ce qui est du fichier *.mtl généré par UU3D (Ultimate Unwrap 3D), la différence vient seulement du fait que j'ai mis en place 1 seul matériau pour le modèle, j'aurais pu mettre 4 matériaux différents et le fichier aurait été sensiblement le même. Mais en effet, Rhino exporte peut-être un peu moins d'information à propos des matériaux que UU3D. Un autre point, UU3D ajoute des commentaires dans le fichier avec des informations que personnellement je trouve peu pertinente, de toute façon, il est inutile de chercher à utiliser ces informations puisque elles sont spécifiques au programme qui l'a généré.

Ceci étant dit, je ne charge pas le modèle 3D directement dans mon jeu, non. Je le charge dans mon éditeur (en cours de développement) afin de réorganiser le UV Mapping, ajuster les matériaux, générer les Skins (Groupe de texture de différentes couleurs), la taille du modèle 3D (histoire de ne pas se retrouver avec un Super Destroyer de 17.5 m de long et un chasseur qui fait 17.5 km de long) et plein d'autre truc encore. Le fichier à la sortie de mon éditeur est correctement paramétré pour mon moteur 3D.

J'ai donnée les deux exemples pour montrer les différences d'organisation des données entre les fichiers *.obj et non les fichiers *.mtl. Le système de chargement du fichier *.mtl qu'il provienne de Rhino ou de Ultimate Unwrap ne risque pas de planter.

Pour les spécifications, c'est un croisement entre http://en.wikipedia.org/wiki/Wavefront_.obj_file et http://paulbourke.net/dataformats/obj/. Quoique le premier est très complet mais il est en Anglais tout comme le deuxième. Moi ça ne pose pas de problème mais ...

A+
Guimauve
Répondre