[C#] OBJ import/export

Cette section est destinée aux scripts partagés par la communauté. Chaque post est destiné à un script. Suivez bien les recommandations.
Avatar de l’utilisateur
artemisart
Messages : 1893
Inscription : 21 Juin 2011 19:51
Localisation : Centre
Contact :

[C#] OBJ import/export

Message par artemisart » 04 Oct 2012 20:37

-NOM DU SCRIPT : ImportExport (ce qu'on veut en fait, c'est pas une classe monobehaviour donc ça n'a pas d'importance).

-AUTEUR : artemisart

-DESCRIPTION :
Ce script permet de sauvegarder un mesh au format obj dans un string ou un fichier directement et d'un charger un depuis un string, un fichier ou un TextReader (hérité par StreamReader et StringReader).
Il supporte "seulement" les vertices, uv (1ère couche), normals et faces (les quads sont triangulisés mais il vaut mieux exporter en tris car le résultat peut être... surprenant :D ).
=> pas de support des smoothing group/mtl/...

Ce script est tiré de mon tool, c'est pour ça que un autre format apparait dans le code, mais il n'est pas implémenté (c'est aussi pour ça qu'il faut préciser les SaveFormat et LoadFormat).

Cette nouvelle version permet d'optimiser la taille des fichiers et permets d'importer directement un fichier obj exporté d'un log de modé, ce qui n'était pas le cas avant.
Pour pouvoir importer le fichier d'un logiciel externe, il faut bien penser à inclure les uv et les normales, sinon le script ne charge aucun triangle ^^ et toutes les instructions non supportés sont ignorées, cad que l'import ne plantera pas (il ne devrait pas non plus y avoir d'erreurs).
Toutes les anciennes fonctions sont restés, il suffit de rajouter Simple devant leur nom pour y accéder.

-UTILISATION :
J'ai essayé de faire le plus simple possible pour l'utilisation, je suis donc passé par les méthodes d'extension :

NOUVEAU CODE :

Code : Tout sélectionner

// sauvegarde le mesh dans un fichier
aMesh.SaveToFile (@"D:\Mes documents\Unity Projects\Blabla\meshToSave", SaveFormat.OBJ, false);
	// 1 : path : chemin du fichier sans l'extension
	// 2 : format : format du fichier (uniquement SaveFormat.OBJ pour le moment)
	// 3 : overwrite : écrase le fichier ou non, si le fichier existe et que overwrite est à false, Debug.LogWarning est appelé

// sauvegarde le mesh dans un string
string text = aMesh.SaveToText (SaveFormat.OBJ);


// charge un mesh à partir d'un fichier
aMesh.LoadFromFile (@"D:\Mes documents\Unity Projects\Blabla\meshToLoad", LoadFormat.OBJ);
	// 1 : path : chemin du fichier sans l'extension
	// 2 : format : format du fichier (uniquement SaveFormat.OBJ pour le moment)

// charge un mesh à partir d'un TextReader
aMesh.LoadFromStream (aReader, LoadFormat.OBJ);
ANCIEN CODE :

Code : Tout sélectionner

// sauvegarde un mesh dans un fichier, par défaut en obj
aMesh.SimpleSaveToFile (@"Le\chemin\du\fichier\sans\extension");

// dans un string
aString = aMesh.SimpleSaveToText ();


// charge un mesh à partir d'un fichier
aMesh.SimpleLoadFromFile (@"Le\chemin\du\fichier\avec\extension");
// OU
aMesh.SimpleLoadFromFile (@"Le\chemin\du\fichier\sans\extension", LoadFormat.OBJ);

// à partir d'un string
aMesh.SimpleLoadFromText (aText, LoadFormat.OBJ);

// à partir d'un TextReader
aMesh.SimpleLoadFromStream (aReader, LoadFormat.OBJ);
-SCRIPT :
Il est un peu (beaucoup) long, donc je l'ai mis là : http://pastebin.com/7sLteqNw

Voilà :D !


Si vous avez des problèmes, merci de préciser tout ce que vous pouvez et de poster le fichier obj s'il y en a un.
Bien sûr, les commentaires, propositions d'amélioration, d'optimisation, demandes d'explication/de rajout de commentaires :mrgreen: , ... sont les bienvenus !


PS : c'est possible que certains commentaires soit mal formulés/complètements foireux, corrigez moi si vous voyez une horreur ^^
Dernière édition par artemisart le 04 Nov 2012 03:54, édité 3 fois.

sotec
Messages : 542
Inscription : 21 Sep 2012 10:11

Re: [C#] OBJ export/import

Message par sotec » 05 Oct 2012 09:42

merci beaucoup :mrgreen:
┬─┬ノ(º - ºノ) - (╯°□°)╯︵ ┻━┻

Avatar de l’utilisateur
axel
Messages : 1924
Inscription : 26 Avr 2012 09:10
Localisation : Lille - Dunkerque
Contact :

Re: [C#] OBJ export/import

Message par axel » 05 Oct 2012 11:03

génial, merci :D

Avatar de l’utilisateur
artemisart
Messages : 1893
Inscription : 21 Juin 2011 19:51
Localisation : Centre
Contact :

Re: [C#] OBJ export/import

Message par artemisart » 06 Oct 2012 18:26

Oouuups, je me disais bien que j'avais oublié quelque chose :mrgreen: .

J'ai oublié de fermer le TextReader dans la fonction LoadFromStream, donc il suffit juste de rajouter : reader.Close (); tout à la fin de cette fonction.
(Je vais mettre à jour le code aussi).

EDIT : lien du pastebin mis à jour !

Avatar de l’utilisateur
artemisart
Messages : 1893
Inscription : 21 Juin 2011 19:51
Localisation : Centre
Contact :

Re: [C#] OBJ import/export

Message par artemisart » 04 Nov 2012 03:31

Grosse mise à jour (oui oui ! je viens de la finir !)

Des fonctions toutes fraiches vous attendent :D.
Le script permet maintenant d'écrire et charger des fichiers optimisés et donc de charger des fichiers directement sortis de logiciels externes, mais il faut bien penser à inclure les uv et les normales, sinon ça marche pas.
Je re-updaterais le script dans pas longtemps (je viens de le finir là, donc j'ai pas eu le temps :P ) pour ajouter les surcharges des fonctions (pour rendre certains paramètres facultatifs), pour rajouter la fonction LoadFromText, améliorer la triangulation des quads, rendre facultatif les uv et les normales, etc...

Bref j'ai du bouleau :mrgreen: .

Bien sûr c'est pas absent de bugs, donc les retours seront les bienvenus.

Avatar de l’utilisateur
axel
Messages : 1924
Inscription : 26 Avr 2012 09:10
Localisation : Lille - Dunkerque
Contact :

Re: [C#] OBJ import/export

Message par axel » 05 Nov 2012 10:27

c'est super sympa, merci

OpenSky
Messages : 1
Inscription : 26 Déc 2013 21:42

Re: [C#] OBJ import/export

Message par OpenSky » 26 Déc 2013 22:24

Bonjour,
je suis depuis peu à la recherche d'un script ou quelque chose dans le genre, me permettant d'instaurer le modding dans mon jeu (de voitures). J'aimerais que ca soit dans le style de flight simulator x (en gros vous avez un dossier ou se trouvent tous les avions, et du coup on peut en ajouter des autres). Dans mon jeu j'aimerais faire pareil. Mais étant donné que je suis nouveau sous Unity et que je connais à peine javascript et c#, je doute de mes capacités.
Voici donc mes questions :
Est-il possible de réaliser ca sous Unity ? Meme en version non-pro ?
Ce script répondrat-il a mes besoins ?
Sinin, existe-t-il une autre méthode ?
Merci, et à bientot.
Cordialement,

Avatar de l’utilisateur
artemisart
Messages : 1893
Inscription : 21 Juin 2011 19:51
Localisation : Centre
Contact :

Re: [C#] OBJ import/export

Message par artemisart » 29 Déc 2013 23:59

Salut,

C'est tout à fait possible de réaliser ça dans unity free (ça requiert tout de même des connaissances plus que minimales en prog).
Ce script permet de charger des modèles obj (vertices, uvs, normals, triangles et quads) mais ne gère pas les mtl (textures/propriétés du matériau spécifiées dans un fichier externe .mtl) ou les smoothing groups. C'est donc pas magique :mrgreen: il faudra gérer en plus les textures, les propriétés de l'avion, ...

Bonne chance pour ton projet ;)

Neostralie
Messages : 25
Inscription : 22 Déc 2012 03:13

Re: [C#] OBJ import/export

Message par Neostralie » 07 Jan 2015 05:19

Bonjour,

Ton code est extrêmement intéressant par contre, j'avoue ne pas avoir bien compris comment le lancer.

J'ai fait un petit tour du code de l'import et tu gère bien les "objet" mais pas les groupes. De plus, ta solution ne semble pas capable de traiter les fichiers avec plusieurs objets/groupes différents.

Je constate aussi qu'elle ne gère pas le fait que les références soient en négatif. Donc on ne peu pas utiliser ton code pour importer des données depuis 3DS Max car il exporte les objets en groupes et avec des références négatives.

En suite, ce qui m'interpelle c'est que pour chaque triangle du modèle tu crée de nouveaux vertex. Donc pour un cube, en lieu et place de 24 vertex (vérifié dans unity), tu en aurait 36. Je pense qu'au lieux d'avoir 4 vertex et deux triangles pour définir un carré, tu a 6 vertex et deux triangles.

Fig 1 : cas 4 vertex, 2 triangles par faces
Fig 2 : cas 6 vertex, 2 triangles par faces
importOBJ.jpg
importOBJ.jpg (45.93 Kio) Consulté 10088 fois
D'après moi, ce qu'il faut c'est un trinôme v/vt/vn et le comparer avec ce que l'on aurait déjà dans notre liste de trinômes. On ne le recrée pas s'il existe déjà. C'est ainsi que Unity gère les smouthing groups.

Je pense aussi que ton commentaire : " // triangle or quad" est mal placé. En effet tu l'a mis avant la validation du fait que l'on ai bien au moins 3 vertex.

Cela sera tout pour ce soir.

Avatar de l’utilisateur
artemisart
Messages : 1893
Inscription : 21 Juin 2011 19:51
Localisation : Centre
Contact :

Re: [C#] OBJ import/export

Message par artemisart » 11 Jan 2015 01:32

Salut,

Oui je ne gère effectivement qu'un seul mesh (sans submeshes), donc pas de groupes ni plusieurs objets :/
Pour les références négatives ? Je veux bien voir un fichier parce que ça me dit rien.
Neostralie a écrit :En suite, ce qui m'interpelle c'est que pour chaque triangle du modèle tu crée de nouveaux vertex. Donc pour un cube, en lieu et place de 24 vertex (vérifié dans unity), tu en aurait 36. Je pense qu'au lieux d'avoir 4 vertex et deux triangles pour définir un carré, tu a 6 vertex et deux triangles.
Avec la "dernière" version (ça commence à être vieux quand même :/ unity 3.x) ça devrait pas le faire. Tu as ce problème pour l'import ou l'export ? En relisant le code effectivement je duplique les vertices au load (plus simple pour gérer les normales et uvs). Comme j'ai pas prévu de faire une maj tout de suite (sorry :D), tu peux modif le code ou trouver solution alternative.

Pour le commentaire, en fait quand datas.Length >= 4, ça peut soit être un triangle (4), soit un quad (5), et normalement on devrait jamais avoir plus (pas dans les specs).

Répondre

Revenir vers « Scripts »