Construindo um mundo aberto no navegador, parte 9: Transvoxel começou com uma estrutura básica
Por Oleg Sidorkin, CTO e cofundador da Cinevva
Chegou agora? Consulte o guia da série. Ele explica o que é um spike e contém links para todas as partes.
É nas junções que a confiança vai por água abaixo.
Tudo pode parecer estável até duas resoluções se encontrarem. Um chunk com LOD 0 fica ao lado de outro com LOD 1. Suas malhas são geradas de forma independente. No limite compartilhado, as posições dos vértices não coincidem porque o chunk de menor resolução tem metade da densidade da grade. O resultado são rachaduras visíveis, junções em T e bordas tremeluzentes.
O algoritmo Transvoxel resolve isso gerando células de transição especiais ao longo da face de limite entre dois chunks com resoluções diferentes. Essas células coletam amostras simultaneamente das grades de alta e baixa resolução e produzem triângulos que unem as duas superfícies. O algoritmo usa suas próprias tabelas de consulta, separadas das tabelas convencionais de marching cubes, com 512 casos de células de transição.
A essa altura, já tínhamos cicatrizes de integração suficientes para saber que não devíamos apressar a implementação.
O Spike 15 tinha uma única tarefa: construir uma bancada de testes de junções na qual pudéssemos confiar antes de mexer no algoritmo completo. Configuramos um ambiente controlado no qual dois chunks com dados SDF conhecidos ficavam lado a lado em resoluções diferentes, com controles de visualização para alternar de forma independente a malha principal, a malha da junção, o wireframe e as normais.
Abrir o Spike 15 em uma nova aba ↗ · Ver código-fonte
Quando a bancada de testes ficou estável, o Spike 16 validou a geração de células de transição orientada por tabelas em uma única face. Escolhemos uma face alinhada a um eixo (limite +X), implementamos a avaliação das células de transição apenas para essa face e comparamos o resultado com os dados de referência do artigo sobre Transvoxel.
Abrir o Spike 16 em uma nova aba ↗ · Ver código-fonte
Testamos intencionalmente uma face de cada vez, porque a integração das tabelas de transição apresenta muitos modos de falha independentes. O cálculo do índice de caso depende da coleta dos vértices corretos das duas grades. A indexação dos vértices dentro de uma célula de transição usa um esquema de numeração diferente do usado pelas células convencionais de marching cubes. A ordem de orientação dos vértices precisa ser consistente com a malha principal, ou o backface culling eliminará os triângulos da junção. Se você testar as seis faces ao mesmo tempo, todos os sintomas parecerão aleatórios. Se testar uma face minuciosamente, obterá falhas significativas e depuráveis.
Outro ganho sutil dessa fase foi o investimento em ferramentas. Criamos cedo controles de visibilidade, renderização apenas das junções e indicadores de LOD codificados por cores. Na época, esses controles pareciam trabalho adicional. Mais tarde, quando os casos extremos ficaram complicados, eles compensaram o investimento repetidas vezes, pois conseguíamos isolar exatamente quais células de junção estavam se comportando mal.
Ao final deste capítulo, não tínhamos "terminado as junções". Estávamos em uma posição na qual era possível analisar os bugs de junção em vez de temê-los.
Na parte 10, começa a verdadeira montanha-russa. Cantos com LODs mistos, inversões de orientação, fantasmas causados por sobredesenho parcial e aqueles momentos em que você tem certeza de que o algoritmo está errado, mas então descobre que o bug é um intervalo de desenho lendo além da contagem de vértices ativos.
Tecnologias mencionadas neste capítulo
O algoritmo Transvoxel. Projetado por Eric Lengyel (transvoxel.org), o Transvoxel resolve o problema mais difícil do LOD em terrenos volumétricos: as junções entre chunks com resoluções diferentes. Quando um chunk de alta resolução fica ao lado de outro de baixa resolução, as malhas de marching cubes não se alinham no limite, produzindo rachaduras visíveis. O Transvoxel insere células de transição especiais ao longo das faces de limite, superando a diferença de resolução com triângulos adicionais que correspondem aos dois lados. O algoritmo usa suas próprias tabelas de consulta (separadas das tabelas convencionais de marching cubes), com 512 casos de células de transição reduzidos a 73 classes de equivalência. Ele não é protegido por patentes e já foi usado em jogos lançados (Space Engineers, Astroneer). Consulte nosso guia de paisagens sobre Transvoxel.
Células de transição. Células especiais geradas na face entre dois níveis de LOD. Ao contrário das células convencionais de marching cubes, que coletam amostras de 8 cantos de uma grade, as células de transição coletam amostras simultaneamente das grades de alta e baixa resolução. A face de alta resolução tem
Junções de transição de LOD. O limite entre duas resoluções de malha no qual a incompatibilidade topológica causa artefatos visuais. Sem a união, um chunk com LOD 0 (grade de 1 m) ao lado de um chunk com LOD 1 (grade de 2 m) produz junções em T: a malha fina tem vértices ao longo do limite que não são compartilhados pela malha grossa, causando rachaduras pelas quais a luz vaza. Transvoxel, geomorphing e geometria de saias são três abordagens para corrigir essas junções. Para terrenos volumétricos, o Transvoxel é a solução padrão porque o geomorphing funciona apenas com mapas de altura. Consulte LOD para terrenos volumétricos.
Parte 9 de 12.
Anterior: Parte 8 — Integração sem perder nossa referência
Próxima: Parte 10 — Caos nas junções e a batalha contra o chefão dos cantos
Guia da série: /pt-BR/blog/2026-02-25-open-world-browser-series-guide