Wie integriere ich die Kugelphysik in mein Spiel?

12

Ich habe die hier gefundene Release-Datei heruntergeladen , bin mir aber nicht sicher, wo ich anfangen soll. In meinem Spiel habe ich eine Reihe von Rechtecken und eine Kugel, ich möchte, dass all diese miteinander kollidieren. (Sie haben alle Maschen und zugehörige Begrenzungsvolumina)

edit - Ich habe gerade festgestellt, dass den Quadern tatsächlich AABBs zugeordnet sind. Ich denke, ich muss das zumindest ändern.

Welche Schritte muss ich befolgen?

Sir Yakalot
quelle
2
Haben Sie einen Blick in das Handbuch unter Kapitel 4.4 Integration overviewgeworfen ? Ich weiß, dass es sehr spartanisch ist, aber es beschreibt den grundlegenden Prozess. Wenn Sie sich das und den Code für die Beispieldemos ansehen, sollten Sie nicht zu viele Probleme haben.
PeterT
Überprüfen Sie auch die Beispiele im Bullet-Ordner, es gibt eine Reihe von 'em
Maik Semder
@ MaikSemder Ich war mir nicht ganz sicher, wie ich bestimmte öffnen sollte. Sind nur Dateien Linux?
SirYakalot
Eigentlich wären Notizen zum Öffnen der Beispiele unglaublich hilfreich, dann könnte ich sehen, wie sie die Dinge dort miteinander verbunden haben. Ich werde dafür googeln, aber ich dachte, ich sollte fragen, solange ich kann.
SirYakalot
Das hängt davon ab, auf welcher Plattform Sie sich befinden. Für Visual Studio unter Windows gibt es eine SLN-Datei für die Beispiele. Ich gehe davon aus, dass Sie diese verwenden. Suchen Sie einfach nach der sln-Datei im Bullet-Ordner.
Maik Semder

Antworten:

21

Hier sind die grundlegenden Schritte, die Sie ausführen müssen:

  1. Zunächst erstellen Sie ein Welt - Objekt (dh btDiscreteDynamicsWorld) Ihre Physik - Simulation zu fahren.

  2. Sie sollten bereits eine Klasse wie diese haben GameObject, die möglicherweise ein Modell zusammen mit seinem Begrenzungsrahmen und seiner Position / Ausrichtung in der Welt speichert. Ersetzen der Position / Orientierung Informationen mit einer Instanz eines physikalischen Körpers Objekt (dh btRigidBody) , und wenn das Modell Rendering verwenden , um die Stelle durch den Körper zur Verfügung gestellten Informationen. Wenn Sie den Körper erstellen, müssen Sie seine Masse und Kollisionsform angeben, die mit den bereits vorhandenen Begrenzungsvolumina übereinstimmen sollten. Ich habe auch in Ihrer anderen Frage darüber gesprochen .

  3. Fügen Sie dem Weltobjekt jeden Körper Ihres Spielobjekts hinzu.

  4. Aktualisieren Sie die Simulation, indem Sie die Welt betreten (dh stepSimulationIhre Welt anrufen ).

Nehmen Sie sich etwas Zeit, um das Handbuch zu lesen, da es auch viele Informationen enthält.


Bearbeiten, um den Kommentar zu adressieren

Ich erschrecke, bevor ich frage, aber ... wie mache ich die sehr grundlegenden Dinge, wie einfach die richtigen Dateien in mein Spiel aufzunehmen? Wenn Sie Einzelheiten benötigen, suche ich nach Dateien, die sich mit Starrkörperkollisionen befassen. Vielen Dank auch für die bisherige Hilfe!

Aus Ihrem Kommentar geht hervor, dass Sie noch nie zuvor mit externen C ++ - Bibliotheken gearbeitet haben. Es ist schon eine Weile her, seit ich das getan habe, aber so erinnere ich mich an den Prozess (in Visual Studio).

Für den Anfang zitiere ich das Handbuch, das bereits erklärt, was Sie brauchen:

- #include btBulletDynamicsCommon.h in your source file 
- Required include path: Bullet/src folder 
- Required libraries: BulletDynamics, BulletCollision, LinearMath

Und hier sind die grundlegenden Schritte, die Sie ausführen müssen, um die oben genannten Bedingungen zu erfüllen ...

1. Vorbereitungsschritt

Extrahieren Sie zunächst die heruntergeladene Datei in ein bekanntes Verzeichnis, z C:\Bullet. Sie müssen den Pfad zu diesem Ordner später kennen.

Im Inneren befinden sich zwei Ordner, auf die Sie in Ihrem Projekt verweisen müssen. Der erste ist der srcOrdner, der die hält .hHeader - Dateien , dass Sie umfassen im Quellcode. Der zweite ist der libOrdner, in dem sich die .libBibliotheksdateien befinden, die Sie mit Ihrem Projekt verknüpfen . Beachten Sie, dass das Einschließen und Verknüpfen zwei verschiedene Dinge sind.

Aber der libOrdner sollte nun leer sein, weil Sie nicht haben , gebaut um den Motor noch. Lesen Sie daher das Handbuch, wie Sie das Projekt beispielsweise mit CMake und Visual Studio erstellen. Es ist auf Seite 7.

Nachdem Sie erfolgreich waren, sollten Sie mindestens drei Dateien im libOrdner haben : BulletDynamics.lib, BulletCollision.libund LinearMath.lib(ich vermute aus dem Handbuch). Nun stellen Sie die Verbindung zwischen Bullet und Ihrem Projekt her ...

2. Überschriften einschließen

Zunächst müssen Sie den C:\Bullet\srcOrdner zu den Include-Pfadoptionen Ihres Projekts hinzufügen . Sie können dies in Visual Studio tun, indem Sie mit der rechten Maustaste auf Ihr Projekt klicken, zu Configuration Properties -> C/C++ -> General -> Additional Include Directoriesdem dort angegebenen Verzeichnispfad navigieren und diesen schreiben.

Nachdem Sie das eingerichtet haben, können Sie einfach #include “btBulletDynamicsCommon.h”Ihren Code bearbeiten. Dieser Header scheint als Hub für alle Funktionen zu dienen, die Sie benötigen.

3. Bibliotheken verknüpfen

Schließlich müssen Sie die oben genannten Bibliotheken verknüpfen. Frist, unter Configuration Properties -> Linker -> General -> Additional Library Directoriesfügen Sie den Pfad zum libOrdner hinzu, oder mit anderen Worten , C:\Bullet\lib.

Fügen Sie dann unter Configuration Properties -> Linker -> Input-> Additional Dependenciesden Namen der Bibliotheken zur Liste der Abhängigkeiten hinzu. Trennen Sie jede Bibliothek mit einem ;und vergessen Sie die Dateierweiterung nicht. So können Sie dies beispielsweise am Ende der Liste hinzufügen : BulletDynamics.lib;BulletCollision.lib;LinearMath.lib.

Danach sollten Sie in der Lage sein, Ihr Projekt zu erstellen und auszuführen.

David Gouveia
quelle
Ich erschrecke, bevor ich frage, aber ... wie mache ich die sehr grundlegenden Dinge, wie einfach die richtigen Dateien in mein Spiel aufzunehmen? Wenn Sie Einzelheiten benötigen, suche ich nach Dateien, die sich mit Starrkörperkollisionen befassen. Vielen Dank auch für die bisherige Hilfe!
SirYakalot
@AsherEinhorn Überprüfen Sie meine Bearbeitung.
David Gouveia
@AsherEinhorn Kein Problem, das hat mich auch gestolpert, als ich vor ein paar Jahren zum ersten Mal mit C ++ - Bibliotheken gearbeitet habe.
David Gouveia
Ja, es ist eines dieser Dinge, die ich bisher nur vermieden habe. Der gesamte Code in meinen Spielen gehört mir, aber der Versuch, meine eigene Physik-Engine zu schreiben, ist nur Zeitverschwendung, wenn andere Leute sie besser gemacht haben als ich wahrscheinlich jemals.
SirYakalot
@AsherEinhorn Ja, schreiben Sie nicht Ihre eigene Physik-Engine, auch wenn das Spiel einfach erscheint . Das erste Mal, dass ich eine Physik-Engine verwendete, war, nachdem ich versucht hatte, sie selbst in einem einfachen 2D-Spiel zu implementieren. Ich habe die OBB-OBB-Kollisionserkennung mithilfe des Trennachsensatzes implementiert, aber als ich den Punkt erreichte, an dem ich eine Kollisionsreaktion benötigte, war ich völlig festgefahren. Dann dachte ich mir, ich könnte genauso gut eine Physik-Engine ausprobieren (insbesondere habe ich Box2D verwendet) und in weniger als einer Stunde hatte ich alles zum Laufen gebracht.
David Gouveia