Physique de la secousse
Une bibliothèque rigide et de détection de collision rigides multi-noyaux. Convient pour les jeux et les applications VR. Utilisé par Horizon Forbidden West.
|
|---|
| Une vidéo YouTube montrant une pile de ragdoll simulée avec de la physique de secousse. |
Pour plus de démos et de vidéos, accédez à la section des échantillons.
Considérations de conception
Pourquoi créer un autre moteur physique? Tout d'abord, ce fut un projet d'apprentissage personnel. Deuxièmement, je voulais résoudre certains problèmes que j'avais avec les moteurs de physique existants:
- Les jeux font plus que simulant la physique. Ces choses se produisent sur plusieurs fils. Nous soulignons sur l'accès simultanément sur les données physiques en dehors de la mise à jour de la simulation principale:
- Les sections de la simulation peuvent être chargées / déchargées en arrière-plan. Nous préparons un lot de corps de physique sur un fil d'arrière-plan sans verrouillage ni affectant la simulation. Nous insérons le lot dans la simulation avec un impact minimal sur les performances.
- Les requêtes de collision peuvent fonctionner parallèles à l'ajout / supprimer ou à mettre à jour un corps. Si un changement dans un corps s'est produit sur le même fil, le changement sera immédiatement visible. Si le changement se produisait sur un autre fil, la requête verra un état cohérent avant ou après. Une alternative serait d'avoir une version de lecture et d'écriture du monde. Cela empêche les changements d'être visibles immédiatement, nous évitons donc cela.
- Les requêtes de collision peuvent fonctionner parallèles à la simulation de physique principale. Nous effectuons une vérification grossière (requête en phase large) avant l'étape de simulation et effectuons de belles vérifications (requête en phase étroite) en arrière-plan. De cette façon, les processus de longue durée (comme la génération de maillage de navigation) peuvent être répartis sur plusieurs images.
- Le réveil accidentel des corps provoque des problèmes de performances lors du chargement / déchargement du contenu. Par conséquent, les corps ne se réveilleront pas automatiquement lors de la création. Les corps voisins ne seront pas réveillés lorsque les corps seront retirés. Cela peut être déclenché manuellement si vous le souhaitez.
- La simulation fonctionne de manière déterministe. Vous pouvez reproduire une simulation à un client distant en reproduisant simplement les entrées à la simulation. Lisez la section de simulation déterministe pour comprendre les limites.
- Nous essayons de simuler le comportement des corps rigides dans le monde réel mais de faire des approximations. Par conséquent, cette bibliothèque doit être principalement utilisée pour les jeux ou les simulations VR.
Caractéristiques
- Simulation de corps rigides de différentes formes en utilisant la détection de collision continue:
- Sphère
- Boîte
- Capsule
- Capitule effilée
- Cylindre
- Cylindre effilé
- Coque convexe
- Avion
- Composé
- Mesh (triangle)
- Terrain (champ de hauteur)
- Simulation des contraintes entre les corps:
- Fixé
- Indiquer
- Distance (y compris les ressorts)
- Charnière
- Curseur (également appelé prismatique)
- Cône
- Crémaillère
- Engrenage
- Poulie
- Chemins de spline lisses
- Twist swing (pour les épaules humanoïdes)
- 6 Dof
- Moteurs pour conduire les contraintes.
- Détection de collision:
- Rayons de coulée.
- Test de formes vs formes.
- Casser une forme par rapport à une autre forme.
- Broadphase uniquement les tests pour déterminer rapidement quels objets peuvent se croiser.
- Capteurs (volumes de déclenchement).
- Ragdolls animés:
- Keying dur (cinématique uniquement des corps rigides).
- Keying doux (réglage des vitesses sur des corps rigides dynamiques).
- Conduire des moteurs de contrainte à une pose animée.
- Mappage d'un squelette (animation) de détail sur un squelette bas (ragdoll) et vice versa.
- Simulation de personnages de jeu (capsule)
- Caractère du corps rigide. Se déplace pendant la simulation physique. Option la moins chère et réponse de collision la plus précise entre le caractère et les corps dynamiques.
- Caractère virtuel. N'a pas de corps rigide dans la simulation mais simule un à l'aide de vérifications de collision. Mis à jour en dehors de la mise à jour de la physique pour plus de contrôle. Interaction moins précise avec les corps dynamiques.
- Véhicules
- Véhicules à roues.
- Véhicules voiés.
- Motos.
- Simulation du corps doux (par exemple une boule douce ou un morceau de tissu).
- Contraintes de bord.
- Contraintes de pliage dièdre.
- Contraintes de volume de tétraèdre.
- Contraintes d'attachement à longue portée (également appelées lèvres).
- Limiter la simulation pour rester dans une certaine plage d'un sommet en peau.
- Pression interne.
- Collision avec corps rigides simulés.
- Tests de collision contre les corps mous.
- Calculs de flottabilité de l'eau.
- Un mode double précision en option qui permet de grands mondes.
Plates-formes prises en charge
- Windows (bureau ou UWP) x86 / x64 / arm32 / arm64
- Linux (testé sur Ubuntu) x64 / ARM64
- FreeBSD
- Android x86 / x64 / ARM32 / ARM64
- Plateforme Blue (une console de jeu populaire) x64
- macOS x64 / arm64
- iOS X64 / ARM64
- MSYS2 Mingw64
- WebAssembly, voir ce projet séparé.
Caractéristiques du processeur requises
- Sur x86 / x64, les exigences minimales sont SSE2. La bibliothèque peut être compilée à l'aide de SSE4.1, SSE4.2, AVX, AVX2 ou AVX512.
- Sur ARM64, la bibliothèque utilise Neon et FP16. Sur ARM32, il peut être compilé sans aucune instruction spéciale du CPU.
Documentation
Pour en savoir plus sur Jolt, rendez-vous dans la dernière documentation de l'architecture et de l'API. La documentation pour une version spécifique est également disponible.
Pour commencer, regardez l'exemple Helloworld. Un exemple de Helloworld utilisant CMake FetchContent est également disponible pour montrer comment vous pouvez intégrer Jolt Physics dans un projet CMake.
Certains algorithmes utilisés par Jolt sont décrits en détail dans mon GDC 2022 Talk: Architecting Jolt Physics pour «Horizon Forbidden West» (diapositives, diapositives avec notes de haut-parleur, vidéo).
Compilation
- Compiles avec Visual Studio 2019+, Clang 10+ ou GCC 9+.
- Utilise C ++ 17.
- Cela ne dépend que de la bibliothèque de modèles standard.
- N'utilise pas RTTI.
- N'utilise pas d'exceptions.
Si vous souhaitez fonctionner sur Platform Blue, vous devrez fournir votre propre environnement de construction et votre plateforme Blue.h en raison des exigences NDA. Ce fichier est disponible sur le Forum de développeur Blue Platform.
Pour les instructions de construction, accédez à la section Build. Lors de la mise à niveau d'une ancienne version de la bibliothèque, accédez aux sections de modification des notes de version ou d'API.
Performance
Si vous êtes intéressé par la façon dont Jolt évolue avec plusieurs CPU et se compare à d'autres moteurs de physique, jetez un œil à ce document.
Structure de dossier
- Assets - Ce dossier contient des actifs utilisés par le TestFramework, les échantillons et JoltViewer.
- Build - contient tout ce qui est nécessaire pour construire la bibliothèque, voir la section Build.
- Docs - contient une documentation pour la bibliothèque.
- Helloworld - Une application simple démontrant comment utiliser la bibliothèque de physique Jolt.
- Jolt - Tout le code source de la bibliothèque est dans ce dossier.
- JoltViewer - Il est possible d'enregistrer la sortie du moteur physique à l'aide de la classe DebUgRendeRerCorder (un fichier .jor), ce dossier contient le code source d'une application qui peut visualiser un enregistrement. Ceci est utile pour visualiser la sortie de Performancest à partir de différentes plates-formes. Actuellement disponible sur Windows uniquement.
- PerformanceTest - contient une application simple qui exécute un test de performance et collecte des informations de synchronisation.
- Échantillons - Ceci contient l'exemple d'application, voir la section des échantillons. Actuellement disponible sur Windows uniquement.
- TestFramework - un cadre de rendu pour visualiser les résultats du moteur physique. Utilisé par les échantillons et JoltViewer. Actuellement disponible sur Windows uniquement.
- Unittests - un ensemble de tests unitaires pour valider le comportement du moteur physique.
- WebIncludes - Un certain nombre de ressources JavaScript utilisées par le cadre de profilage interne du moteur physique.
Reliures pour d'autres langues
- C ici et ici
- C #
- Java
- Javascrip
- Zigou
Intégrations dans d'autres moteurs
Voir une liste de projets qui utilisent la physique de Jolt ici.
Licence
Le projet est distribué sous la licence du MIT.
Contributions
Toutes les contributions sont les bienvenues! Si vous avez l'intention d'apporter des modifications plus importantes, veuillez d'abord discuter de la section Discussion GitHub. Pour les modifications non triviales, nous exigeons que vous acceptiez un accord de contributeur. Lorsque vous créez un PR, l'assistant CLA vous invite à le signer.