2016-04-06 9 views
0

Ich weiß nicht opengl-es. aber ich muss Features von OBJ 3D-Modell in meiner Android-App verwenden. In der .obj-Datei kann ich Vertices, Texcoords und Normals finden. aber es gibt keine Indizes und stattdessen gibt es Gesichtselemente. Kann mir jemand klar erklären, wie man Indizes aus der .obj-Datei erhält?Erhalten Sie Indizes von .obj

+0

Sie müssen Wavefront-Objekt Dateispezifikation lesen – Raki

+0

Sie meinen: http://www.martinreddy.net/gfx/3d/OBJ.spec –

+0

Ja, so etwas oder sogar aus Wikipedia. Wenn Sie wissen, wie Sie Indizes von Flächen erhalten, werden Flächen nur mit Indizes gebildet. – Raki

Antwort

2

Möglicherweise ein wenig schwer klar zu schreiben, denn was OBJ eine Ecke betrachtet, ist nicht, was OpenGL eine Ecke betrachtet. Lassen Sie uns herausfinden ...

Eine OBJ-Datei erstellt Listen von Obj-Vertices (v), Texturkoordinaten (vt), Normalen (n). Sie möchten diese wahrscheinlich nie an OpenGL übergeben (aber für den Vorbehalt bis zum Ende überspringen). Sie sind nur eine Möglichkeit für Ihren Laden Code die Bedeutung von v1, vt3 usw.

Der einzige Ort zu schaffen, die openGL-Eckpunkte festgelegt sind innerhalb der f Anweisung. Z.B. v1/vt1/vn1 bedeutet "der OpenGL-Vertex mit Position, Texturkoordinate und normal wie angegeben in der Liste".

So eine praktikable Lösung zu Laden ist, in Pseudo-Code:

  • instantiate eine leere Hash-Karte von v/vt/vn Tripeln opengl-Vertex-Indizes, eine leere opengl-Vertex-Liste und eine leere Liste von Indizes für später Bittschrift zu glDrawElements;
  • für jeden Tripel in der OBJ-Datei:
    • Blick in die Hash-Tabelle, um zu bestimmen, ob sie bereits in der Liste opengl-Vertex ist, und wenn ja, um den Index zu Ihren Elementen Liste zu erhalten und fügen Sie ihn;
    • wenn nicht, dann den nächsten verfügbaren Index dem Tripel zuweisen (also, dies ist nur eine inkrementierende Zahl), setzen Sie das in die Hash-Karte und die Liste der Elemente, kombinieren Sie das Tripel und fügen Sie es in die OpenGL-Vertex-Liste.

Sie können versuchen, besser als das zu tun, indem er versucht, das Potenzial hoch Random Access es bei Zeichen Zeit, um Ihre opengl-Vertex-Liste bedeutet, zu minimieren, aber nicht optimieren vorzeitig.


Caveat:

Wenn Ihr GPU unterstützt Vertex Texture (dh Textursampling im Vertex-Shader) holen, dann können Sie nur die Tripel direkt auf OpenGL liefern, die obj-Eckpunkten angesammelt haben, etc, in Textur-Maps und führen Sie die indirekte Suche in Ihrem Vertex-Shader aus. Beim Vertex-Textur-Fetch werden Texturen wirklich nur zu 2D-Arrays mit wahlfreiem Zugriff. Viele Android-GPUs unterstützen jedoch nicht den Abruf von Vertextexturen (selbst wenn sie ES3 unterstützen, was sie angeblich erforderlich macht, da eine Implementierung angeben kann, dass sie maximal null Sampler unterstützt).

Verwandte Themen