Wavefront * .obj Loader in C ++

7

Ich erstelle ein Spiel mit OpenGL (über SDL) und C ++ (über Visual Studios 2010 Professional). Während des Spiels werde ich 3D-Charakteranimationen verwenden. Ich möchte für alle 3D-Modelle (mit Ausnahme des Geländes) Wellenfront * .obj-Dateien verwenden. Die Charaktere müssen fließende Bewegungen (realistisch) mit bis zu 250-500 Bildern haben (zum Gehen, Laufen, Sprinten, Springen, Hocken, Krabbeln usw.). Ich möchte entweder md2 oder md3 verwenden, aber das von mir verwendete 3D-Modellierungs- / Animationswerkzeug (Blender 3D 2.57) unterstützt keines von beiden. Das Spiel läuft nur unter Windows.

Was ich brauche, ist ein kleiner, aber leistungsstarker * .obj-Loader und -Parser, der Animationen unterstützt. Es muss in C ++ geschrieben und von SDL verwendbar sein.

Vielen Dank

Okay, nachdem ich mir alle Dateiformate angesehen habe, in die Blender exportieren kann ... Ich habe mich für 3DS entschieden, da es beim Exportieren des Standardwürfels das kleinste Dateiformat erzeugt. Vielen Dank an Daniel für die Empfehlung von 3DS!

Joshua Vega
quelle
Hast du gegoogelt? Libobj fällt mir ein.
Verlangsamte
Sind Sie sicher, dass .obj Animationen unterstützt?
@Christian Rau: Nicht im Kern, aber Sie können jeden Frame der Animation als separate OBJ-Datei exportieren.
Amir Zadeh

Antworten:

5

OBJ unterstützt keine Animation. Weitere Informationen finden Sie hier .

Für einen kompatiblen OBJ-Loader fällt lib-obj ein .

Wenn Sie zu Hause brauen möchten und sicherstellen können, dass die Datei nur Dreiecke enthält; Keine Quads usw., das Parsen eines OBJ ist willkürlich (sein einziger Text!):

        char prefix[10] = {0};
        stream >> prefix;

        switch (prefix[0]) {
            case 'v' : {
                switch (prefix[1]) {
                    case 't' : {} break; // texcoords
                    case 'n' : {} break; // normals
                    default : { // points
                        float x, y, z;
                        stream >> x >> y >> z;
                        // put in a mesh etc
                    }
                }
            } break;
            case 'f' : {
                unsigned short a, b, c;
                stream >> a >> b >> c;

                // etc
            } break;
            default : {} // skip
        }
    }

Im Zweifelsfall beachten Sie die Spezifikation .

verzögert kaviar
quelle
Ich würde lib-obj oder Homebrew verwenden, aber ich brauche wirklich die Animation. Kennen Sie einen md2- oder md3-Dateiexporter für Blender 2.57? Ich würde gerne eines davon verwenden ...!
Gibt es einen Grund für md2 oder md3? Es gibt andere Formate, die Animationen unterstützen können. Vielleicht das 3DS-Format anschauen?
Verlangsamte
MD2 und MD3 sind angesehene Formate und sehr beliebt. Ich habe noch nie von 3DS gehört und weiß nichts darüber. Ich werde mich darum kümmern ... Danke.
2
@jsvcycling: In welchem ​​Jahrzehnt lebst du? MD2 und MD3 stammen aus den 90er Jahren. Heutzutage verwenden wir Formate wie OpenCTM oder ähnliches. Heute besteht ein Modell nicht nur aus Scheitelpunktposition, Normalen und Texturkoordinaten. Es gibt Scheitelpunktgruppen, Knochengewichte, zusätzliche Attribute usw. MD2 und MD3 sind einfach nicht der Aufgabe gewachsen.
Datenwolf
1
Ich sehe keine Erwähnung in der Spezifikation? Manuelles Keyframing zählt nicht.
Verlangsamte
1

Nur weil Blender Ihnen einen Exporter für Wavefront anbietet, heißt das nicht, dass auch die gesamte Animation exportiert wird. Wavefront OBJ kennt keine Animation!

Andererseits ist es durchaus möglich, ein Exporter-Add-On für md2 / md3 zu implementieren, und AFAIK gibt es bereits.

Abgesehen davon, so wie ich es verstanden habe, beabsichtigen Sie, das vollständige Netz für jeden Animationsrahmen zu speichern. Dies ist eine sehr ineffiziente Methode zur Animation. Ein besserer Ansatz wäre, nur Keyframes zu speichern und zwischen diesen zu interpolieren. Oder noch besser: Implementieren Sie ein Netzverformungssystem, das mit dem Animationssystem von Blender kompatibel ist, oder implementieren Sie ein eigenes Netzverformungssystem für Blender und Ihr Programm. Das Animieren einfacher Ganzobjekttransformationen ist einfach. Netzverformungen in Blender treten normalerweise über den eingebauten Ankermodifikator auf. Es ist jedoch durchaus möglich, einen eigenen Netzverformungsoperator als Ersatz für den Ankermodifikator zu implementieren.

ATM Ich entwickle ein Export / Import-Blender-Add-On, das alle aktuell geladenen Daten im JSON-Format speichert. entweder eine große Datei oder eine einzelne Datei für jeden Datenblock. Die Hauptidee besteht darin, es mit WebGL zu verwenden (dh eine WebGL-Engine zu implementieren, mit der Dinge geladen werden können, die ursprünglich für die Blender Game Engine erstellt wurden). Vielleicht kann ich Sie daran interessieren, JSON zum Speichern von Modellen und Informationen zu verwenden.

Datenwolf
quelle
Ja, ich habe vergessen zu erwähnen, dass ich Armaturen für die Animation verwenden werde ...
Aber wo ist die Relevanz zwischen OBJ Loader, SDL und Animation?
Verlangsamte
hmm ... JSON sieht ziemlich gut aus! Und es stehen viele verschiedene Bibliotheken zur Auswahl (in C ++)! Ich könnte das benutzen ...
Nun, ich habe darüber nachgedacht, so etwas wie MPEG4-Videos zu machen. Die Teile der Modelle, die sich beim Übergang von einer Szene zur nächsten nicht bewegen, werden "kopiert". Wenn also in Szene 53 nur ein Finger bewegt wird, wird der Rest des Körpers von Szene 52 in Szene 53 kopiert. Kennt jemand ein 3D-Dateiformat, das so funktioniert ...?
1
@jsvcycling: Diese Art der Netzersatzanimation ist sehr, sehr ineffizient. Es erfordert das ständige Kopieren großer Datenmengen in den GPU-Speicher, wodurch viel Bandbreite verschwendet wird. Auch die CPU ist ständig mit der Buchhaltung beschäftigt. Was Sie wirklich tun sollten, ist die Implementierung eines Skelettanimationssystems. Mit Vertex-Shadern ist dies einfach genug: Jeder Knochen kann durch eine Quaternion und eine neutrale Transformation beschrieben werden. Die Quaternionen werden durch Uniformen festgelegt; Im Shader wird die Knochenerbschaft ausgewertet, was eine Transformation für jeden Knochen ergibt, die dann auf Scheitelpunkte mit einem Gewicht angewendet wird.
Datenwolf
1

Obwohl die .obj-Spezifikation Animationen nicht nativ unterstützt, können Sie durch einfaches Erweitern mit einer separaten .anm-Datei brillante Animationen ohne Knochen erhalten.

Schauen Sie sich Folgendes an: - http://public.sanguinelabs.co.uk/expose/product.php?id=wastudio

Dies bietet ein sehr einfach zu verwendendes Tool zum Erstellen der Animationen sowie eine Open-Source-Modellbibliothek (für OpenGL), mit der Sie die animierten Modelle schnell in Ihrem Projekt zum Laufen bringen können.

Hinweis: Ich bin der Entwickler von Wavefront Animation Studio und libwavefront. Wenn Sie Verbesserungen oder Fehler melden möchten, senden Sie mir bitte eine E-Mail. Die Software wurde während meiner Zeit an der Universität entwickelt, weil ich es äußerst umständlich fand, Animationen mit den derzeit verfügbaren komplexen Tools und Bibliotheken zu erstellen und anzuzeigen.

Karsten Pedersen
quelle
0

Die Antwort auf das, was Sie suchen, ist nicht * .obj, da es einer Bitmap für Animationen ziemlich ähnlich ist (Sie können es mit Blender exportieren, aber Sie müssen Blender anweisen, jedes Bild als einzelne * .obj-Datei zu exportieren [NICHT EFFIZIENT IN JEDER ASPEKTE], wie ein Film und seine Bilder). Was Sie wirklich suchen, ist Collada. Es gibt einen Mesh-Loader namens Assimp, der wie eine Million Mesh-Formate geladen wird (ich verwende ihn für meine neue Engine). Und was Sie über * .3DS gesagt haben, ist nicht immer wahr.

Amir Zadeh
quelle