2009-12-01 5 views
12

Ich mache einen Renderer mit OpenGL. Ich habe strukturierte Modelle in Blender/Sketchup (ich kann leicht zwischen den beiden austauschen), und ich würde gerne in der Lage sein, diese Dateien in meinen Renderer zu exportieren. Meine ursprüngliche Idee war, einfach die rohen Gesichter zu exportieren und diese Dreiecke zu rendern, aber ich würde auch gerne meine Texturdateien in Texturkoordinaten schneiden.Verwenden von Blender/SketchUp-Modellen in OpenGL

Damit meine ich, dass meine Modellgesichter in Dreiecke geschnitzt werden. Sie können in this image (reproduziert unten) sehen, dass meine Kurve 24 Dreiecke wird. Ich würde gerne wissen, welche Texturkoordinaten für jedes Dreieck zu verwenden sind.

Polygonized curved 3D object

Würde eine DAE-Datei der einfachste Weg, das zu tun? Ich habe die Spezifikationen für das Format gelesen und es sieht einfach genug aus. Ich denke, ich könnte das XML analysieren und die Modelle in OpenGL getreu neu erstellen. Ich frage mich, ob es einen einfacheren Weg gibt (d. H. Einen, der das Rad nicht neu erfindet).

+0

Können Sie erarbeiten, was Sie mit "Ich würde gerne meine Textur-Dateien auch in Textur-Koordinaten schneiden" –

+0

Sicher Sache! Bearbeitete meinen ursprünglichen Beitrag. – mkenyon

+2

Fragen mit Bilderregeln, also habe ich mir die Freiheit genommen, deins hinzuzufügen. – unwind

Antwort

12

Wenn Sie das .dae-Format analysieren können, sollten Sie es verwenden. Wenn Sie jedoch nur texturierte Dreiecksnetze exportieren möchten, würde ich die Verwendung des .obj format in Betracht ziehen, das viel einfacher zu analysieren ist. Von dem, was ich sagen kann, Sketchup und Blender können dieses Format exportieren.

+0

Das sieht nach einer einfacheren Darstellung der gleichen Daten aus. Ich werde heute Abend in das OBJ-Format schauen. – mkenyon

+1

Ich möchte Sie wissen, dass die OBJ (und die entsprechenden MTL-Dateien) wunderbar funktionierte. Ich danke dir sehr! – mkenyon

+0

Gern geschehen! –

1

Jedes anständige Dateiformat, das von Modellierungsprogrammen (z. B. Blender oder Sketchup) verwendet wird, enthält alle Informationen, die zum Erstellen der angezeigten Geometrie erforderlich sind. Dazu gehören der Geometrietyp (z. B. Dreiecksstreifen, einzelne Dreiecke usw.), die Eckpunkte und Normalen für die Geometrie, die verwendeten Materialeigenschaften sowie die Texturen, die zusammen mit den entsprechenden Texturkoordinaten verwendet werden. Wenn bei einem möglichen Dateiformat etwas fehlt, wählen Sie ein anderes.

Wenn Sie glauben, dass das Parsen von XML einfach ist, dann hoffe ich, dass Sie dafür vorhandene Bibliotheken wie Expat, Xerces oder eine andere sprachspezifische Implementierung verwenden.

Wenn Sie einen Import/Export in Betracht ziehen, versuchen Sie zunächst, eine Open Source-Bibliothek zu finden, die den Import für Sie übernimmt und die Daten in einem vernünftigen Format für Ihr Programm verfügbar macht. Wenn das nicht verfügbar ist und Sie Ihr eigenes Importer schreiben müssen, versuchen Sie, ein einfaches ASCII- (nicht XML-basiertes) oder binäres Format zu finden, das Ihren Bedürfnissen entspricht. PLY könnte geeignet sein. Nur als letztes Mittel würde ich empfehlen, einen Importer für ein XML-basiertes Format zu implementieren.

+0

Ich habe schon einmal an Web-Apps gearbeitet; Ich weiß genug, um mein eigenes XML-Parsing nicht zu machen. Es wäre durch eine Bibliothek. – mkenyon

2

Wenn Sie .dae Dateien analysieren möchten, würde ich empfehlen, in Collada Parser zu suchen. .dae ist eigentlich die Erweiterung für Collada-Dateien, die neueste Anstrengung von der Khronos group (Betreuer von OpenGL), um ein einziges einheitliches Dateiformat für 3D-Datenaustausch zu haben.

Wie bei den bestehenden Parser, hier ist das, was ich bin gekommen, across:

  • collada-dom, die Referenz-Implementierung. Wie der Name schon sagt, handelt es sich nur um eine Abstraktion des XML-Baums.
  • FCollada, eine schönere Abstraktion. Dieses Projekt ist jedoch seit fast zwei Jahren tot, und aus dem, was ich gesammelt habe, ist es unwahrscheinlich, dass wir in der Zukunft ein Update sehen werden.
  • OpenCollada, eine neue Anstrengung. Habe es nicht ausprobiert, aber dahinter steckt eine aktive Community.

aber sagte, dass, wenn Ihr einziges Ziel ist es, ein einfaches Stück Geometrie mit den Eckpunkten, Normalen und Texturkoordinaten Laden, mit dem .obj Dateiformat gehen könnte ein schnellerer Weg sein.

+0

Ich möchte, dass Sie wissen, dass OBJ-Dateien wunderbar funktionierten. Ich danke dir sehr! – mkenyon

0

Sie sollten einen Blick auf nehmen:

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

Das sketchup Team bietet eine C++ COM-Server kostenlos. Auf diese Weise können Sie auf viele Informationen zu einer SKP-Datei zugreifen.

Sie sollten diesen COM-Server verwenden können, um einen .skp-Importeur für Ihre Anwendung zu schreiben.

Sie sollten versuchen, die .tlb-Datei zu bekommen, wenn Sie können. Dadurch erhalten Sie Zugriff auf intelligente Zeiger, die Ihren Importeur vereinfachen (COM-Client)

Ich habe die Version 6 SDK (die die TLB-Datei enthalten) verwendet. Die aktuelle Version des SDK scheint diese Datei nicht zu enthalten.

Jemand hat eine Lösung (für die fehlende TLB-Datei) auf den Entwicklerforen: http://groups.google.com/group/su-sdk-fileshare/topics

5

Wenn Binärformaten Sie nicht erschrecken, ich würde vorschlagen, ein Blender & Sketchup Plug-in schriftlicher Form und Exportieren der Geometrie, die in gepackte Vertex-Arrays vorgebacken ist.

Das Schöne an dieser Methode ist, dass es keine Parsing- oder Typkonvertierung in Ihrer App gibt. Alles ist bereit, in einfachen zusammenhängenden Speicherkopien an die GPU gesendet zu werden. Ideal für statische Geometrie.

Eine abgespeckte Mixer Exporteur etwas wie folgt aussieht:


#!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() 
1

Es gibt auch: lib3ds - http://www.lib3ds.org/ LibOBJ (wird mich nicht Link lassen post)

+0

Das ist interessant! Ich werde das überprüfen. – mkenyon

+0

@mkenyon Es gibt wahrscheinlich auch viele Open-Source-Bibliotheken in ganz Github. – FracturedRetina