Ce livre est un guide complet des jeux d'algèbre linéaire et de détection de collision couramment utilisés, mais n'aborde que brièvement le sujet de la résolution des collisions (physique). Le livre est structuré comme suit :
Tous les sujets abordés dans ce livre sont utilisés pour construire progressivement un moteur physique de corps rigide. Les trois derniers chapitres (14, 15 et 16) mettent en œuvre la physique des particules, la physique des corps rigides et la physique des corps mous (tissu). Une annexe est fournie qui couvre brièvement les sujets avancés, les ressources pour explorer ces sujets ainsi que des ressources supplémentaires pour explorer la physique du jeu.
Certaines des figures créées pour le livre ne se sont pas bien traduites à l’impression. Pour résoudre ce problème, j'ai inclus toutes les figures du livre dans ce référentiel et publié les figures en ligne sur : https://github.com/gamephysicscookbook/Figures
Les trois premiers chapitres du livre sont consacrés à l'enseignement de l'algèbre linéaire de base nécessaire au développement de jeux. Chaque concept est expliqué dans un contexte mathématique, le code source est fourni pour chaque concept et des images sont également fournies lorsque quelque chose peut être exploré visuellement. Au cours des trois premiers chapitres, les structures de données suivantes sont créées :
vec2
)vec3
)mat2
)mat3
)mat4
)Lorsque cela est possible, les opérations matricielles sont implémentées de manière générique. Par exemple, un code est fourni pour multiplier ensemble deux matrices de tailles arbitraires.
Les intersections suivantes sont couvertes dans le livre :
Indiquer | Doubler | Rayon | Sphère | AABB | OBB | Avion | Triangle | Frustum | |
---|---|---|---|---|---|---|---|---|---|
Indiquer | |||||||||
Doubler | |||||||||
Rayon | |||||||||
Sphère | |||||||||
AABB | |||||||||
OBB | |||||||||
Avion | |||||||||
Triangle | |||||||||
Frustum |
Le chapitre 14 couvre la physique naïve des particules, ce chapitre se veut une introduction à la mise en place d'une boucle physique et à la prise en compte du format général d'une boucle physique. Le chapitre 15 est le chapitre le plus intéressant, il implémente un moteur physique de base des corps rigides. Le moteur de base prend en charge les boîtes et les sphères orientées, l'empilement peut fonctionner mais n'est pas directement pris en charge. Le chapitre 16 couvre les ressorts et comment les ressorts peuvent être utilisés pour mettre en œuvre la physique des corps mous. La démo finale du livre est une démonstration de la physique des corps mous et des tissus.
Comme c'est mon premier livre, j'ai beaucoup appris sur le processus d'écriture ; peut-être encore plus sur la planification. Voici une liste de choses que j'ai découvertes en écrivant ce livre et que je n'avais pas planifiées correctement :
Quaternions : Avoir un quaternion est indispensable ! J'avais prévu d'écrire le livre en utilisant les rotations d'Euler et les matrices de rotation. Même si cela fonctionnait, avoir accès aux quaternions aurait rendu la vie beaucoup plus facile.
Plans : les intersections de plans ne doivent pas renvoyer de valeur booléenne, elles doivent classer l'intersection comme : derrière, se croisant, devant. De préférence, si l'intersection est devant ou derrière, vous souhaitez renvoyer une indication de distance. Cela devient très utile lors de l'élimination de Frustum. Je ne savais pas à quel point j'allais écrire sur les frustums, alors j'ai décidé de faire une simple intersection booléenne.
Raycasting : j'aurais dû écrire des raycasts pour renvoyer un résultat raycast depuis le début. Devoir plus tard revenir en arrière et réécrire l'API raycasting s'est avéré plus compliqué à exprimer sous forme de texte que prévu. L’idée derrière cela était de garder les choses simples au début, de les compliquer seulement si nécessaire.
Il existe divers problèmes dans l’implémentation physique du code source. Ces problèmes viennent du fait que la partie physique de ce livre a dû être condensée en trois chapitres. Il n’y avait tout simplement pas assez de temps pour couvrir tout ce qui était nécessaire à la création d’un système robuste de physique des corps rigides. Le plus gros problème avec le moteur est le fait qu'il n'y a pas d'Arbiter .
Sans arbitre, nous ne pouvons pas construire un solveur d'impulsions séquentielles. Cela nous laisse avec un solveur d’impulsions plutôt simple et naïf. Le problème est que les impulsions sont résolues par contact et par image. Cela provoque un glissement excessif. J'ai compensé le manque d'impulsion séquentielle avec une projection linéaire et une polarisation agressive par friciton. Les moteurs physiques plus anciens font quelque chose de similaire, en s'appuyant sur un sommeil fort pour masquer le problème. Inutile de dire que dormir n’a pas été mis en œuvre.
Si j'ai la chance d'écrire une deuxième édition de ce livre, je supprimerai les chapitres sur les collisions bidimensionnelles (chapitres 4, 5 et 6) et réduirai le nombre de pages des chapitres sur la gestion des scènes. Je prévois d'utiliser les pages supplémentaires pour couvrir les sujets suivants :