OpenGL: .obj-Dateien laden



  • Hallo
    Ich bin frisch auf OpenGL umgestiegen und fühle mich auch relativ wohl damit. Probleme habe ich jedoch, wenn es darum geht Meshs zu laden. Ich habe mir in einem Modellierungsprogramm ein Objekt gebastelt und dieses als OBJ-Datei exportiert.

    Wie kann ich nun dieses Mesh laden? Muss ich wirklich die OBJ-Datei laden und dann Zeile für Zeile auslesen und auswerten?

    Gibt es keine Funktionen, welche mir diese Arbeit abnehmen würden?

    Ich möchte nicht beginnen die dafür nötigen Funktionen zu schreiben, wenn es eine einfachere (und schnellere) Möglichkeit dafür gibt. Ausserdem müsste ich auch die Spezifikation dieses Formats durchlesen, welches mich ja nicht interessiert.

    Gruss
    Grave



  • OpenGL ist ein LowLevel 3D-Grafik API, solche Sachen wie Meshs kennt es nicht.
    Wenn du ein Model laden willst, musst du dir wohl oder übel einen eigenen Importer schreiben oder suchen...
    Am einfachsten zu laden sind wohl Quake2 md2 Models, dafür kannst du einen Importer in einer halben Stunde schreiben, die Möglichkeiten sind aber sehr begrenzt...
    Einen Loader für obj Dateien zu schreiben dürfte ungleich aufwändiger sein, außerdem sind solche Formate weniger für Spiele geeignet, da sie jede Menge unnötigen Balast mit sich rumschleppen...

    Grüße,

    Martin



  • Danke für die schnelle Antwort!

    Nun dann werde ich mich wohl an die Arbeit machen müssen...
    Nun sehr schwer ist das OBJ format nicht. ich begrenze mich auf das laden der geometrie. sobald alles funktioniert kann ich es ja immer noch erweitern

    zu dem von dir erwähnten ballast. ich weiss nicht was du unter ballast verstehst. bei den meisten 3d-editoren kann man ja auswählen was alles in die datei soll (materialien, texturen, normalen, gesmoothte normalen, usw). wenn ich mich auf die vertices, die normalen und die faces begrenze sollte eigentlich bloss das nötigste bespeichert sein?
    die OBJ dateien werden ja als text abgespeichert. es wäre möglich diese binär zu speichern und dadurch könnten die dateien klein gehalten werden und das laden sollte auch deutlich schneller gehen.



  • hmm... ich habe nun eine OBJ-Datei erstellt welche die Daten eines Rings hat. Dieser hat 400 Vertices, jedoch 441 UV-Koordinaten... wie kann das gehen?



  • Ich persönlich würde mir eher die mühe machen mal richtig nach einem obj-loader zu Suchen, denn ich kann mir nicht vorstellen, dass es den nicht schon fertig mit allen Funktionen irgendwo gibt. Es gibt ja schließlich auch jede menge libraries, die sich um das Laden vom Bildern kümmern, was ja auch nicht in OpenGL eingebaut ist.

    Edit:

    Da: http://texel3d.free.fr/prog_en.htm bei OpenGL der erste eintrag



  • GraveCH schrieb:

    hmm... ich habe nun eine OBJ-Datei erstellt welche die Daten eines Rings hat. Dieser hat 400 Vertices, jedoch 441 UV-Koordinaten... wie kann das gehen?

    Ich bin mir nicht 100% sicher aber ich denke das könnte wie folgt vorkommen:

    Du hast 2 Dreiecke die zusammen ein Quadrat bilden:
    (dritte koordinate hab ich weg gelassen)
    Koordinaten von Dreieck 1:
    0.0, 0.0
    1.0, 0.0
    0.0, 1.0
    Koordinaten von Dreieck 1:
    0.0, 1.0
    1.0, 1.0
    1.0, 0.0

    die Punkte (1.0, 0.0) und (0.0, 1.0) kommen in beiden Dreiecken vor, müssen aber nur einmal gespeichert werden. Wenn beide Dreiecke jetzt aber unterschiedliche Texturkoordinaten haben stehen in der obj Datei 4 Punkte aber 6 Texturkoordinaten.

    Hm und ich versteh nicht was in obj Dateien soviel unötiger Balast sein soll. Viel mehr als Positionskoordinaten/Texturkoordinaten und Normalen steht da auch nicht drin.



  • man kann in blender auch als raw exportieren, da hat man dann wirklich nur die Vertexkoordinaten, und dafür hab ich sogar man ein loader geschrieben.



  • vielen dank für die antworten!
    ich werde mich zuerst mit dem OBJ-loader beschäftigen den krux erwähnt hat. eine möglichkeit wäre, dass ich mir einen konverter schreibe, welcher die obj-dateien in ein binäres, abgespecktes format speichert. ich vermute jedoch, dass der obj-loader gut optimiert ist und ich für meine projekte keine zu lange ladezeiten haben werde.

    das von krux erwähnte raw format kenne ich nicht. du erwähnst jedoch, dass dieses bloss die vertexkoordinaten enthält. das bedeutet aber, dass man nicht weiss wie die faces verbunden sind. ausserdem müsste man noch die normalen und die normalen für das smooth-shading berechnen, welches wiederum wenig sinn macht, wenn man diese bereits in der obj-datei gespeichert hätte.

    noch zu der antwort von xorm. deine antwort klärt so einiges. vielen dank. wegen dem ballast. es ist möglich alle mögliche informationen in einer obj-datei zu speichern. wahrscheinlich exportieren einige 3d-programme eine obj-datei mit möglichst allen daten, was die datei unnötig aufplustert. wenn man aber, z.b. im maya, auswählt dass bloss das nötigste exportiert wird hat man recht schöne und kleine obj-dateien.


Anmelden zum Antworten