Estou tentando implementar o teorema do eixo separador em C #. Eu tenho uma função que pode calcular o vetor de conversão mínimo entre dois polígonos. No entanto, não consigo criar uma função que calcule o vetor mínimo de conversão entre um polígono e vários outros polígonos. Sinceramente, estou trabalhando nisso há meses e não estou mais perto de uma solução e não consegui encontrar uma solução online. Sempre há alguns casos extremos que não retornam o resultado correto, levando a erros de alta prioridade no meu jogo.
Aqui estão casos comuns de borda que não funcionam corretamente:
Existe uma solução conhecida para esse problema? Tudo o que posso encontrar são pessoas dizendo "apenas execute o SAT em cada polígono", mas isso raramente produz o vetor mínimo de tradução.
Qualquer ajuda seria muito apreciada.
fonte
Respostas:
Idealmente, você não cria seu ambiente com polígonos. Você o constrói a partir de arestas (que talvez você calcule a partir de um conjunto de polígonos). No seu primeiro exemplo, por exemplo, há uma única borda diagonal; no último exemplo, a caixa está apoiada em uma única aresta horizontal.
O fato de seu editor ou ferramentas usarem formas individuais menores para criar um nível não deve afetar o tempo de execução.
Uma abordagem um pouco mais simples simplesmente removeria as bordas "internas" das formas básicas. Para o seu último exemplo, existem duas arestas entre as caixas "floor"; ignore-os durante a detecção de colisão.
Você pode encontrar algumas fotos melhores e algumas idéias de implementação lendo a seção 4.5 (arestas e cadeias de arestas) na documentação do Box2D .
fonte