Question

Je crée un rendu avec OpenGL. J'ai des modèles texturés dans Blender / Sketchup (je peux facilement échanger entre les deux) et j'aimerais pouvoir exporter ces fichiers dans mon moteur de rendu. Mon idée de départ était simplement d'exporter les faces brutes et de rendre ces triangles, mais j'aimerais bien découper facilement mes fichiers de texture en coordonnées de texture.

Par cela, je veux dire que mes visages modèles sont sculptés en triangles. Vous pouvez voir dans cette image (reproduite ci-dessous) que ma courbe devient 24 triangles. J'aimerais savoir quelles coordonnées de texture utiliser pour chaque triangle.

Objet 3D incurvé polygonisé

Un fichier DAE serait-il le moyen le plus simple de le faire? J'ai lu les spécifications pour le format et ça a l'air assez facile. Je pense que je pourrais analyser le XML et recréer fidèlement les modèles dans OpenGL. Je me demande s’il existe un moyen plus simple (c’est-à-dire un moyen qui ne réinvente pas la roue).

Était-ce utile?

La solution

Si vous maîtrisez le format .dae, utilisez-le. Toutefois, si vous souhaitez uniquement exporter des maillages triangulaires texturés, utilisez le format .obj qui est beaucoup plus simple à analyser. D'après ce que je peux dire, Sketchup et Blender peuvent exporter ce format.

Autres conseils

Si les formats binaires ne vous effraient pas, je vous suggérerais d'écrire un fichier Blender & amp; Plug-in Sketchup et exportation de la géométrie précuite dans des tableaux de sommets compactés.

L'avantage de cette méthode est qu'il n'y a pas d'analyse ou de conversion de type dans votre application. Tout est prêt à être envoyé au GPU dans de simples copies de mémoire contiguës. Idéal pour la géométrie statique.

Un exportateur de mixeur épuré ressemble à peu près à ceci:


#!BPY
import bpy, struct
from Blender import *

self.fh = open("MyFileName", "w")
m = bpy.data.meshes["MyMeshName"]
faces = m.faces
for face in faces:
    for (vertex, uv) in zip(face.verts, face.uv):
        self.fh.write(struct.pack('<fff', *vertex.co)) # coords
        self.fh.write(struct.pack('<fff', *vertex.no)) # normals
        self.fh.write(struct.pack('<ff',  uv.x, uv.y)) # uvs

self.fh.close()

Si vous souhaitez analyser les fichiers .dae , nous vous conseillons d’examiner Collada analyseurs. .dae est en fait l'extension des fichiers Collada, la dernière tentative du groupe Khronos (mainteneurs d’OpenGL) d’avoir un seul format de fichier unifié pour l’échange de données 3D.

En ce qui concerne les analyseurs syntaxiques existants, voici ce que j'ai rencontré:

  • collada-dom , l'implémentation de référence. Comme son nom l'indique, il ne s'agit que d'une abstraction de l'arborescence XML.
  • FCollada , une abstraction plus agréable. Toutefois, ce projet est mort depuis près de deux ans et, d’après mes informations, il est peu probable que nous voyions une mise à jour à l’avenir.
  • OpenCollada , un nouvel effort récent. Je ne l'ai pas essayé, mais il y a une communauté active derrière cela.

Cela étant dit, si votre seul objectif est de charger une simple géométrie avec des sommets, des normales et des coordonnées de texture, le format de fichier .obj peut constituer un moyen plus rapide.

Tout format de fichier correct utilisé par les programmes de modélisation (tels que Blender ou Sketchup) inclura toutes les informations nécessaires pour recréer la géométrie que vous voyez. Cela doit inclure le type de géométrie (par exemple, des bandes de triangles, des triangles individuels, etc.), les sommets et les normales de la géométrie, les propriétés des matériaux utilisés, ainsi que les textures utilisées ainsi que les coordonnées de texture appropriées. Si un format de fichier potentiel manque, choisissez-en un autre.

Si vous pensez que l'analyse XML est simple, j'espère que vous avez l'intention d'utiliser les bibliothèques existantes, comme expat, Xerces ou une autre implémentation spécifique à un langage.

Lorsque vous envisagez d'importer / exporter, essayez d'abord de trouver une bibliothèque open source pouvant gérer l'importation pour vous et mettez les données à la disposition de votre programme dans un format raisonnable. Si ce n'est pas disponible et que vous devez écrire votre propre importateur, essayez de trouver un format ASCII simple ( pas XML) ou un format binaire qui répond à vos besoins. PLY pourrait convenir. En dernier recours, je recommanderais d’essayer de mettre en œuvre un importateur pour un format basé sur XML.

Il y a aussi: Lib3DS - http://www.lib3ds.org/ LibOBJ (ne me laissera pas poster de lien)

Vous devriez jeter un oeil à:

http://sketchup.google.com/community/developers.html

L’équipe de sketchup fournit gratuitement un serveur C ++ COM. Grâce à cela, vous pouvez accéder à de nombreuses informations sur un fichier .skp.

Vous devriez pouvoir utiliser ce serveur COM pour écrire un importateur .skp pour votre application.

Vous devriez essayer d’obtenir le fichier .tlb si vous le pouvez. Cela vous donnera accès à des pointeurs intelligents, ce qui simplifiera votre importateur (client COM)

J'ai utilisé la version 6 du SDK (qui comprenait le fichier tlb). La version actuelle du SDK ne semble pas inclure ce fichier.

Quelqu'un a posté une solution (pour le fichier tlb manquant) sur les forums de développement: http://groups.google.com/group/su-sdk-fileshare/ sujets

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top