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
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
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. –
@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