Eu sou bastante novo em programação em um mundo 3D.
Estou tentando criar uma tela em que todos os objetos são desenhados na ordem do mais longe ao mais próximo e de baixo para cima - para que não se sobreponham, mas há problemas.
Como você pode ver, alguns dos objetos se sobrepõem. Nenhum dos objetos na tela estará se movendo, então eu queria saber: existe um algoritmo disponível para classificar os objetos na ordem correta? No momento, eu os ordeno no eixo Z ascendente, depois X desce e Y desce.
Respostas:
Como o @dreta mencionado nos comentários, a maneira típica de os mecanismos 3D resolverem isso é com um buffer de profundidade e usando o teste de profundidade do hardware, que permite desenhar objetos de forma arbitrária em qualquer ordem e acompanhar a superfície mais próxima de cada pixel . A classificação manual de objetos também é possível, mas não necessariamente manipula objetos não-convexos ou sobrepostos corretamente.
No entanto, se você quiser classificar objetos, será necessário calcular um valor de profundidade para cada objeto e classificar por profundidade descendente. Para obter profundidade, se você estiver usando uma configuração típica de mecanismo 3D, será necessário transformar o ponto central de cada objeto através da sua matriz de vistas (que vai do espaço do mundo para o espaço da vista), e então tomar o negativo da coordenada Z de o resultado. (Negativo porque nas coordenadas destras com X e Y alinhados com a tela, Z estará apontando para fora da tela.)
Se for sempre uma vista isométrica como essa, você provavelmente poderá calcular a profundidade = ± X ± Y - Z, onde o ± significa: escolha o sinal que aumenta a profundidade à medida que você se afasta da câmera. Isso dependerá da orientação dos seus eixos X e Y.
fonte
Confira o algoritmo do pintor e suas desvantagens.
fonte
Em geral, a resposta para sua pergunta ('existe um algoritmo disponível para classificar os objetos na ordem correta?') Em configurações arbitrárias em 3D não existe - nenhum algoritmo pode existir, mesmo quando os objetos são tão simples quanto triângulos. É fácil construir três triângulos com uma sobreposição cíclica; por exemplo, imagine olhar para o eixo Z em três triângulos longos e finos:
Então, onde A e B se sobrepõem na tela (próximo ao ponto XY (0,0)), B estará no topo (tem o valor Z mais alto): seu valor Z será aproximadamente 0,66 enquanto A será aproximadamente 0,33. Da mesma forma, onde A e C se sobrepõem (próximo ao ponto XY (1, 1)), A estará no topo; e onde B e C se sobrepõem (próximo ao ponto XY (1, -1)), C estará no topo. Não há como ordenar esses três triângulos, de modo que desenhá-los na tela na ordem especificada dará o resultado correto.
Como sugere Nathan Reed, o fato de você estar em uma visão isométrica significa que provavelmente seria capaz de evitar esse problema em particular; a questão é se vale a pena evitar ou não, e isso depende mais do seu ambiente e da funcionalidade específica que você tem disponível. A maioria das plataformas em que você pode estar desenvolvendo tem pelo menos alguma forma de renderização em 3D prontamente disponível, e minha primeira inclinação seria apenas pegar carona nessa tarefa para seus propósitos.
fonte