web-dev-qa-db-fra.com

Comment fonctionne la détection de collision / objet 3D?

Je me suis toujours demandé cela. Dans un jeu comme GTA où il y a des dizaines de milliers d'objets, comment le jeu sait-il dès que vous êtes sur un pack de santé?

Il ne peut pas y avoir d'écouteur d'événement pour chaque objet? Itérer n'est pas bon non plus? Je me demande simplement comment cela se fait.

54
jmasterx

Il n'y a pas de réponse unique à cela, mais les grands mondes sont souvent partitionnés en utilisant quelque chose le long d'un quadtree ou kd-tree qui apporte des temps de recherche pour trouver les voisins les plus proches ci-dessous temps linéaire (puissance fractionnaire, ou au pire O (N ^ (2/3)) pour un jeu 3D). Ces méthodes sont souvent appelées [~ # ~] bsp [~ # ~] pour le partitionnement de l'espace binaire.

En ce qui concerne la détection des collisions, chaque objet a également généralement volume limite mesh (ensemble de polygones formant une coque convexe) qui lui est associé. Ces maillages très simplifiés (parfois juste un cube) ne sont pas dessinés mais sont utilisés dans la détection des collisions. La méthode la plus rudimentaire est de créer un plan perpendiculaire à la ligne reliant les points médians de chaque objet avec le plan coupant la ligne au point médian de la ligne. Si le volume englobant d'un objet a des points des deux côtés de ce plan, il s'agit d'une collision (il vous suffit de tester l'un des deux volumes englobants contre le plan). Une autre méthode est l'algorithme amélioré GJK distance. Si vous voulez un didacticiel à parcourir, consultez Leçon OpenGL de NeHe Productions # .

Incidemment, les volumes de délimitation peuvent également être utilisés pour d'autres optimisations telles que ce que l'on appelle les requêtes d'occlusion . Il s'agit d'un processus permettant de déterminer quels objets se trouvent derrière d'autres objets (occluders) et n'ont donc pas besoin d'être traités/rendus. Les volumes limites peuvent également être utilisés pour l'abattage de troncs qui est le processus de détermination des objets qui sont en dehors du volume de visualisation en perspective (trop près, trop loin ou au-delà de votre angle de champ de vision) et n'ont donc pas besoin d'être rendus.


Comme l'a noté Kylotan, l'utilisation d'un volume englobant peut générer des faux positifs lors de la détection de l'occlusion et ne fonctionne tout simplement pas du tout pour certains types d'objets tels que les tores (par exemple en regardant à travers le trou dans un beignet). Avoir des objets comme ceux-ci s'occluent correctement est un tout autre thread sur élimination de portail .

59
charstar

Quadtrees et Octrees , n autre quadtree , sont des moyens populaires, en utilisant le partitionnement d'espace, pour y parvenir. Le dernier exemple montre une réduction de 97% du traitement par rapport à une recherche de collision par force brute paire par paire.

9
joshperry

Une technique courante dans les moteurs de physique des jeux est la méthode de balayage et d'élagage. Ceci est expliqué dans notes SIGGRAPH de David Baraff (voir le chapitre Motion with Constraints). Havok utilise certainement cela, je pense que c'est une option dans Bullet, mais je ne suis pas sûr de PhysX.

L'idée est que vous pouvez regarder les chevauchements des AABB (boîtes de délimitation alignées sur l'axe) sur chaque axe; si la projection des AABB de deux objets se chevauche sur les trois axes, les AABB doivent se chevaucher. Vous pouvez vérifier chaque axe relativement rapidement en triant les points de début et de fin des AABB; il y a beaucoup de cohérence temporelle entre les images car généralement la plupart des objets ne se déplacent pas très rapidement, donc le tri ne change pas beaucoup.

Une fois que sweep-and-Prune détecte un chevauchement entre les AABB, vous pouvez effectuer une vérification plus détaillée des objets, par ex. sphère vs boîte. Si la vérification détaillée révèle une collision, vous pouvez alors résoudre la collision en appliquant des forces et/ou déclencher un événement de jeu ou jouer un effet sonore.

4
celion

Correct. Normalement, il n'y a pas d'écouteur d'événement pour chaque objet. Souvent, il existe une structure arborescente non binaire en mémoire qui imite la carte de vos jeux. Imaginez une carte du métro/métro. Ce strucutre de mémoire est une collection de choses dans le jeu. Vous le joueur, les monstres et les objets que vous pouvez ramasser ou les objets qui pourraient exploser et vous faire du mal. Ainsi, lorsque le joueur se déplace dans le jeu, le pointeur de l'objet joueur est déplacé dans la structure de mémoire du jeu/de la carte.

voir Comment dois-je avoir mes entités de jeu au courant des choses qui les entourent?

2
kingchris

Je voudrais recommander le livre solide de Christer Ericson sur la détection de collision en temps réel. Il présente les bases de la détection de collision tout en fournissant des références sur les efforts de recherche contemporains.

Détection de collision en temps réel (La série Morgan Kaufmann en technologie 3D interactive)

1
wojakzek

Il existe de nombreuses optimisations pouvant être utilisées. Premièrement - tout objet (par exemple avec l'index i par exemple) est délimité par un cube, avec les coordonnées centrales CXi, CYi et la taille Si Deuxièmement - la détection de collision fonctionne avec des estimations:

a) Trouver toutes les paires de cubes i, j avec la condition: Abs(CXi-CXj)<(Si+Sj) AND Abs(CYi-CYj)<(Si+Sj)

b) Maintenant, nous travaillons uniquement avec des paires entrées en a). Nous calculons plus précisément les distances entre eux, quelque chose comme Sqrt(Sqr(CXi-CXj)+Sqr(CYi-CYj)), des objets maintenant représentés comme des ensembles de quelques nombres de figures simples - cubes, sphères, cônes - et nous utilisons des formules géométriques pour vérifier ces intersections de figures.

c) Les objets de b) avec des intersections détectées sont traités comme des collisions avec le calcul physique, etc.

1
user224564