No meu projeto, estou criando um sistema para deformar uma malha altamente detalhada (vestuário) para que ela "se encaixe" em uma malha convexa. Para fazer isso, uso mapas de profundidade do item e do 'casco' para determinar em que ponto do espaço mundial o desvio ocorre e a extensão.
A simples transformação de todos os vértices ocluídos nas profundidades definidas pelo 'casco' é bastante eficaz e tem um bom desempenho, mas sofre o problema de não preservar os recursos da malha e requer seleção extensiva para evitar falsos positivos.
Em vez disso, gostaria de gerar a partir do mapa de desvio de profundidade um conjunto de 'deformadores' simples que 'empurrarão' * todos os vértices da malha deformada para fora (no espaço do mundo). Dessa forma, todos os recursos da malha são preservados e não há necessidade de heurísticas complexas para selecionar vértices inadequados.
No entanto, não sei como gerar esse conjunto de deformadores. Estou imaginando algo como um algoritmo que tenta corresponder uma superfície esférica a cada pedaço de desvios contíguos dentro de um determinado intervalo, mas não sei por onde começar a fazer isso.
Alguém pode sugerir um filtro ou algoritmo adequado para gerar deformadores? Ou, de outra forma, 'compactando' um mapa de profundidade?
(* Empurre porque é adequado para um humanóide convexo 'bulgy' para que as transformações sejam 'esféricas' do ponto de vista da superfície.)
Edit: Aqui está uma imagem / diagrama corretamente sugerido que ilustra o que estou tentando alcançar.
Além disso, devo dizer que, desde que essa pergunta foi publicada, trabalhei muito mais nesse problema e, embora nunca tenha resolvido como obter os deformadores, acabei decidindo que os mapas de profundidade para isso eram inadequados, como:
- Se a malha deformada não está completa, é possível obter texels no mapa que estão significou para estar no outro lado do convexo mesh (porque eles não são obscurecidos por aqueles mais perto da câmera no lado correto).
- A eficiência não foi tão alta quanto eu esperava, devido ao fato de 6 mapas serem necessários por deformação.
Não que eles fossem insolúveis, mas a outra solução, que envolveu testes de colisão em kernels em execução na GPU, resultou em resultados de maior qualidade e foi muito mais simples, mesmo que não seja tão rápido.
Ainda acho que esse problema de perguntas é interessante e estaria interessado em qualquer resposta, pois tenho certeza de que há situações em que isso seria preferido.
Respostas:
Você tem um mapa de profundidade, que eu assumo é simplesmente a distância entre a malha convexa A e a malha deformada neutra B, e você tem normais de superfície da malha A.
O que você está perdendo são os pesos (ou agrupamentos) de como cada vert na malha B afeta seus vizinhos. Por exemplo, quando a vert central é movida, ela também deve arrastar ao longo dos verts vizinhos em alguma quantidade (porcentagem) se eles estiverem no mesmo grupo.
Se um grupo de verts se afeta 100%, todos acabam sendo empurrados pela maior distância do seu mapa de profundidade, como se fossem todos parte de uma estrutura de aço flexível que se move como uma unidade, fixada em 50% dessa estrutura pode agir mais como folhas grossas de borracha e 10% como filme plástico apropriado para cada forma, porque cada vert quase não afeta seu vizinho (que é o que você tem agora.
Obviamente, há alguma mistura e fusão de valores acontecendo. Como o Gajoo disse, "o que há de errado em mudar toda a forma?"
fonte