Bullet unter Windows mit Codeblocks
Als Physik-Engine ist Bullet m.E. weitgehend alternativlos. Es gibt zwar einige andere, recht ordentliche Engines wie "Newton Physics" oder "ODE", doch die Tatsache, das Programme wie Blender oder Maratis auf Bullet setzen, ist ein deutliches Argument. Ich finde, auch die Demos sind recht überzeugend.
Installation von Bullet
Die Installation von Bullet unter Codeblocks (Windows) ist etwas aufwendig, weil das Download-Paket nur unkompilierten Quelltext enthält. Zwar liest man gelegentlich, dass man diese Sourcen direkt in eigene Projekte aufnehmen könne, aber dazu ist das ganze Paket nach meiner Auffassung doch ein wenig zu umfangreich, zumal wenn man öfter sein Projekt neu kompilieren möchte oder muss. Somit ist es am günstigsten, eine statische Library zu kompilieren, was ganz gut mit Codeblocks geht. Vorab ein Hinweis: Im Bullet-Paket sind die Header und CPP-Dateien im selben Ordner (/src) untergebracht. Das ist von Bedeutung, wenn in Codeblocks die Pfade eingestellt werden.
Für die Erzeugung der statischen Library gibt es eine ordentliche Anleitung: How to make the Bullet lib using GCC Code::Blocks. Hier eine kurze Beschreibung des Vorgangs:
1. Es wird ein neues Codeblocks-Projekt angelegt, und zwar auf der Basis einer statischen Library. Als Projektbezeichnung eignet sich der Name der zu generierenden Bibliothek, z.B. libBullet.
2. main.cpp wird nicht gebraucht und über das Kontextmenü aus dem Projekt entfernt. Dafür werden, nun über das Kontextmenü des Projektes, alle Dateien des Bullet-Src-Ordners eingefügt (Add files recursively). Im folgenden Dialog werden die bereits markierten Dateien übernommen. Nun sind unter Sources und Headers sehr viele Einträge vorhanden. Zwei Gruppen müssen aber wieder entfernt werden, und zwar sowohl bei den Sources als auch bei den Headern: BulletMultiThreaded und MiniCL. Diese beiden Libraries lassen sich zur Zeit nicht mit Codeblocks kompilieren - sie sind aber auch überflüssig.
3. Im Dialog <Build options/Search directories> des Projektes wird nun noch der Pfad zum Bullet-Src-Order eingetragen, und zwar sowohl für C++ als auch für den Linker (im Src-Ordner ist ja alles enthalten).
4. Nun kann der Compiler mit F9 gestartet werden. Wenn, wie oben angegeben, die beiden Libraries entfernt wurden, müsste der Compiler/Linker durchlaufen. Im Projektverzeichnis von Codeblocks ist anschließend die gewünschte Library libBullet.a zu finden und kann in den Lib-Ordner von Codeblocks kopiert werden.
5. Das Projekt diente nur zur Erzeugung der statischen Library und wird nun nicht mehr gebraucht.Falls gewünscht kann es gelöscht werden.
6. Aus dem Bullet-Paket müssen schließlich noch die Header in den Include-Ordner von Codeblocks kopiert werden. Aber man kann sie nicht einfach herüberkopieren, sondern die Ordnerstruktur muss erhalten bleiben, da fast alle Header von anderen eingebunden werden. Der Benutzer verwendet nur die drei Header im Haupt-Src-Verzeichnis. Damit es reibungslos geht, hier ein Vorschlag:
- Im Codeblocks-Include-Ordner wird der Unterordner bullet angelegt.
- Der komplette Inhalt des Src-Ordners wird in diesen Ordner kopiert.
- Wenn man möchte, kann man rekursiv durch den Ordnerbaum gehen und alle Dateien löschen, die keine Header sind.
Verwendung in Codeblocks
Wenn Bullet so installiert wurde wie oben beschrieben, müssen im Projekt nur noch die Pfade zu den Include- und Lib-Ordnern von Codeblocks eingetragen sowie die neu erstellte Library registriert werden. Wurde die statische Library unter dem Namen libBullet.a erzeugt, lautet die Eintragung schlicht:
Eines ist allerdings noch zu beachten: Der Include-Pfad darf nicht zum Include-Ordner gelegt werden, sondern muss auf den Unterordner /bullet verweisen. Grund: Wie oben aufgeführt, werden viele Header "nachgezogen", und das geht nur, wenn der Unterordner /bullet der Startpunkt ist. Mit einer erweiterten Include-Anweisung im Programm (z.B. #include "bullet/btDynamicsCommon.h") funktioniert es nicht.
Zum Testen, ob alles richtig installiert ist, reicht ein extrem simpler und kurzer Code. Wenn alles ok ist, passiert nicht, doch wenn es einen Fehler gibt, wird der gemeldet.
#include "btBulletDynamicsCommon.h" using namespace std; int main () { btBoxShape *box = new btBoxShape (btVector3 (1,1,1)); return 0; }