Joltphysik
Eine multi -kernfreundliche Bibliothek für starrkörperliche Physik und Kollisionserkennung. Geeignet für Spiele und VR -Anwendungen. Verwendet von Horizon Forbidden West.
|
|---|
| Ein YouTube -Video mit einem mit Jolt Physik simulierten Ragdoll -Stapel. |
Weitere Demos und Videos finden Sie in den Abschnitt mit dem Beispiel.
Konstruktionsüberlegungen
Warum noch eine Physik -Engine erstellen? Erstens war es ein persönliches Lernprojekt. Zweitens wollte ich einige Probleme angehen, die ich mit bestehenden Physikmotoren hatte:
- Spiele tun mehr als die Simulation der Physik. Diese Dinge passieren in mehreren Threads. Wir betonen den gleichzeitigen Zugriff auf Physikdaten außerhalb des Hauptsimulationsupdates:
- Abschnitte der Simulation können im Hintergrund geladen / entladen werden. Wir bereiten eine Menge Physikkörper auf einem Hintergrundfaden vor, ohne die Simulation zu sperren oder zu beeinflussen. Wir setzen die Charge mit einem minimalen Einfluss auf die Leistung in die Simulation ein.
- Kollisionsanfragen können parallel zum Hinzufügen / Entfernen oder Aktualisieren eines Körpers ausgeführt werden. Wenn eine Änderung zu einem Körper im selben Thread stattfand, ist die Änderung sofort sichtbar. Wenn die Änderung in einem anderen Thread stattgefunden hat, wird die Abfrage vor oder nach dem Zustand konsistent werden. Eine Alternative wäre, eine Lesen- und Schreibversion der Welt zu lesen. Dies verhindert, dass Änderungen sofort sichtbar werden, daher vermeiden wir dies.
- Kollisionsanfragen können parallel zur Hauptphysiksimulation ausgeführt werden. Wir führen vor dem Simulationsschritt eine grobe Überprüfung (breite Phasenabfrage) durch und führen feine Überprüfungen (schmale Phasenabfrage) im Hintergrund durch. Auf diese Weise können lang laufende Prozesse (wie die Navigationsnetzgenerierung) über mehrere Frames verteilt werden.
- Ein versehentliches Aufwachen von Körpern verursacht Leistungsprobleme beim Laden / Entladen von Inhalten. Daher wachen Körper beim Erstellen nicht automatisch auf. Nachbarkörpern werden nicht aufgeweckt, wenn die Körper entfernt werden. Dies kann bei Wunsch manuell ausgelöst werden.
- Die Simulation läuft deterministisch. Sie können eine Simulation an einen Remote -Client replizieren, indem Sie lediglich die Eingaben in die Simulation replizieren. Lesen Sie den Abschnitt Deterministischer Simulationsabschnitt, um die Grenzen zu verstehen.
- Wir versuchen, das Verhalten starrer Körper in der realen Welt zu simulieren, aber Annäherungen vornehmen. Daher sollte diese Bibliothek hauptsächlich für Spiele oder VR -Simulationen verwendet werden.
Merkmale
- Simulation starrer Körper verschiedener Formen unter Verwendung einer kontinuierlichen Kollisionserkennung:
- Kugel
- Kasten
- Kapsel
- Verjüngungskapsel
- Zylinder
- Verjüngungszylinder
- Konvexer Rumpf
- Flugzeug
- Verbindung
- Netz (Dreieck)
- Terrain (Höhenfeld)
- Simulation von Einschränkungen zwischen Körpern:
- Behoben
- Punkt
- Entfernung (einschließlich Federn)
- Scharnier
- Schieberegler (auch als prismatisch bezeichnet)
- Kegel
- Rack und Ritzel
- Gang
- Rolle
- Glatte Spline -Pfade
- Swing-Twist (für humanoide Schultern)
- 6 DOF
- Motoren, um die Einschränkungen voranzutreiben.
- Kollisionserkennung:
- Strahlen gießen.
- Testen von Formen gegen Formen.
- Eine Form gegen eine andere Form gießen.
- Broadphase -nur Tests, um schnell zu bestimmen, welche Objekte sich schneiden können.
- Sensoren (Triggervolumina).
- Animierte Ragdolls:
- Hartes Schlüssel (kinematisch nur starre Körper).
- Softkekende (Einstellung von Geschwindigkeiten auf dynamischen starren Körpern).
- Motoren mit Einschränkungen zu einer animierten Pose.
- Zuordnen eines Skeletts mit hohem Detail (Animation) auf ein kleines Detailskelett (Ragdoll) und umgekehrt.
- Spielcharaktersimulation (Kapsel)
- Starre Körpercharakter. Bewegt sich während der Physiksimulation. Günstigste Option und genaueste Kollisionsreaktion zwischen Charakter und dynamischen Körpern.
- Virtueller Charakter. Hat keinen starren Körper in der Simulation, simuliert jedoch einen mit Kollisionsüberprüfungen. Außerhalb des Physik -Updates aktualisiert, um mehr Kontrolle zu erhalten. Weniger genaue Interaktion mit dynamischen Körpern.
- Fahrzeuge
- Fahrzeuge mit Rädern.
- Verfolgte Fahrzeuge.
- Motorräder.
- Weiche Körpersimulation (z. B. eine weiche Kugel oder ein Stück Stoff).
- Kantenbeschränkungen.
- Diedral -Biegung Einschränkungen.
- Tetraeder Volumenbeschränkungen.
- Einschränkungen des Langstreckenanhangs (auch Tethers genannt).
- Begrenzung der Simulation, um innerhalb eines bestimmten Bereichs eines enthäuteten Scheitelpunkts zu bleiben.
- Innerer Druck.
- Kollision mit simulierten starren Körpern.
- Kollisionstests gegen weiche Körper.
- Wasserauftriebsberechnungen.
- Ein optionaler Doppelpräzisionsmodus, der große Welten ermöglicht.
Unterstützte Plattformen
- Windows (Desktop oder UWP) x86/x64/ARM32/ARM64
- Linux (getestet auf Ubuntu) x64/arm64
- FreeBSD
- Android x86/x64/arm32/arm64
- Plattform Blue (eine beliebte Spielekonsole) x64
- macOS x64/arm64
- iOS x64/arm64
- MSYS2 MINGW64
- WebAssembly finden Sie in diesem separaten Projekt.
Erforderliche CPU -Funktionen
- Bei x86/x64 sind die minimalen Anforderungen SSE2. Die Bibliothek kann mit SSE4.1, SSE4.2, AVX, AVX2 oder AVX512 kompiliert werden.
- Auf ARM64 verwendet die Bibliothek Neon und FP16. Auf ARM32 kann es ohne spezielle CPU -Anweisungen zusammengestellt werden.
Dokumentation
Weitere Informationen zu Jolt finden Sie in der neuesten Architektur- und API -Dokumentation. Die Dokumentation für eine bestimmte Version ist ebenfalls verfügbar.
Schauen Sie sich das HelloWorld -Beispiel an. Ein helloWorld -Beispiel mit CMake -FetchContent steht auch zur Verfügung, um zu zeigen, wie Sie die Jolt -Physik in ein CMake -Projekt integrieren können.
Einige von Jolt verwendete Algorithmen werden in meinem GDC 2022 Talk: Architektur der Jolt -Physik für "Horizon Forbidden West" (Folien, Folien mit Lautsprechernotizen, Video) ausführlich beschrieben.
Kompilieren
- Kompiliert mit Visual Studio 2019+, Clang 10+ oder GCC 9+.
- Verwendet C ++ 17.
- Hängt nur von der Standard -Vorlagenbibliothek ab.
- Verwendet RTTI nicht.
- Verwendet keine Ausnahmen.
Wenn Sie auf Plattform Blue laufen möchten, müssen Sie aufgrund der NDA -Anforderungen Ihre eigene Build -Umgebung und Plattformblue.h bereitstellen. Diese Datei ist im Plattform Blue Developer Forum verfügbar.
Für Build -Anweisungen finden Sie den Abschnitt "Build". Wenn Sie aus einer älteren Version der Bibliothek aktualisieren, wechseln Sie zu den Abschnitten zur Versionshinweise oder den API -Änderungen.
Leistung
Wenn Sie daran interessiert sind, wie sich Jolt mit mehreren CPUs skaliert und mit anderen Physikmotoren verglichen wird, sehen Sie sich dieses Dokument an.
Ordnerstruktur
- Assets - Dieser Ordner enthält Vermögenswerte, die von Testframework, Proben und JoltViewer verwendet werden.
- Build - Enthält alles, was für den Bau der Bibliothek erforderlich ist. Siehe den Abschnitt "Build".
- Dokumente - Enthält Dokumentation für die Bibliothek.
- HelloWorld - Eine einfache Anwendung, die demonstriert, wie die Jolt Physics Library verwendet wird.
- Jolt - Der gesamte Quellcode für die Bibliothek befindet sich in diesem Ordner.
- JoltViewer - Es ist möglich, die Ausgabe der Physik -Engine mithilfe der DebugrenderErrecorder -Klasse (A.JOR -Datei) aufzuzeichnen. Dieser Ordner enthält den Quellcode für eine Anwendung, mit der eine Aufzeichnung visualisieren kann. Dies ist nützlich, um die Ausgabe des Performanceest aus verschiedenen Plattformen zu visualisieren. Derzeit nur unter Windows verfügbar.
- Performancetest - Enthält eine einfache Anwendung, die einen Leistungstest ausführt und Zeitinformationen sammelt.
- Proben - Dies enthält die Probenanwendung, siehe Abschnitt mit Proben. Derzeit nur unter Windows verfügbar.
- Testframework - Ein Rendering -Framework zur Visualisierung der Ergebnisse der Physik -Engine. Verwendet von Proben und JoltViewer. Derzeit nur unter Windows verfügbar.
- Unittests - eine Reihe von Einheitentests zur Validierung des Verhaltens der Physik -Engine.
- Webincludes - Eine Reihe von JavaScript -Ressourcen, die vom internen Profiling -Framework der Physik -Engine verwendet werden.
Bindungen für andere Sprachen
- C hier und hier
- C#
- Java
- JavaScript
- Zick
Integrationen in anderen Motoren
Sehen Sie hier eine Liste von Projekten, die Jolt Physics verwenden.
Lizenz
Das Projekt wird unter der MIT -Lizenz verteilt.
Beiträge
Alle Beiträge sind willkommen! Wenn Sie beabsichtigen, größere Änderungen vorzunehmen, besprechen Sie bitte zuerst im Abschnitt GitHub Diskussion. Für nicht triviale Änderungen verlangen wir, dass Sie einer Mitwirkendenvereinbarung zustimmen. Wenn Sie eine PR erstellen, fordert Sie CLA -Assistent auf, ihn zu unterschreiben.