4 Stimmen

Mapping Wavefront .obj's vt zu OpenGL Textur Koordinaten

Ein befreundeter Künstler hat mir eine von 3DS Max 2009 exportierte .obj-Datei geschickt, die drei Texturkoordinaten als Parameter für die vt Befehl. Und das ist laut .obj-Spezifikation auch richtig. Ich bin mir jedoch nicht sicher, wie man die U-V-W-Koordinaten zuordnen kann, die für eine normale 2D-.jpg-Textur vorgesehen sind.

Das ist für mich relativ wichtig, da ich mit 3DS Max herumgespielt habe, um herauszufinden, wie man es zwingen kann, nur U-V-Koordinaten zu exportieren, aber es scheint keinen einfachen Weg zu geben. In diesem Fall ist dies nur eine Skybox, aber in anderen Fällen könnte es etwas viel komplexer und nicht Hand-fixable sein.

Gracias.

8voto

Kai Punkte 9186

In dem Artikel gibt es einen Abschnitt Was ist UVW-Mapping? das erklärt:

Sie fragen sich vielleicht, warum Sie eine Tiefenkoordinate wie W für eine 2D-Ebene Ebene braucht. Ein Grund ist, dass es manchmal nützlich ist, um die die Ausrichtung einer Karte relativ zu ihrer ihrer Geometrie zu drehen. Hierfür benötigen Sie die dritte Koordinate. Die W-Koordinate hat auch eine Bedeutung für 3-dimensionale prozedurale Materialien.

In Ihrem Fall können Sie die W-Koordinate einfach ignorieren und nur die ersten beiden Floats der Zeilen lesen, die mit vt . Dies setzt voraus, dass Sie sich keine großen Sorgen über den zusätzlichen Platz machen, den die W-Koordinate einnimmt, da .obj ein ziemlich ineffizientes Dateiformat ist, um damit zu beginnen.

Ich persönlich mag die Verwendung von .obj in OpenGL nicht, weil es Vertex-Normalen pro Fläche statt pro Vertex liefert. Um ein Objekt richtig zu beleuchten, müssen Sie entweder Scheitelpunkte duplizieren oder Normalen berechnen, indem Sie den Durchschnitt der umgebenden Scheitelpunktnormalen in einer Fläche bilden. Wenn Sie sich für effizientere Alternativen interessieren, sollten Sie einen Blick auf Binärformate werfen, wie zum Beispiel das ausführlich dokumentierte .md2-Format. Ziehen Sie auch die Verwendung von glDrawElements in Betracht, wenn Sie es nicht bereits nutzen.

0 Stimmen

Danke! Ich verwende bereits Vertex-Arrays und Anzeigelisten (eine Weltraum-Simulation braucht sehr wenig Animation). Ich werde deine Antwort als akzeptiert markieren, sobald du eine Kleinigkeit BEARBEITEST: Du liegst FALSCH damit, dass .obj keine VERTEX NORMALS liefert :-) Siehe den "vn"-Befehl und die Verwendung von Vertex-Normalen in "f": Du gibst eine Normale pro Vertex an, nicht pro Fläche. Du verwechselst in diesem Fall .obj mit .3ds. Außerdem verwende ich im Moment .obj, aber ich werde später auf etwas anderes umsteigen. Vielleicht werde ich sogar .obj als Zwischenformat verwenden: ein weiterer Grund, alle Details zu kennen.

3 Stimmen

Bei der Verwendung von .obj-Dateien habe ich festgestellt, dass die Anzahl der "vn"-Einträge immer größer ist als die Anzahl der "v"-Einträge. Exportieren Sie ein einfaches Modell und überprüfen Sie dies selbst. Das liegt daran, dass .obj mehrere Normalen pro Vertex für verschiedene Flächen bereitstellt. Das bedeutet, dass ein Würfel mit 8 Scheitelpunkten bis zu 24 "vn"-Einträge haben kann, einen für jede angrenzende Fläche des Scheitelpunkts. Um eine Eins-zu-eins-Korrespondenz zwischen Scheitelpunkten und ihren Normalen zu erhalten, müssen Sie die zuvor erwähnte Berechnung durchführen. Alternativ können Sie einen Scheitelpunkt für jede Fläche duplizieren, mit der er verbunden ist, und dann alle 24 "vn"-Einträge verwenden. Ich hoffe, das ist jetzt klarer!

1 Stimmen

Hier ist etwas Ruf für Sie :) Ah ja, das stimmt. Aber es MUSS mehrere Normalen für scharfe Objekte wie Würfel bereitstellen. Ich will nicht, dass ein Würfel glatt abgebildet wird, ich will, dass er scharf abgebildet wird! Und genau das kann man mit OBJ machen. Sie zu mitteln ist ein völlig falscher Ansatz; also ja, Sie müssen sie duplizieren und optimieren (wenn Sie wollen). Aber der eigentliche Grund, warum OBJ für OpenGL problematisch ist, ist, dass man mehrere Indizes für einen einzelnen Face-Vertex benötigt; OpenGL unterstützt dies jedoch nicht. Man bräuchte ein Index-Array für Indizes... Sie sehen, worauf ich hinaus will. Das ist es, was mich ärgert; Normalen sind ok

3voto

david h Punkte 126

Entschuldigung, wenn ich Ihre Frage falsch verstanden habe. Aber könnte man den dritten Parameter, w, nicht einfach ignorieren? Wie ich es verstehe, ist w nur eine Koordinate in einer Ebene senkrecht zu der durch u und v beschriebenen Ebene, so dass es selten für einfache 2D-Textur-Mapping benötigt wird.

Ich hoffe, das hilft.

0 Stimmen

So habe ich es auch verstanden, aber es könnte noch weitere semantische Informationen enthalten. Warum sollte man es sonst exportieren, wenn es klar ersichtlich ist, dass es sich um ein 2D-Mapping handelt, wie es 3ds max 2009 tut?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X