schon wieder md3



  • hi leute!

    sorry das schon wieder jemand danach fragt, aber ich brauche dringend ein tutorial über das laden von md3, md4 oder md5 format in dx9 mit c++. ich hab beim googeln auch ne menge gefunden, aber entweder laufen die garnicht oder sind in opengl oder sonstige mir unbekannte sprachen 🙂
    ich brauche dringend ein funktionierendes beispiel. kann sich jemand dazu verleiten lasssen mir was nütliches zukommen zu lassen?
    thx
    DeziBell





  • /***************************************************************************/
    /*                                                                         */
    /* File:   main.cpp                                                        */
    /* Author: bkenwright@xbdev.net                                            */
    /* URL:    www.xbdev.net                                                   */
    /* Date:   19-03-2006 (easter)                                             */
    /*                                                                         */
    /***************************************************************************/
    /*
       Understanding the Quake3 MD3 File Format
    */
    
    //---------------------------------------------------------------------------
    
    #define SZ_MD3_FILE "media\\model\\sarge\\upper.md3"
    
    #define MAX_FILENAME_LENGTH 256
    
    //---------------------------------------------------------------------------
    
    #include <windows.h>
    #include <stdio.h>                      //sprintf(...)
    
    //---------------------------------------------------------------------------
    
    //Saving debug information to a log file
    void abc(char *str)
    {
          FILE *fp = fopen("output.txt", "a+");
          fprintf(fp, "%s\n", str);
          fclose(fp);
    }
    
    //---------------------------------------------------------------------------
    
    struct stMD3Header
    {
        char    ID[4];          //  "IDP3"
        int     Version;        //  15
        char    Filename[68];
        int     numBoneFrames;
        int     numTags;
        int     numMeshes;
        int     numMaxSkins;
        int     headerLength;
        int     TagStart;
        int     TagEnd;
        int     FileSize;
    };
    
    struct stBoneFrame
    {
        float mins[3];
        float maxs[3];
        float Position[3];
        float Scale;
        float Creator[16];
    };
    
    struct stAnim
    {
        int FirstFrame; 
        int numFrames;
        int LoopingFrames;
        int FPS; 
    };
    
    struct stTag
    {
        char            Name[64];
        float           Position[3];
        float           Rotation[3][3];
    };
    
    struct stTriangle
    {
        int Vertex[3];
    };
    
    struct stTexCoord
    {
        float Coord[2];
    };
    
    struct stVertex // = Record
    {
        short int       Vertex[3];
        unsigned char   Normal[2];
    }; 
    
    struct stMeshHeader
    {
        char    ID[4];
        char    Name[68];
        int     numMeshFrames;
        int     numSkins; 
        int     numVertexes;
        int     numTriangles;
        int     triStart;
        int     headerSize;
        int     TexVectorStart;
        int     VertexStart;
        int     MeshSize;
    };
    
    struct stMesh
    {
        stMeshHeader    MeshHeader;
        char            Skins[68];
        stTriangle      Triangle;
        stTexCoord      TexCoord;
        stVertex        Vertex;
        unsigned int    Texture;
        bool            SetTexture; 
    };
    
    //---------------------------------------------------------------------------
    
     long filesize(FILE *stream)
     {
        long curpos, length;
    
        curpos = ftell(stream);
        fseek(stream, 0L, SEEK_END);
        length = ftell(stream);
        fseek(stream, curpos, SEEK_SET);
        return length;
     }
    
     //---------------------------------------------------------------------------
    
    class CMD3
    {
    public:
        char        m_md3FileName[MAX_FILENAME_LENGTH];
    
        stMD3Header m_md3Header;
        stBoneFrame m_boneFrame;
        stTag       m_tags;
    
        stMesh      m_meshes[100];
    
        //-----------------------------------------------------------------------
        //
        //  Loads model from a .md3 file
        //
        //-----------------------------------------------------------------------
        bool LoadModel(char* filename)
        {
            char buf[256];
    
            FILE* fp = fopen(filename, "rb");
    
            if (fp==NULL)
            {
                abc("unable to open file");
                return false;
            }
    
            int md3filesize = filesize(fp);
            fseek(fp, 0L, SEEK_SET);
    
            if (strlen(filename)>255)
            {
                sprintf(buf, "filename is longer than %d",  MAX_FILENAME_LENGTH);
                abc(buf);
                return false;
            }
            // copy name
            strcpy(m_md3FileName, filename);
            sprintf(buf, "MD3 FileName: %s", m_md3FileName);
            abc(buf);
    
            sprintf(buf, "FileSize: %d", md3filesize);
            abc(buf);
    
            abc("\n~~MD3 Header~~\n");
    
            // read header
            fread(&m_md3Header, 1, sizeof(stMD3Header), fp);
    
            // log debug information to file
            sprintf(buf, "ID %c%c%c%c", m_md3Header.ID[0], m_md3Header.ID[1], m_md3Header.ID[2], m_md3Header.ID[3]);
            abc(buf);
    
            sprintf(buf, "Version: %d", m_md3Header.Version);
            abc(buf);
    
            sprintf(buf, "FileName: %s", m_md3Header.Filename);
            abc(buf);
    
            sprintf(buf, "numBoneFrames: %d", m_md3Header.numBoneFrames);
            abc(buf);
    
            sprintf(buf, "numTags: %d", m_md3Header.numTags);
            abc(buf);
    
            sprintf(buf, "numMeshes: %d", m_md3Header.numMeshes);
            abc(buf);
    
            sprintf(buf, "numMaxSkins: %d", m_md3Header.numMaxSkins);
            abc(buf);
    
            sprintf(buf, "headerLength: %d", m_md3Header.headerLength);
            abc(buf);
    
            sprintf(buf, "TagStart: %d", m_md3Header.TagStart);
            abc(buf);
    
            sprintf(buf, "TagEnd: %d", m_md3Header.TagEnd);
            abc(buf);
    
            sprintf(buf, "FileSize: %d", m_md3Header.FileSize);
            abc(buf);
    
            if (strcmp("IDP3", m_md3Header.ID)==NULL)
            {
                sprintf(buf, "Incorrect File Format 'Incorrect ID' ie. ('IDP3')");
                abc(buf);
            }
    
            /*
            // read boneframes
            fread(&m_boneFrame[0], 1, m_md3Header.numBoneFrames*sizeof(stBoneFrame), fp);
    
            // read tags
            fread(&m_tags[0], m_md3Header.numBoneFrames*m_md3Header.numTags*sizeof(stTag));
    
            int MeshOffset = ftell(fp);
    
            //For I :=0 to Header.numMeshes-1 do
            //  begin
            for (int i=0; i<MD3Header.numMeshes; i++)
            {
                fseek(fp, MeshOffset, SEEK_SET);
    
                // Load the Skins
                fread(Meshes[i].Skins[0], 68 * Meshes[i].MeshHeader.numSkins, fp);
    
                // Triangles
                fseek(fp, MeshOffset + Meshes[i].MeshHeader.triStart, SEEK_SET);
                fread(Meshes[i].Triangle[0], sizeof(stTriangle)*Meshes[i].MeshHeader.numTriangles, fp);
    
                // Texture Coordiantes
                fseek(fp, MeshOffset + Meshes[i].MeshHeader.TexVectorStart);
                fread(Meshes[i].TexCoord[0], sizeof(stTexCoord)*Meshes[i].MeshHeader.numVertexes, fp);
    
                // Vertices
                fseek(fp, MeshOffset + Meshes[i].MeshHeader.VertexStart);
                fread(Meshes[i].Vertex[0], sizeof(stVertex)*Meshes[i].MeshHeader.numVertexes * Meshes[i].MeshHeader.numMeshFrames);
    
                MeshOffset = MeshOffset + Meshes[i].MeshHeader.MeshSize;
            }
        */
    
            fclose(fp);
    
            return true;
        }// End LoadModel(..)
    
    };
    
    //---------------------------------------------------------------------------
    
    INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                       LPSTR lpCmdLine, int nCmdShow)
    {
    
        static CMD3 md3;
    
        md3.LoadModel(SZ_MD3_FILE);
    
        // If something was not done, let it go
        return 0;
    }
    
    //---------------------------------------------------------------------------
    


  • ich danke dir vielmals! habe heute keine zeit mehr das alles durchzusehen, werde es aber schleunigst nacholen 🙂 danke, danke, danke! melde mich morgen wieder 🙂



  • Für MD5 fand ich das hier ganz nett: http://tfc.duke.free.fr/coding/md5-specs-en.html

    Einlesen des Formats geht übrignes prima mit boost::spirit.



  • jo... danke jester.. ich fang jetzt ersteinmal an mich einzulesen 🙂



  • ja schade. schein sogar für das md3 modell format zu dumm zu sein. ich raff garnichts! danke euch trotzdem 😕



  • Ich hab kürzlich erst nen MD5-Loader geschrieben. Schick mir ne Mail, wenn Du den haben willst. Müßte ich vielleicht vorher noch ein bissel aufräumen. Kann auch noch nicht wirklich viel. 🙂 Aber er lädt md5-Meshes.



  • das wäre nett von dir 🙂 wenn du es ein wenig "aufgeräumt" hast wie du sagst würde ich mich sehr darüber freuen 😉 ohne ein komplett lauffähiges demo krieg ich das nämlich bestimmt nicht hin. kannst du mir denn ein md5 modell dazu packen oder kannst du mir ne adresse geben wo ich eins her bekomme? weiss grad nicht ob Milkshape, gmax oder blender in md5 convertieren können.

    habe mir mal das dx9 skinned mesh sample (*.x) angeschaut und nur das nötigste im code gelassen. hat auch geklappt, aber wenn ich mehrere modelle rendere, macht der mir beim 4 Mesh probleme. das 5. ist dann wieder in ordnung. weiss immer noch nicht warum dem 4. ein bein fehlt 🙂 da dachte ich dann an die md3 oder md5 modelldateien. war wohl nix 🙂

    [edit]
    habe mir dann selbst ein exporter für c4d geschrieben. allerdings war der nicht so doll. für jedes frame das komplette mesh wieder und wieder zu exportieren und dann die positionen zu interpolation find ich reine speicher verschwendung 🙂 hab ich auch gleich wieder verworfen.

    thx DeziBell
    AndreasSteinbrecher@gmx.de
    ICQ NAME : Stone
    ICQ NR : 219 012 102

    [edit]
    nunja, beim googeln findet man jedenfalls einige exporter in md5 zu allen 3 programmen. standardmässig geht kein md5 format. ist aber das kleinere problem 🙂 ist nur sehr deprimierend jetzt endlich ein 3d shooter spiel schreiben zu wollen, und dann scheiterts an den enemys 🙂



  • sorry! eins hab ich noch...

    @VertexWahn:
    lohnt sich die anmeldung bei http://www.xbdev.net ??? wenn ich schon geld dafür bezahlen soll möchte ich auch ganz sicher sein das ich auch etwas dafür bekomme 🙂 allein fürs md3 format mach ich das nicht 🙂
    THX
    DeziBell



  • Jester schrieb:

    Ich hab kürzlich erst nen MD5-Loader geschrieben. Schick mir ne Mail, wenn Du den haben willst. Müßte ich vielleicht vorher noch ein bissel aufräumen. Kann auch noch nicht wirklich viel. 🙂 Aber er lädt md5-Meshes.

    Kann man sowas nicht in die FAQ hauen? Datenformate interessieren doch sooo viele Leute..



  • Hi!

    Ein Link zu einer Spezifikation würds doch auch tun'. Einen Md5 Meshloader zu schreiben ist sehr leicht, da brauchts nicht viel Beispielcode um das hinzubekommen.

    grüße



  • hallo zusammen.

    jester hat mir glücklicherweise unter die arme gegriffen und mir so einiges zum md5 format erklärt. in den nächsten tagen werde ich das ganze mal ausprobieren, und wenn ichs dann hinbekomme bin ich gerne bereit das wissen zu teilen. fragt mich doch einfach via icq.

    @David_pb
    na grundsätzlich würde das wohl mit der spezifikation des md5 formats klappen. nur habe ich und viele andere noch nicht genug erfahrung das alles ohne hilfestellung zusammen zu basteln. aber du hast recht. es scheint garnicht so schlimm zu sein 🙂



  • Wäre auch an dem MD5-Modelloader interressiert 🙂

    Angesichts des regen interresses wirst du da den Modelloader in Form eines FAQ-Beitrags veröffentlichen?



  • Dezibell schrieb:

    @David_pb
    na grundsätzlich würde das wohl mit der spezifikation des md5 formats klappen. nur habe ich und viele andere noch nicht genug erfahrung das alles ohne hilfestellung zusammen zu basteln. aber du hast recht. es scheint garnicht so schlimm zu sein 🙂

    Ne is ganz und gar simpel. Hab zu Doom3 Releaszeiten selbst einen MD5 Loader geschrieben. Das war selbst ohne Spezifikation des Formats kein Problem.

    grüße



  • meine hirn - cpu hat noch bugs... da geht das alles noch nicht so schnell*gg



  • User-- schrieb:

    Wäre auch an dem MD5-Modelloader interressiert 🙂

    Angesichts des regen interresses wirst du da den Modelloader in Form eines FAQ-Beitrags veröffentlichen?

    Hm, der Code ist zum einen noch nicht wirklich schön, zum anderen ist er auch teilweise mit dem Rest meines Codes verwoben (Texturen laden etc.) Deswegen bin ich mir etwas unsicher, ob ich den hier veröffentlichen möchte. Ich denke aber mal drüber nach.



  • Kannst ihn ja mir schicken, ich bau mal dran rum..



  • Wieso seit ihr alle so geil auf den Quellcode? Gibt doch so viele Opensource MD5 Loader... :-S

    grüße



  • also von mir kriegt man den loader erst wenn ich ihn selber verstehe und der source ein wenig ordentlicher geschrieben ist. schon allein weil vielleicht fragen aufkommen die ich noch nicht beantworten kann bzw weil ich mich für schlechten code schämen würde 🙂 seit mir nicht böse, aber in nen paar tagen sollte es dann soweit sein. hoffe ich... wenn ich nur dieses boost zum laufen bekommen würd. naja... hab erst heute nacht wieder zeit ein wenig zu lernen !*g


Anmelden zum Antworten