Algoritmos de detecção de colisão
Detecção de colisão
- Na programação de videogames, a detecção de colisão é um problema muito comum
- É essencial para impedir que personagens atravessem uns aos outros ou para implementar um motor de física
Abordagem simples 🐥
Problema de desempenho
- Conforme o número de objetos aumenta, surgem problemas de desempenho
- Por exemplo, quando n = 20, é preciso verificar 190 pares
Melhorando a solução
Otimização por ordenação
- Se os objetos forem ordenados pela coordenada x, é possível reduzir verificações desnecessárias
- Exemplo de código:
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);
}
}
}
Análise de desempenho
- Ordenação: O(n log n)
- Loop interno: em média O(n + m) (m é o total de sobreposições no eixo x)
- Complexidade de tempo final: O(n log n + m)
Comparação visual
- Comparação entre a verificação global de pares e a verificação de pares ordenados
- A verificação de pares ordenados realiza muito menos verificações
Resumo do GN⁺
- Este artigo trata de como otimizar algoritmos de detecção de colisão no desenvolvimento de jogos
- Começa com um algoritmo simples O(n^2) e melhora bastante o desempenho por meio da ordenação
- É uma informação muito útil para desenvolvedores de jogos e engenheiros de software
- Outros projetos com funcionalidade semelhante incluem Box2D e Bullet Physics
1 comentários
Comentários no Hacker News
O autor sugere usar algoritmos de ordenação “rápidos” como mergesort ou quicksort para obter desempenho ideal
Já fizeram algo parecido no passado, mas mantinham listas de índices para cada direção em vez de ordenar
objectIndicesSortedByLeftEdge/RightEdge/TopEdge/BottomEdgeEste texto está realmente muito bem organizado
Sempre gostei de ler documentação sobre detecção contínua de colisão
Gostei do uso de ilustrações
Parte 2: https://leanrada.com/notes/sweep-and-prune-2/
Foi levantada uma dúvida sobre a afirmação de que “esse algoritmo simples executa em tempo O(n^2) em termos de Big O”
Houve curiosidade sobre se esse método é semelhante ao uso de quadtree para reduzir colisores em potencial
Houve curiosidade sobre se já foi proposto um método de programação linear
Este site me distraiu, no bom sentido