LOD (nível de detalhe) significa gerenciar objetos em diferentes escalas de exibição, que podem ser divididas em duas partes. No entanto, você pode usar um deles e isso seria suficiente para a maioria dos casos.
Mostrar / ocultar camadas (grupo de objetos do mesmo tipo), dependendo da magnitude (escala de exibição).
Método baseado em Geomeria Algébrica, chamado Generalização (que é um algoritmo para simplificar polígonos). veja a figura a seguir
O método mais famoso e eficiente para generalizar (simplificar) uma malha poligonal é conhecido como teorema do poliedro de Descartes-Euler (Equação 4.5, desculpe se estou me referindo a um livro, foi o melhor que posso fazer) e é usado pela maioria dos bancos de dados espaciais por exemplo, módulos PostGIS no PostgreSQL. Ele simplesmente remove os lados menores de um polígono e o torna muito arredondado. (Foto acima)
Para implementar o LOD em um jogo, você precisa salvar e gerenciar a escala do seu mapa (cena) durante as operações de zoom in / out. A escala muda de zero para o infinito e você deve dividir isso em um número específico de intervalos, por exemplo, algo como isto:
- 1 / zero = infinito para 1/50
- 1/50 a 1/100
- 1/100 a 1/1000
- 1/1000 a 1 / infinito = 0
Então você precisa definir quais tipos de seus objetos (camadas) devem estar visíveis ou invisíveis em cada um dos intervalos acima. Por exemplo, um tipo pequeno de objeto, como uma válvula de hidrante, não deve ser visível quando o usuário estiver na quarta faixa, porque será muito pequeno nessa escala e não poderá ser discriminado, portanto, não importa se você pular desenhá-la no tela.
Portanto, quando um usuário usa mais e menos zoom para alterar a ampliação, ele se move pelos limites acima de um para o outro, e seu jogo usa essas escalas de exibição para gerenciar o nível de detalhes, mostrando ou ocultando objetos na cena. Isso cria uma solução discreta que os objetos desaparecem repentinamente durante a operação de redução de zoom, porém, com as escalas de exibição e as ampliações definidas cuidadosamente, o usuário não sentirá nada.
O grupo acima de 4 faixas é apenas um exemplo e você precisa encontrar o melhor para o seu caso por tentativa e erro. Não há regra para isso.
Às vezes, os jogos usam seus próprios métodos LOD, o Subway Surfer por instante, mostra um pequeno retângulo sem textura para mostrar um edifício ao longe e, ao aproximar-se de repente, fica com textura, o jogador sente. Você não falou sobre o seu sistema de projeção, o que é muito importante, também não falou sobre o tipo de jogo que você está criando.
No entanto, suponha que você esteja implementando um jogo 3D completo com o openGl e deseje filtrar algumas malhas antes de transferi-las para o hardware gráfico. Tenho certeza de que isso ajudará a reduzir as operações de encadernação / desatamento com objetos de buffer e arrays de vértices (VBO, VAO) enquanto lidando com o OpenGl.
Usando apenas um gerenciamento de camada ou apenas implementando a Generalização de Euler
Na maioria dos casos, não é necessário implementar um algoritmo de generalização, e a filtragem de objetos simplesmente funciona e leva você à eficiência (taxa de atualização) necessária, no entanto, depende totalmente, caso a caso. Embora seja um algoritmo fácil que apenas remova os lados pequenos de um polígono, você precisa definir um limite que é o produto da magnitude e um número constante, para que os lados maiores sejam filtrados em um ponto de vista muito mais distante.
Esquecer o gerenciamento da camada e implementar apenas o algoritmo de generalização de Eulers, fornece um método muito elegante e contínuo, no qual você apenas verifica cada lado e linha em um limite predefinido e mostra-os apenas no caso de serem grandes o suficiente para serem discriminados na tela.
PS: ampliação é um número flutuante> 0 que é igual a 1 / escala e a escala geralmente é <1, pois uma escala 1: 1 significa que você tem comprimentos do mundo real em seu jogo.