2016-04-08 5 views
2

Ich versuche, eine .obj-Datei zu importieren, um sie im Scene Kit mithilfe des Model I/O-Frameworks zu verwenden. Ich habe anfangs die einfache MDLAsset initWithURL: -Funktion verwendet, aber nachdem ich das Mesh auf eine SCNGeometry übertragen hatte, erkannte ich, dass diese Funktion das Meshing triangulierte, so dass jedes Gesicht 3 eindeutige Scheitelpunkte hatte und an der gleichen Stelle separate Scheitelpunkte für Grenzflächen vorhanden waren. Dies verursachte einige schwerwiegende Probleme mit meinen anderen Funktionen, so dass ich versuchte, dies zu beheben, indem ich stattdessen MDLAsset initWithURL: vertexDescriptor: pufferAllocator: preserveTopology-Funktion mit preserveTopology auf YES gesetzt, wobei der descriptor/allocator auf den Standardwert mit nil gesetzt wurde. Diese Erhaltungstopologie hat mein Problem der Vervielfältigung von Scheitelpunkten behoben, also waren die Flächen/Kanten alle gut, aber dabei verlor ich die Normdaten.iOS Importieren Sie die .obj-Datei in Model I/O, ohne Scheitelpunkte zu duplizieren.

Durch die verlorenen Normalen, meine ich nicht multiple Indizierung, ich meine nach dem Festlegen von preserveTopology auf YES, der Puffer enthielt überhaupt keine Normalenwerte. Wo vorher v1/n1/v2/n2 ... war und der Schritt 24 Bytes (3 Dimensionen * 4 Bytes/float * 2 Attribute) war, ist jetzt die erste Hälfte des Puffers v1/v2/... mit a Schritt von 12 und die gesamte 2. Hälfte des Puffers ist nur 0,0 Schwimmer.

Auch etwas seltsam mit diesem, wenn Sie auf die SCNGeometrySources der Geometrie, gibt es 2 Quellen, 1 mit semantischen kGeometrySourceSemanticVertex und 1 mit semantischen kGeometrySourceSemanticNormal. Sie würden denken, dass die semantische Vertexquelle die Positionsdaten enthalten würde und die semantische normale Quelle die normalen Daten enthalten würde. Das ist jedoch nicht der Fall. Unabhängig davon, was Sie preserveTopology festlegen, sind sie Puffer der Größe, die sowohl Positions- als auch Normaldaten mit identischen Werten enthalten. Wenn ich also vorher sagte, dass es keine normalen Daten gab, meine ich, dass diese beiden Puffer, der semantische Vertex UND die semantische Normale von v1/n1/v2/n2 ... zu v1/v2 /.../ (0,0, 0,0, 0.0)/(0.0, 0.0, 0.0)/... Ich habe den Puffer von mdlmesh (vor der Übertragung zum Szenekit) gefunden, als ich das gleiche Problem gefunden habe. Das Problem muss also mit der initWithURL, nicht mit dem Modell-I/O sein zur Szenekitbrücke.

Also dachte ich, dass etwas mit dem Standardscheitelpunktdeskriptor und dem Pufferzuordner (da ich Nil verwendete) nicht stimmen konnte und versuchte, meine eigenen zu erstellen, die diesen 2 möglichen Datenformaten entsprachen. Leider konnte ich nach vielem Versuch nichts erreichen, was funktionierte.

Irgendwelche Ideen, wie ich das tun sollte? Wie bekomme ich MDLAsset den richtigen VertexDescriptor und PufferAllocator (ich fühle mich wie Null sollte hier in Ordnung sein) für den Import einer. OBJ-Datei? Thanks

Antwort

2

Eine Obj-Datei mit Vertices und Normalen hat Vertices, angezeigt durch v-Linien, Normalen, angezeigt durch Vn-Linien und Flächen, angezeigt durch f-Linien.

Die v und vn Linien werden nur die Fließkommawerte, die Sie erwarten, und die f Zeile der Form sein -

f v0 // n0 v1 // n1 usw.

Da OpenGL und Metall lässt keine Mehrfachindexierung zu, Sie werden sehen, dass der erste Effekt von Vertices dupliziert wird. Zum Beispiel

f 0 // 0 1 // 2 2 // 0

kann nicht als Eckenpuffer arbeiten, weil es verschiedene Indizes pro Vertex erfordern würde. So typisch OBJ-Parser müssen neue Eckpunkte erstellen, die das Gesicht erlauben

f 0 // 0 1 // 1 2 // 2

Die Erhaltung Topologie Option geworden ist Ihnen nicht helfen. Es behält die Konnektivität und die Form des Netzes bei (es findet keine Triangulation statt, gemeinsame Kanten bleiben geteilt), aber es erzwingt immer noch einen einzelnen Index pro Vertex-Komponente.

Eine Lösung wäre, sicherzustellen, dass Ihr Tool, das die OBJ-Dateien ausgibt, während des Exports eine einzelne Indizierung verwendet, wenn dies eine Option ist.

Eine andere Option, und dies wird das Problem nicht sofort lösen, wäre eine Datei Anfrage, die Multi-Indizierung auf der Modell-I/O-Ebene unterstützt werden. SceneKit müsste immer noch eindeutig indexieren, da es gerendert werden muss.

Eine andere Option wäre die Verwendung eines Formats wie PLY, das keine Mehrfachindizierung besitzt.

+0

Dies ist aufschlussreich über OBJ-Dateien, aber ich glaube nicht, dass ich klar genug war, was das Problem war. Indem ich Vertices dupliziere, meinte ich Triangulation, also behielt die Erhaltung der Topologie das Problem dort. Das Problem war, glaube ich, nicht das, was Sie als Mehrfachindexierung bezeichnen. Das Problem bestand darin, presentTopology zu setzen: YES verursachte, dass Normaldaten überhaupt nicht in den Puffer geladen wurden. Ich habe die Frage bearbeitet, um das deutlicher zu machen. – sts54

+0

Sie haben Recht. Wenn das Konservierungs-Topologie-Flag gesetzt ist, gehen alle Pro-Vertex-Daten verloren, einschließlich Normalen, Farben und Texturkoordinaten. Wenn möglich, bitte einen Fehlerbericht über dieses Problem einreichen, um es zu beheben. –

+0

@NickPorcino Vielen Dank für diesen aufschlussreichen Kommentar. Bedeutet dies, dass Model I/O nicht alle gültigen OBJ-Dateien korrekt importieren kann, weil die Referenznummern der Gesichtsvertex nicht korrekt in die Struktur des Indexpuffers importiert werden? Das hat mich den ganzen Tag verblüfft. – algal

Verwandte Themen