2012-03-24 21 views
0

Ich habe einen einfachen Modell-Viewer für Android geschrieben, der eine .obj Wavefront-Datei analysiert, um ein 3D-Modell zu erstellen. Ich bin ein einfaches icosphere exportieren, die vom Mixer mit einer UV-Karte texturierten wurde, die in diesem Format kommtopengl es 2.0 texture coordinates

v 0.000000 -1.000000 0.000000 
v 0.723600 -0.447215 0.525720 
v -0.276385 -0.447215 0.850640 
. 
. 
. 
v -0.723600 0.447215 -0.525720 
v 0.276385 0.447215 -0.850640 
v 0.894425 0.447215 0.000000 
vt 0.238062 0.172144 
vt 0.314133 0.212645 
vt 0.264721 0.263452 
. 
. 
. 
vt 0.176955 0.098382 
vt 0.327646 0.115775 
vt 0.361262 0.040083 
f 103/1 15/2 48/3 
f 48/3 44/4 103/1 
f 13/5 103/1 44/4 
. 
. 
. 
f 47/12 105/8 46/10 
f 14/9 46/10 105/8 
f 105/8 47/12 15/2 

„v“ stellt die Eckpunkte „vt“ stellt die Texturkoordinaten und „f“ steht für die Gesichter wobei die Werte vor dem Schrägstrich die Indizes sind, die den Eckpunkten entsprechen, und die Werte nach dem Schrägstrich die Indizes sind, die den Texturkoordinaten entsprechen. Mein Problem ist, dass ich nicht sicher bin, wie man die Texturkoordinatenindizes in OpenGLs eingibt, so dass mein aktuelles Modell sehr seltsam aussieht, da die Texturkoordinaten nicht übereinstimmen.

enter image description here

Antwort

0

OBJ definiert den Ursprung in einer Textur in der oberen linken zu sein. OpenGL definiert es in der linken unteren Ecke. Sie müssen die y-Koordinaten, die vom OBJ kommen, invertieren.

BEARBEITEN: Als Antwort auf das, was ich unten auf Christian Raus Teil als Skeptizismus interpretiere, ist für OpenGL-Zwecke und die Beschränkung der Eigenschaften auf genau die, die Sie tatsächlich verwenden, ein Scheitelpunkt die Kombination einer Position und einer Texturkoordinate. Es sind die zwei Dinge zusammen. Sie könnten denken, dass sie logisch verschieden sind, aber OpenGL nicht. Sie könnten auf die Frage antworten: "Welcher OBJ-Vertex befindet sich an Eintrag 23 in der Liste, die an OpenGL übergeben wurde?" mit einer Antwort wie "es ist der Eckpunkt 46/10".

Eine Möglichkeit, das beim Laden über eine Dictionary-Unterklasse (z. B. Hashtable) zu implementieren. Wenn Sie den Knoten 46/10 verwenden müssen, erstellen Sie einen geeigneten zusammengesetzten Schlüssel und überprüfen die Hashtabelle auf eine Zuordnung zur OpenGL-Array-Indexposition. Wenn Sie keine gefunden haben, ordnen Sie die nächste verfügbare Indexposition zu und speichern einen Datensatz in Ihrem Wörterbuch.

sind also folgende, aus Ihrer Frage:

f 103/1 15/2 48/3 
f 48/3 44/4 103/1 
f 13/5 103/1 44/4 
. 
. 
. 
f 47/12 105/8 46/10 
f 14/9 46/10 105/8 
f 105/8 47/12 15/2 

führt zu zehn Ecken, diejenigen sind die Eckpunkte 103/1, 13/5, 48/3, 44/4, 15/2, 47/12, 105/8, 46/10, 14/9 und 46/10.

+0

Also meinst du das Bild in seiner Frage zeigt die richtige Textur nur vertikal gekippt? –

+0

Ich bin optimistisch, dass das der Fall ist. Die Texturkoordinaten wurden für die Frage automatisch ausgepackt. Es gibt also keinen Grund anzunehmen, dass es so aussieht, wie es sollte, sondern umgekehrt. Ich werde eine Diskussion über OpenGL-Vertices hinzufügen, da Sie eindeutig skeptisch sind und ich habe gesehen, dass Sie in anderen Fragen wirklich gute Antworten geben. – Tommy