1: Não consigo entender em que ponto do pipeline do Chunked LOD a malha é dividida em pedaços. Isso ocorre durante a geração inicial da malha ou existe um algoritmo separado que faz isso.
Isso não importa. Por exemplo, você pode integrar o chunking ao seu algoritmo de geração de malha. Você pode fazer isso dinamicamente, de forma que níveis mais baixos sejam adicionados dinamicamente (por exemplo, à medida que o jogador se aproxima) usando um algoritmo de refinamento semelhante ao plasma. Você também pode gerar uma malha de alta resolução a partir dos dados de entrada do artista ou de medição de elevação e agregá-la a todos os blocos LOD no momento da finalização do ativo. Ou você pode misturar e combinar. Realmente depende da sua aplicação.
2: Entendo que uma estrutura de dados Quadtree é usada para armazenar os dados do Chunked LOD, acho que estou perdendo um pouco, mas o quadtree está armazenando dados de vértices e triângulos para cada nível de subdivisão?
Não necessariamente. A árvore apenas armazena informações sobre a geometria e como renderizá-la. Isso pode significar ter uma lista de vértices / faces em cada nó da árvore. Mais realista atualmente, você armazenaria os identificadores das malhas / instâncias na memória da GPU.
3a: Como é geralmente calculada a distância da câmera. Ao ler sobre as quadtree, as caixas delimitadoras alinhadas ao eixo são muito mencionadas. Nesse caso, cada pedaço teria uma caixa delimitadora de colisão para detectar que a câmera ou o player está próximo? ou existe uma maneira melhor de fazer isso? (raycast talvez?)
Uma opção muito barata e fácil é usar a distância até o ponto central do bloco e corrigi-lo. Você sabe que essa distância é sempre uma subestimação: se o ponto central estiver à distânciaZ
, isso significa que metade do pedaço está mais perto do que isso. O que não sabemos, porém, é a orientação. Se estivermos vendo um pedaço de largura de w
ponta a ponta, o pedaço mais próximo do pedaço estará à distância Z-w
. No entanto, se estivermos vendo o pedaço de canto primeiro, o bit mais próximo estará à distância Z-sqrt(2)*w
. Se você pode conviver com essa incerteza (quase sempre pode), está feito. Observe que você também pode corrigir o ângulo de visão usando a trigonometria básica.
Prefiro calcular a distância mínima absoluta da câmera ao pedaço para minimizar os artefatos. Na prática, isso significa fazer um teste de distância ponto-quadrado . É um pouco mais trabalhoso do que calcular distâncias para os pontos centrais, mas não é como se você fizesse um zilhão desses em todos os quadros.
Se você pode alavancar seu mecanismo de física para fazer isso, faça-o de qualquer maneira, mas realmente deseja pensar mais em termos de "consulta à distância" do que em "colisão".
3b: Os pedaços calculam a distância da câmera eles mesmos?
Realmente depende do design do seu motor. Eu recomendaria manter as folhas relativamente leves. Dependendo da sua plataforma, apenas a sobrecarga de alguns milhares de trechos de terreno executam sua própria atualização, cada quadro pode afetar seriamente o desempenho.
4: Cada pedaço tem a mesma "resolução". por exemplo, no nível superior, a malha terá 32x32, cada nó subdividido também terá 32x32.
Eles não precisam, mas é conveniente se todos os pedaços ocuparem a mesma quantidade de espaço. Em seguida, você pode fazer o gerenciamento de memória (GPU) em unidades de "chunks". Também é mais fácil remover / ocultar as costuras entre dois pedaços de tamanhos diferentes, se uma resolução é múltipla da outra, porque eles compartilham mais vértices. (por exemplo: 32x32 e 64x64 é mais fácil de gerenciar do que 32x32 e 57x57) (obrigado Guiber!). Se você tiver um bom motivo para variar o tamanho da geometria do bloco, faça o que for necessário.