Então, eu estou fazendo um jogo do tipo artilharia, parecido com o Worms, com todo o material usual, como terrenos destrutíveis, etc ... e enquanto eu poderia usar a colisão por pixel que não me dá normais de colisão ou algo assim. Converter tudo isso em uma malha também significaria que eu poderia usar uma biblioteca de física existente, o que seria melhor do que qualquer coisa que eu possa fazer sozinha.
Já vi pessoas mencionando isso usando Marching Squares para obter contornos no bitmap, mas não consigo encontrar nada que mencione como transformá-los em uma malha (a menos que se refira a uma malha 3D com linhas de contorno que definem diferentes alturas, que NÃO é o que eu quero). No momento, posso obter um contorno básico dos Marching Squares que se parece com isso (onde as linhas semelhantes à grade no fundo seriam as 'células' dos Marching Squares):
Isso precisa ser interpolado para obter um resultado mais suave e preciso, mas essa é a ideia geral. Eu tinha algumas idéias de como transformar isso em uma malha, mas muitas delas não funcionavam em certos casos, e a que eu pensei que funcionaria perfeitamente acabou sendo muito lenta e eu nem terminei ainda! Idealmente, gostaria que o que eu acabasse usando fosse rápido o suficiente para fazer todos os quadros em casos como armas de disparo rápido ou ferramentas de escavação.
Estou pensando que deve haver algum tipo de algoritmo / técnica existente para transformar algo assim em uma malha, mas não consigo encontrar nada. Eu olhei para algumas coisas como a triangulação de Delaunay, mas até onde eu sei, isso não vai lidar corretamente com formas côncavas, como no exemplo acima, e também não é responsável por buracos no terreno.
Vou seguir a técnica que criei para comparação e acho que vou ver se alguém tem uma ideia melhor. Antes de tudo, interpole as linhas de contorno dos Marching Squares, criando vértices a partir das extremidades da linha e obtendo vértices onde as linhas cruzam as bordas das células (Importante). Em seguida, para cada célula contendo vértices, crie polígonos usando 2 vértices e um canto da célula como o terceiro vértice (provavelmente o canto mais próximo).
Faça isso para cada célula e acho que você deve ter uma malha que represente com precisão o bitmap original (embora haja apenas polígonos nas bordas do bitmap, e grandes áreas preenchidas no meio estarão vazias). O único problema é que isso envolve cortar todos os pixels uma vez para os Marching Squares iniciais e percorrer todas as células (altura da imagem + 1 x largura da imagem + 1) pelo menos duas vezes, o que acaba sendo muito lento para qualquer tamanho decente imagem...