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
-
Der durchschnittliche Quelltext im Grafik/Spiele-sektor ist aber grottenschlechtes C++ (nichtmal gutes C). Bei Jester hat man die (fast) einmalige Gelegenheit sowas in gutem sauberem C++ zu bekommen.
Da ich in dem Gebiet noch nen "noob" bin, kann ich ne referenz gut gebrauchen.