Algorithmes de détection de collision
Détection de collision
- En programmation de jeux vidéo, la détection de collision est un problème très courant
- Elle est indispensable pour empêcher les personnages de se traverser ou pour implémenter un moteur physique
Approche simple 🐥
Problèmes de performance
- Plus le nombre d’objets augmente, plus des problèmes de performance apparaissent
- Par exemple, quand n = 20, il faut vérifier 190 paires
Amélioration de la solution
Optimisation par tri
- Trier les objets selon leur coordonnée x permet de réduire les vérifications inutiles
- Exemple de code :
sortByLeft(balls);
for (let i = 0; i < balls.length; i++) {
const ball1 = balls[i];
for (let j = i + 1; j < balls.length; j++) {
const ball2 = balls[j];
if (ball2.left > ball1.right) break;
if (intersects(ball1, ball2)) {
bounce(ball1, ball2);
}
}
}
Analyse des performances
- Tri : O(n log n)
- Boucle interne : en moyenne O(n + m) (m est le nombre total de chevauchements sur l’axe x)
- Complexité temporelle finale : O(n log n + m)
Comparaison visuelle
- Comparaison entre la vérification globale des paires et la vérification des paires après tri
- La vérification des paires après tri effectue beaucoup moins de contrôles
Résumé de GN⁺
- Cet article explique comment optimiser les algorithmes de détection de collision dans le développement de jeux
- Il part d’un algorithme simple en O(n^2) puis améliore fortement les performances grâce au tri
- C’est une information très utile pour les développeurs de jeux ou les ingénieurs logiciel
- D’autres projets offrant des fonctionnalités similaires incluent Box2D et Bullet Physics
1 commentaires
Commentaires sur Hacker News
L’auteur suggère d’utiliser des algorithmes de tri « rapides » comme mergesort ou quicksort pour obtenir des performances optimales
J’ai déjà fait un travail similaire par le passé, mais en conservant des listes d’indices pour chaque direction au lieu d’utiliser un tri
objectIndicesSortedByLeftEdge/RightEdge/TopEdge/BottomEdgeCet article est vraiment très bien structuré
J’ai toujours aimé lire la documentation sur la détection continue de collision
L’usage des illustrations était appréciable
Partie 2 : https://leanrada.com/notes/sweep-and-prune-2/
Je m’interroge sur l’affirmation selon laquelle « cet algorithme simple s’exécute en temps O(n^2) en termes de Big O »
Je me demandais si cette méthode est similaire à l’utilisation d’un quadtree pour réduire les collisions potentielles
Je me demandais si une méthode de programmation linéaire avait déjà été proposée
Ce site m’a distrait, mais dans le bon sens du terme