Como obter resultados precisos com o algoritmo do Painter?

14

Há um tempo atrás, perguntei como determinar quando um rosto se sobrepõe a outro. O conselho era usar um buffer Z.

No entanto, não posso usar um buffer Z no meu projeto atual e, portanto, gostaria de usar o algoritmo do Painter. Não tenho nenhuma boa idéia de quando uma superfície está atrás ou na frente de outra. Eu tentei vários métodos, mas todos falham em casos extremos, ou mesmo em casos gerais.

Esta é uma lista dos métodos de classificação que eu tentei até agora:

  • Distância ao ponto médio de cada face
  • Distância média a cada vértice de cada face
  • Valor médio de z de cada vértice
  • O valor z mais alto dos vértices de cada face e desenha os primeiros
  • O valor z mais baixo dos vértices de cada face e desenha os últimos

O problema é que um rosto pode ter uma distância mais próxima, mas ainda mais distante. Todos esses métodos parecem não confiáveis.

Editar: Por exemplo, na imagem a seguir, a superfície com o ponto azul como ponto médio é pintada sobre a superfície com o ponto vermelho como ponto médio, porque o ponto azul está mais próximo. No entanto, isso ocorre porque a superfície do ponto vermelho é maior e o ponto médio está mais distante. A superfície com o ponto vermelho deve ser pintada sobre o azul, porque está mais próxima , enquanto a distância do ponto médio indica o contrário.

insira a descrição da imagem aqui

O que exatamente é usado no algoritmo do Painter para determinar a ordem em que os objetos devem ser desenhados?

pimvdb
fonte
1
O algoritmo dos pintores está apenas desenhando de trás para frente.
11137 Jonathan Connell
1
@ 3nixios: Sim, obviamente, mas de que maneira posso determinar a ordem de 'voltar para a frente'?
Pimvdb
1
Todos os seus objetos, triângulos ou vértices estarão a uma certa distância da câmera quando você começar a desenhar. A implementação do algoritmo básico (você conseguiu?) Seria determinar essa distância da câmera para cada triângulo e desenhá-los na ordem mais distante e mais próxima. Feito isso, você precisa começar a procurar interseções e cortar seus triângulos, que é um jogo totalmente diferente . Por que você não pode usar o Z-Buffer? : P
Jonathan Connell
@ 3nixios: Você está completamente correto, mas o problema que estou enfrentando é calcular a distância. Como afirmei, tentei vários métodos de distância, mas nem todos são perfeitos. Esse pedido resulta da classificação da distância do ponto médio: i.imgur.com/AcfCm.png .
Pimvdb
1
Todos os seus polígonos estão em uma grade regular assim? Nesse caso, pode haver coisas específicas da grade que você pode fazer para melhorar isso.
CiscoIPPhone

Respostas:

14

Geralmente, a distância do ponto médio de um polígono à câmera está sendo usada para a ordenação z. O algoritmo do pintor não pode ser 100% exato por natureza. Sempre haverá casos em que a classificação falhará, independentemente do ponto de referência que você usar.

Se você deseja uma ordenação z correta com o algoritmo do pintor, terá que dividir polígonos sobrepostos em partes menores (por exemplo, usando um quad-tree) e classificar essas partes individualmente. Isso pode se tornar bastante pesado na CPU ..

Encontrei este arquivo do Powerpoint que ilustra bem o problema ( versão em PDF ).

bummzack
fonte
Obrigado por esse Powerpoint, ele me ajudou a resolver o problema.
Pimvdb
O link está quebrado. Alguém pode encontrar uma cópia?
Keavon
1
@Keavon Editado. Encontrei um link de trabalho para o arquivo.
bummzack
1

Nesses casos, para mim, sempre funcionava usando bsp-trees. Divida a cena até ter um conjunto convexo de polígonos no nó da árvore bsp e, em seguida, você pode classificar polígonos facilmente nos nós. Observe que, ao classificar polígonos no nó da árvore bsp, parece o mesmo problema que você descreveu acima, mas há uma condição não tão óbvia - depois de construir a árvore bsp, todos os casos problemáticos já estão resolvidos - no nó, você deve terminar de acordo com o conjunto de polígonos dos quais o teste de convexidade deve passar - se você escolher um plano de um polígono desse conjunto, o restante dos polígonos estará todos na frente ou atrás do avião. O uso dessas informações facilita a classificação - o functor de classificação ocupa 2 polígonos - verifique em que meio espaço é o 1º polígono contra o 2º polígono e também verifique o posicionamento da câmera no segundo polígono.

Observe também que os testes para determinar o lado do posicionamento da câmera contra polígonos e o deslocamento da árvore bsp são ligeiramente diferentes ao lidar com projeção ortográfica e de perspectiva.

Se você não pode se permitir dividir os polígonos de entrada, acho que está sem sorte.

bispado
fonte