Terreno Destrutível com SDF e Deformação em Tempo Real

EN NL ES PT-BR


Ambientes destrutíveis são um dos problemas mais difíceis da renderização em jogos. Uma malha tradicional precisa ser retriangulada sempre que a superfície muda, o que é caro e cria contagens de triângulos imprevisíveis. SDFs lidam com destruição naturalmente porque esculpir um buraco é apenas uma subtração CSG, uma operação sobre um campo escalar. Este artigo aborda a operação de escultura, como a árvore de SDF escala conforme deformações se acumulam, a etapa de extração com Marching Cubes que transforma o campo de volta em triângulos, e as abordagens híbridas que os motores usam na prática.

Para os operadores CSG e os fundamentos do sphere tracing, comece com a visão geral de Campos de Distância com Sinal . Para o contexto do motor como um todo, veja SDFs no desenvolvimento de jogos .

Esculpir Terreno Destrutível com Subtração CSG

Quando uma explosão remove um pedaço esférico de terreno, o SDF é atualizado com uma única operação:

float crateredTerrainSDF(vec3 p) {
    float terrain = terrainBaseSDF(p);
    float crater = sphereSDF(p, explosionCenter, explosionRadius);
    return max(terrain, -crater);  // CSG subtraction
}

O padrão max(a, -b) subtrai o volume B do volume A. Qualquer ponto que estava dentro do terreno e da esfera de explosão agora está fora (sua distância se torna positiva), esculpindo um buraco exatamente onde a explosão ocorreu. A atualização custa uma primitiva extra por explosão, não uma retriangulação completa.

Um exemplo trabalhado mostra a subtração agindo sobre valores reais. Considere um terreno plano onde o SDF base é o plano dterrain(p)=pyd_{\text{terrain}}(\mathbf{p}) = p_y (negativo abaixo da superfície, positivo acima) e uma explosão centrada em (0,2,0)(0, -2, 0) com raio 3. O SDF da cratera é p(0,2,0)3\|\mathbf{p} - (0, -2, 0)\| - 3.

Teste três pontos:

  • (0,0.5,0)(0, -0.5, 0): terreno =0.5= -0.5 (1.5 unidades abaixo da superfície), cratera =(0,1.5,0)3=1.5= \|(0, 1.5, 0)\| - 3 = -1.5 (dentro da explosão). Combinado: max(0.5,1.5)=1.5\max(-0.5, 1.5) = 1.5. O ponto que era chão sólido agora está 1.5 unidades fora do terreno. Ele foi esculpido.
  • (0,0.5,0)(0, 0.5, 0): terreno =0.5= 0.5, cratera =(0,2.5,0)3=0.5= \|(0, 2.5, 0)\| - 3 = -0.5. Combinado: max(0.5,0.5)=0.5\max(0.5, 0.5) = 0.5. Ainda na superfície, inalterado.
  • (2,0.2,0)(2, 0.2, 0): terreno =0.2= 0.2, cratera =(2,2.2,0)3=2.9733=0.027= \|(2, 2.2, 0)\| - 3 = 2.973 - 3 = -0.027. Combinado: max(0.2,0.027)=0.2\max(0.2, 0.027) = 0.2. Logo fora da borda da explosão, inalterado.

O primeiro ponto é a escultura em si: chão que era sólido agora está vazio. Os outros dois mostram que o terreno intocado mantém seus valores exatos de distância, então o campo combinado permanece um SDF válido em todos os lugares, exceto onde a esfera se sobrepõe ao terreno.

Isso escala para múltiplas deformações sequenciais. Cada nova cratera adiciona mais um termo à expressão do SDF. Após 50 explosões, o SDF é uma árvore com 51 primitivas (1 terreno base + 50 operações de subtração), e avaliá-lo em um ponto custa 51 cálculos de distância de primitivas. Isso é crescimento linear no número de eventos de deformação, mas constante por avaliação, sem topologia de malha para manter. Quando muitas crateras se sobrepõem, a árvore permanece correta porque cada termo max apenas torna um ponto mais para fora, que é exatamente a semântica de remover material.

Extração de Malha para Renderização

O terreno baseado em SDF ainda precisa se tornar triângulos para o pipeline de rasterização, a menos que você renderize inteiramente com ray marching. A ponte padrão é o Marching Cubes, que extrai uma isosuperfície de um campo escalar amostrado. Como o SDF codifica a superfície como o conjunto de nível zero, o Marching Cubes extrai naturalmente uma malha triangular que aproxima a forma atual do terreno.

O pipeline completo é assim:

  1. Mantenha um SDF de terreno base, possivelmente amostrado de um heightmap ou ruído procedural.
  2. Aplique subtração CSG para cada evento de deformação (explosões, escavação, construção).
  3. Amostre o SDF combinado em uma grade 3D ao redor da região deformada.
  4. Execute Marching Cubes nessas amostras para produzir uma malha triangular.
  5. Envie a malha para a GPU para rasterização.

As etapas 3 a 5 se repetem a cada quadro na região afetada, mas a grade normalmente é pequena (64³ ou 128³) e a extração é rápida o suficiente para uso em tempo real. Jogos como Astroneer e Deep Rock Galactic usam variações desse pipeline para seu terreno destrutível.

Duas decisões de ajuste dominam a qualidade da extração. A primeira é a resolução da grade: dobrar a resolução multiplica a contagem de amostras por 8 em 3D, então o tamanho da grade é um orçamento direto de memória e tempo. A segunda é onde a grade vive: extrair apenas ao redor da região deformada mantém o custo limitado, independentemente do tamanho do nível, enquanto re-extrair o mundo inteiro a cada quadro não escala. As compensações de amostragem e interpolação são as mesmas que regem os campos de distância com sinal assados ; o hub de Marching Cubes aborda o algoritmo de extração em si.

Abordagens Híbridas

Nem toda superfície destrutível precisa de um SDF volumétrico completo. Um híbrido comum é representar o terreno como um heightfield 2D com um SDF 2D codificando informações de saliências e cavernas. O heightfield lida com a superfície primária a baixo custo, e o SDF lida com características côncavas e túneis que um heightfield não consegue representar.

Outro híbrido armazena o histórico de deformação como uma lista de primitivas subtraídas (esferas, caixas, cápsulas) e as avalia em tempo de execução apenas onde necessário. Longe de qualquer deformação, o terreno base avalia rapidamente. Perto das deformações, os termos CSG extras adicionam custo, mas apenas nas regiões onde o detalhe é alto. Esse é o mesmo princípio da árvore de SDF da seção de escultura, mas com a árvore mantida preguiçosa: as primitivas só são consultadas quando uma consulta cai dentro de sua região delimitadora.

O híbrido que mais aparece em jogos lançados combina todos esses: um heightfield para o terreno amplo, um pequeno volume de SDF volumétrico para a região ao redor de deformações ativas, e uma lista de eventos de deformação que pode ser reproduzida para reconstruir qualquer uma das representações quando o nível é salvo ou carregado.

Resumo

A destruição é onde os pontos fortes representacionais do SDF se alinham com mais clareza:

  • Escultura é uma subtração CSG, max(terrain, -crater), que remove exatamente o volume explodido e permanece um campo de distância válido em todos os outros lugares.
  • Escalonamento é linear no número de eventos de deformação e constante por avaliação, sem topologia de malha para reparar.
  • Renderização re-extrai triângulos com Marching Cubes a partir de uma grade pequena ao redor da região deformada.
  • Híbridos combinam heightfields, listas de deformação preguiçosas e SDFs volumétricos para manter o custo proporcional ao dano real.

O mesmo campo que armazena o terreno esculpido também responde às consultas de colisão que os jogadores disparam contra ele, e às passadas de sombra e AO que o iluminam.