Seite 1 von 1
Format-Konverter mit Hilfe der Asset Import Library (Assimp)
Verfasst: 01.04.2010, 17:13
von orrence
Hallo!
Ich entwickle in meiner (leider sehr spärlichen) Freizeit ein kleines 3D-Adventure mit der sehr vielversprechenden Dog Adventure Game Engine (DAGE).
Leider unterstützt DAGE für den Import von Charakteren und Animationen nur das SMD-Format (Half-Life, Sims) und MD2-Format (Quake2), was ein bißchen dürftig ist. Ich würde die Situation der DAGE-User gern verbessern, indem ich die (großartige!) Open Asset Import Library (Assimp) verwende, um eine Vielzahl unterschiedlichster Formate lesen zu können und dann die Mesh- und Animations-Daten im SMD-Format zu schreiben.
Hat jemand hier evtl. Erfahrung mit SMD und kann mir helfen oder nützliche Tipps geben? Gibt es irgendwo eine Spezifikation für das SMD-Format? (Entweder habe ich schlecht gegoogelt, oder das Format ist nicht offen gelegt.) Oder gibt es vielleicht schon eine (C oder C++)-Bibliothek, die das Schreiben von Daten im SMD-Format zum Kinderspiel macht?
Bin für jeden Hinweis dankbar ...
orrence.
Re: Format-Konverter mit Hilfe der Asset Import Library (Ass
Verfasst: 01.04.2010, 17:20
von Aramis
Willkommen im ZFX, orrence. Wir sind uns ja bereits auf SF.net begegnet :-)
Hat jemand hier evtl. Erfahrung mit SMD und kann mir helfen oder nützliche Tipps geben
Ich hab damals den SMD-Loader für Assimp implementiert. Bis heute hab ich aber Animationen nicht wirklich zum Laufen bekommen.
Eine halbwegs brauchbare Dokumentation hat es im
Valve-Wiki. Ansonsten würde ich die Beispielmodelle im Valve SDK als Referenz nehmen.
Viel Erfolg!
Re: Format-Konverter mit Hilfe der Asset Import Library (Ass
Verfasst: 01.04.2010, 18:03
von orrence
Hallo Alexander!
Danke für das "Willkommen" und danke für die Hilfe auf SF.net. Hatte leider noch keine Gelegenheit, auszuprobieren, ob mein "Micky-Mouse"-Assimp-Skript mit Deinem Hinweis läuft.
Das Valve-Wiki als "halbwegs brauchbare Dokumentation" zu bezeichnen halte ich ja schon fast für gewagt, aber nun gut, es muss dann eben reichen. Danke für den Hinweis!
Weisst Du vielleicht, ob jemand an Assimp-bindings für Pascal/Delphi arbeitet? Wenn es solche bindings gäbe, hätte ich jemanden, der sich gut mit SMD auskennt und der den Konverter dann komplett in Pascal/Delphi schreiben könnte. :)
Gruß,
Daniel.
Re: Format-Konverter mit Hilfe der Asset Import Library (Ass
Verfasst: 01.04.2010, 18:25
von Aramis
Soweit ich weiß gibt es keine Delphi-Bindings für Assimp und auch niemanden der daran arbeitet, nein. Es sollte aber nicht zu aufwändig werden welche zu erstellen (schlussendlich müssten ja nur die Header nach Delphi umgeschrieben werden). In dem Fall wäre es toll wenn ihr das Ergebnis öffentlich machen würdet, vermutlich könnten noch mehr davon profitieren.
Re: Format-Konverter mit Hilfe der Asset Import Library (Ass
Verfasst: 02.04.2010, 08:40
von orrence
Sollten wir den Weg über die Delphi-Bindings gehen, werden wir sie auf jeden Fall der Allgemeinheit zur Verfügung stellen. Vielleicht implementiere ich aber auch den geplanten Konverter ganz in C++. Mal sehen.
Noch jemand weitere nützliche Hinweise oder Ideen?
Re: Format-Konverter mit Hilfe der Asset Import Library (Ass
Verfasst: 15.04.2010, 16:50
von orrence
Hallo!
Ich versuche, mir einen Überblick über die Struktur eines aus 3DS stammenden Charakters mit einer Animation im .ASE-Format zu verschaffen, um anschließend die Bones, Faces und die Animation ins SMD-Format zu übertragen.
Problem dabei: ich kann die 31 Bones, die eigentlich da sein müssten, nicht finden.
Ich durchlaufe rekursiv alle Nodes und für alle Nodes alle Meshes (sofern vorhanden) und lasse mir Anzahl Vertices, Faces und Bones ausgeben. Für alle Meshes wird ausgegeben, dass "0 Bones" vorhanden sind.
Hier ist der auf ein Minimum reduzierte Code, der mit dem scene-Objekt und dem root-node der Szene aufgerufen wird:
Code: Alles auswählen
void recursivelyProcessNodes( const aiScene* scene, const aiNode* nd ) {
aiString nameStr = nd->mName;
char* nodeName = nameStr.data;
cout << "Processing NODE "; cout << nodeName << endl;
// Process all meshes assigned to this node
for ( unsigned int n = 0; n < nd->mNumMeshes; n++ ) {
const aiMesh* mesh = scene->mMeshes[nd->mMeshes[n]];
cerr << "Mesh has " << mesh->mNumVertices << " vertices!" << endl;
cerr << "Mesh has " << mesh->mNumFaces << " faces!" << endl;
cerr << "Mesh has " << mesh->mNumBones << " bones!" << endl;
cerr << "###############################################" << endl;
}
for ( unsigned int n = 0; n < nd->mNumChildren; ++n ) {
recursivelyProcessNodes( scene, nd->mChildren[n] );
}
}
Hier ein Auszug aus der Ausgabe:
Scene has 31 mesh(es)!
Scene has 2 material(s)!
Scene has 1 animation(s)!
Processing NODE <ASERoot>
Processing NODE
Processing NODE Wayne01
Mesh has 4326 vertices!
Mesh has 1442 faces!
Mesh has 0 bones!
###############################################
Processing NODE Bip01
Mesh has 6 vertices!
Mesh has 8 faces!
Mesh has 0 bones!
###############################################
Processing NODE Bip01 Footsteps
Mesh has 9 vertices!
Mesh has 8 faces!
Mesh has 0 bones!
###############################################
Processing NODE Bip01 Pelvis
Mesh has 24 vertices!
Mesh has 12 faces!
Mesh has 0 bones!
###############################################
Processing NODE Bip01 Spine
Mesh has 42 vertices!
Mesh has 24 faces!
Mesh has 0 bones!
.....
Der Assimp-Viewer zeigt die .ASE-Datei korrekt an und findet die Bone-Hierarchie, es liegt also nicht an der importierten Datei. Sogar die Animation wird korrekt wiedergegeben.
Was mache ich falsch?
Viele Grüße,
orrence.
Re: Format-Konverter mit Hilfe der Asset Import Library (Ass
Verfasst: 15.04.2010, 17:28
von Aramis
Du machst gar nichts falsch. Das Modell das du laedst ist nur nicht wirklich ein `geskinntes` Modell und benoetigt so etwas wie Bones ueberhaupt nicht (falls es urspruenglich mal welche gab sind sie entweder beim Export nach ASE verloren gegangen, oder unser Loader hat sie weggeworfen).
Guck dir mal die Struktur an: animiert werden ja strenggenommen die Knoten im Szenengraph. Aus einem einem Knoten zugehoerigen Animationskanal wird jedes Frame aufs neue eine lokale Transformationsmatrix berechnet, die dann die existierende (aiNode::mTransformation) ersetzt. Lokale Transformationen werden auf dem Weg in der Knotenhierarchie nach unten aufmultipliziert und ergeben die absolute Transformation fuer einen bestimmten Knoten in einem bestimmten Frame. Meshes die an einem Knoten dranhaengen werden mit diesem mittransformiert. Das ist hier der Fall. Ein Beispiel fuer ein solches Modell findest du auch im Assimp-Repository im ./test/ASE Verzeichnis.
Fuer `klassisch` geskinnte Modelle kannst du dir mal ./test/MD5/Bob angucken. Da sind alle Modelle an einem untransformierten Knoten dran und besitzen mehrere Bones, die dann auf animierte Knoten im Szenengraph verweisen und nach der ueblichen Skinning-Formel gemaeß der Boneweights verrechnet werden.
Re: Format-Konverter mit Hilfe der Asset Import Library (Ass
Verfasst: 15.04.2010, 18:34
von orrence
Danke schonmal für die schnelle Antwort und Deine wertvollen Hinweise!
Ich möchte noch hinzufügen, dass Assimp wirklich unglaublich schnell ist. Die Datei, die ich importiere, hat 600.000 Zeilen und Assimp braucht für das Parsen nur ca. 0,3s auf meinem Dual-Core-Athlon. Ich war wirklich beeindruckt!