[OpenGL] Wie kann ich .x laden?



  • hi,

    wie kann ich in opnegl .x dateien laden? oder geht das gar nicht (weil .x eig directx dateien sind)

    danke schonmal



  • Dateien sind unabhängig von den Platformen. Was du suchst ist ein Parser. Ich habe gehört das es 2 Arten von X-Dateien gibt. Nämlich die binäre und ASCII-Kodierte. Für die ASCII-Kodierten schlage ich dir std::ifstream vor. Sollte recht einfach sein. Dann holste dir alle passenden Daten die du brauchst und renderst die Szene.



  • ah ok danke, ist es dann einfacher eine obj datei zu laden? wenn ja, wie mache ich das am geschicktesten?

    danke schonmal



  • Kóyaánasqatsi schrieb:

    Dateien sind unabhängig von den Platformen. Was du suchst ist ein Parser. Ich habe gehört das es 2 Arten von X-Dateien gibt. Nämlich die binäre und ASCII-Kodierte. Für die ASCII-Kodierten schlage ich dir std::ifstream vor. Sollte recht einfach sein. Dann holste dir alle passenden Daten die du brauchst und renderst die Szene.

    Wobei beide Formate jeweils noch in einer komprimierten Form existieren.

    Das X Format ist ein extrem flexibles Dateiformat ist und somit alles andere als einsteigerfreundlich was das Parsen angeht (wobei du anfangs dich natürlich auf wenige Strukturblöcke beschränken kannst). Aber das Format an für sich ist auch nicht ganz so einfach zu parsen wie viele andere 3D-Formate, zum Beispiel .obj
    Außerdem ist das X Format deprecated, da jetzt noch einen Loader dafür zu schreiben ist daher verschenkte Mühe.



  • ah ok danke, ist es dann einfacher eine obj datei zu laden?

    Kommt drauf an, wenn du das auf das parsing beziehst, würde ich das schon sagen.

    wenn ja, wie mache ich das am geschicktesten?

    Wie bereits gesagt, ist es am einfachsten mit std::ifstream. Ich habe es so gemacht, dass ich mir jede Zeile in einen std::string hole und dann checke, ob das erste Element beispielsweise ein "f" (face) ist und habe dann die nachfolgenden Elemente mit ::atoi( ) bzw. ::atof( ) konvertiert. Mehr muss man nicht wissen.



  • ok vielen dank



  • Eine Alternative wäre boost::spirit. Wenn Du Dich allerdings garnicht mit Parsing auskennst, bin ich nicht sicher, ob Du Dir damit Zeit sparen kannst. Der Code wird aber insgesamt auf jeden Fall kürzer und einfacher.



  • @jester: ok das werde ich auch nochmal probieren^^

    ich will jetzt keinen thread aufmachen deswegen frag ich gleich hier:
    also, ich lade eine obj datei mit diesem code

    GLMModel* planeModel;
    planeModel=glmReadOBJ("plane.obj");
    glPushMatrix();
    glmDraw(planeModel,GLM_SMOOTH|GLM_TEXTURE|GLM_MATERIAL);
    glPopMatrix();
    

    aber wie kann ich nun die obj datei (z.b.) nach hinten (also -z auf koordinatensystem) bewegen?

    achja: das mit std::ifstream funktioniert bei mir, ist mir aber ein wenig zu lang, deswegen teste ich nochmal jesters version und wenn mir das auch nich so gefällt dann benutze ich nur obj dateien



  • aber wie kann ich nun die obj datei (z.b.) nach hinten (also -z auf koordinatensystem) bewegen?

    Um nicht die komplette Szene zu transformieren, pushte einfach ne neue Matrix und translantierst sie mit glTranslatef( x, y, z ).

    achja: das mit std::ifstream funktioniert bei mir, ist mir aber ein wenig zu lang

    Alternativ kannst du dir auch einen fertigen Loader ansehen:
    http://sourceforge.net/projects/objloader
    Einen Loader dafür zu schreiben, ist nicht die Welt, daher kannst du auf das OBJ-Format-Studium verzichten.



  • ok danke, ich hab nur noch ein problem: als ich heute meinen code noch einmal testen wollte habe ich folgende fehler bekommen:

    1>funktionen.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""void __cdecl glmDraw(struct _GLMmodel *,unsigned int)" (?glmDraw@@YAXPAU_GLMmodel@@I@Z)" in Funktion ""void __cdecl Starten(void)" (?Starten@@YAXXZ)".
    1>funktionen.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""struct _GLMmodel * __cdecl glmReadOBJ(char *)" (?glmReadOBJ@@YAPAU_GLMmodel@@PAD@Z)" in Funktion ""void __cdecl Starten(void)" (?Starten@@YAXXZ)".
    1>C:\Users\asd\Desktop\asd\Debug\asd.exe : fatal error LNK1120: 2 nicht aufgelöste externe Verweise.
    

    hier meine includes:

    #include <windows.h>
    #include <gl/gl.h>
    #include <gl/glm.h>
    #include <gl/glut.h>
    #pragma comment(lib, "OpenGl32.lib")
    #pragma comment(lib, "Glu32.lib")
    

    danke schonmal

    p.s.: platform sdk hab ich natürlich auf dem pc auch installiert



  • Die Funktion glmDraw( ) ist mir persönlich nicht bekannt, meinst du die glDraw( )? Wobei es schon glatt so aussieht, als sei glmDraw( ) und glmReadOBJ( ) von deinem OBJ-Loader. Falls das so ist, kann er nicht auf den Funktionsnamen verweisen. Hast du den Loader in einer extra Header+Cpp-Datei? Wenn ja, musst du den Header inkludieren, dass weisst du hoffentlich (-;.



  • Die Funktion glmDraw( ) ist mir persönlich nicht bekannt, meinst du die glDraw( )?

    hmm, ich habs jetzt mal ohne "m" gemacht, aber da sagt er dann: "Bezeichner nicht gefunden"

    Hast du den Loader in einer extra Header+Cpp-Datei? Wenn ja, musst du den Header inkludieren, dass weisst du hoffentlich (-;.

    hab ich gemacht (gehört ja zu den grundlagen 👍 )



  • Na dann schau doch einfach mal, ob die Funktionen überall die gleichen Funktionsnamen haben. Ansonsten schick mir eben den Code (E-Mail), dann sehe ich mir den eben an.



  • hast ´ne mail



  • Nochmal bitte, hatte eine falsche E-Mailadresse hinterlassen.



  • Hat's geklappt?



  • jo, jetzt hat dank dir alles geklappt


Anmelden zum Antworten