Last updated on

Como Calcular um Campo de Distância com Sinal a partir de uma Malha

ENNLESPT-BR


Um campo de distância com sinal amostrado é uma grade pré-calculada de amostras de distância que representa uma forma para a qual não existe uma fórmula de distância compacta. Malhas de triângulos são a fonte mais comum: personagens, modelos digitalizados, geometria de níveis e contornos de fontes chegam todos como listas de vértices e faces em vez de equações. A amostragem transforma essa malha em um campo que você pode consultar em qualquer ponto do espaço.

Este artigo se apoia no tutorial de campos de distância com sinal analíticos e assume que a convenção de sinais é familiar: negativo no interior, zero na superfície, positivo no exterior. Aqui a pergunta muda de “qual é a fórmula” para “como calculo e armazeno as distâncias”.

Por Que uma Malha Não Tem um SDF de Forma Fechada

Um SDF analítico funciona porque a forma tem uma estrutura que a fórmula pode aproveitar. Uma esfera é definida por um centro e um raio, então a distância até sua superfície é a distância ao centro menos o raio. Uma caixa é definida por semiextensões, então sua distância vem de alguns componentes limitados. A fórmula vale em todo o espaço e custa um punhado de operações aritméticas.

Uma malha de triângulos não oferece esse atalho. É uma coleção arbitrária de triângulos sem centro, eixo ou parametrização comum, então nenhuma expressão retorna a distância até a superfície mais próxima. Você consegue escrever a distância de forma fechada de um ponto a um único triângulo: projete o ponto no plano do triângulo e limite-o dentro do triângulo, e o comprimento dessa diferença é a distância. A dificuldade está na palavra mais próximo. A distância real é o mínimo sobre todos os triângulos, e encontrar esse mínimo exige uma busca. O teste de interior e exterior acrescenta uma segunda pergunta global que nenhuma fórmula por triângulo responde sozinha.

É essa lacuna que a amostragem preenche. Ela avalia a busca cara em um conjunto finito de pontos da grade, guarda as respostas e deixa a interpolação responder ao resto.

O Pipeline de Amostragem de Malha para SDF

Transformar uma malha em um campo de distância com sinal costuma ser chamado de voxelizar a malha, porque a saída é um volume de células (voxels) que guardam cada uma um valor de distância. O pipeline tem quatro etapas.

1. Coloque uma Grade sobre a Malha

Comece pela caixa delimitadora da malha e adicione uma pequena margem para que o campo tenha espaço para ficar positivo fora da superfície. Depois escolha uma resolução, o número de amostras ao longo de cada eixo. A grade se torna a representação: depois de amostrada, as consultas vão para essa grade e nunca mais tocam os triângulos. A resolução é o principal controle de precisão e o principal custo de memória, e a próxima seção torna essa compensação concreta.

2. Encontre a Distância até o Triângulo Mais Próximo

Para cada ponto de amostra p\mathbf{p} da grade, calcule a distância até cada triângulo candidato e mantenha a menor. A distância até um triângulo tt é a distância até o ponto mais próximo dele:

dt(p)=∥p−ct(p)∥d_t(\mathbf{p}) = |\mathbf{p} - \mathbf{c}_t(\mathbf{p})|

onde ct(p)\mathbf{c}_t(\mathbf{p}) é o ponto mais próximo do triângulo tt. Esse ponto mais próximo fica dentro do triângulo, em uma de suas arestas ou em um vértice, e a mesma projeção e limitação resolvem os três casos. A distância de malha sem sinal é o mínimo sobre os triângulos:

dsurface(p)=min⁡tdt(p)d_{\text{surface}}(\mathbf{p}) = \min_t d_t(\mathbf{p})

Testar cada triângulo para cada amostra é correto, mas lento, então pipelines de produção aceleram a busca com uma hierarquia de volumes delimitadores ou uma grade espacial que descarta cedo os triângulos distantes. Outra abordagem escreve a distância bruta apenas perto da superfície e depois a propaga pela grade com uma varredura de transformada de distância, alcançando o mesmo resultado em outra ordem.

3. Decida de Que Lado Está Cada Amostra

A distância sozinha dá a magnitude, e o sinal exige um teste de interior e exterior. Para uma malha fechada, o método padrão lança um raio a partir da amostra e conta quantos triângulos ele cruza: um número ímpar significa interior, um número par significa exterior. Um teste de número de enrolamento (winding number) é mais robusto quando triângulos se sobrepõem ou a malha tem pequenos defeitos, e o número de enrolamento generalizado o estende a malhas que não são perfeitamente fechadas. Uma opção mais barata para malhas fechadas preenche por difusão (flood fill) a região externa a partir da borda da grade e marca como interior tudo que o preenchimento não alcança.

Esta etapa é onde os SDFs de malha mais erram. Se a malha tem buracos, faces duplicadas ou orientação inconsistente, o sinal se inverte perto do defeito e o campo amostrado desenvolve manchas invertidas. Boas implementações validam a estanqueidade antes de amostrar, ou recorrem a um teste de número de enrolamento que tolera a imperfeição.

4. Armazene as Amostras e Interpole

Guarde as amostras com sinal em uma textura 3D ou em um array plano. Em tempo de execução, uma consulta lê as oito amostras ao redor e as mistura com interpolação trilinear. O resultado é uma distância aproximada que permanece contínua entre células e é barata o bastante para um shader.

Inside Outside Surface

A visualização mostra as mesmas quatro etapas em 2D, onde a malha é um polígono e a característica mais próxima é uma aresta em vez de um triângulo. Pressione play para percorrer a grade em ordem de varredura: cada amostra encontra sua aresta mais próxima e registra uma distância com sinal, marcada em vermelho dentro, azul fora e branco na fronteira. Ative o campo reconstruído para ver a interpolação bilinear preencher os espaços entre as amostras, e compare o contorno poligonal tracejado com o contorno zero colorido. Em baixa resolução o contorno arredonda cantos e corta detalhes finos; aumentar a resolução aproxima a fronteira reconstruída das arestas reais.

Resolução, Memória e Detalhe Perdido

O tamanho da grade cresce rápido com a resolução. Dobrar o número de amostras por eixo multiplica a contagem de amostras por 4 em 2D e por 8 em 3D. Uma grade 128³ contém cerca de 2 milhões de amostras, enquanto uma grade 256³ contém mais de 16 milhões. A dois bytes por amostra, um campo 256³ ocupa cerca de 32 MB, e a quatro bytes ocupa 64 MB, antes de qualquer compressão.

Esse custo compra precisão, e os cantos são o lugar mais difícil de gastá-la. A distância real muda de direção abruptamente ao cruzar a bissetriz de um canto, enquanto a interpolação trilinear só pode produzir uma mistura suave das amostras ao redor, então o contorno zero reconstruído arredonda o canto. O mesmo efeito faz detalhes mais finos que um voxel desaparecerem por completo do campo. Aumentar a resolução reduz os dois erros, mas a melhoria é gradual e nunca exata.

Dois truques padrão reduzem o custo em vez do erro. Uma faixa estreita (narrow band) armazena amostras apenas dentro de algumas células da superfície e ignora o interior e o exterior uniformes, onde a distância é previsível. O armazenamento esparso e a codificação por comprimento de sequência comprimem então as grandes regiões vazias. Ambos mantêm o mesmo comportamento de consulta enquanto reduzem a memória que uma grade completa exigiria.

Trabalhando com um Campo Amostrado

Depois de amostrado, um campo alimenta o mesmo pipeline downstream que um SDF analítico. As operações CSG consomem valores escalares, então união, interseção e subtração funcionam sem alterações em campos amostrados. As normais de superfície ainda vêm de diferenças finitas entre amostras vizinhas, e o ray marching ainda percorre o campo.

A diferença prática importante é a segurança do passo. Um SDF analítico nunca superestima a distância até a superfície, e é isso que torna o sphere tracing seguro com passos iguais ao valor do campo. A interpolação trilinear não preserva essa garantia: o valor interpolado pode exceder a distância real entre as amostras, especialmente perto dos cantos. Os ray marchers tratam um campo amostrado como um limite inferior conservador, ampliam suas margens de segurança e usam um multiplicador de passo menor.

Campos de Distância de Malha em Produção

A Unreal Engine 5 amostra malhas de triângulos estáticas em grades de voxels esparsas e usa os campos de distância de malha resultantes para sombras de campo de distância, oclusão ambiente e consultas de colisão. O pré-processamento roda offline durante a criação de conteúdo, então o custo em tempo de execução é de consultas à grade e interpolação. Motores de física contam com a mesma representação para colisões entre malhas complexas, muitas vezes em uma resolução mais grossa que troca precisão espacial por velocidade e pode ser reconstruída a cada quadro para objetos deformáveis.

O antecessor 2D desse pipeline é a renderização de texto com campos de distância com sinal da Valve. Contornos de glifos são amostrados uma vez em uma textura de distância, e a filtragem bilinear por hardware reconstrói bordas nítidas e suavizadas em qualquer ampliação. O pipeline de malha para SDF deste artigo é a versão 3D da mesma ideia.

Quando a malha muda a cada quadro, amostrar uma grade pode ser lento demais. Uma alternativa em tempo de execução avalia a distância até o triângulo mais próximo diretamente de uma hierarquia de volumes delimitadores a cada consulta, trocando o pré-processamento por uma busca nova. Grades pré-calculadas continuam sendo a melhor escolha quando a geometria é estática e as consultas são frequentes.

Além das Grades Uniformes

Duas extensões abordam as limitações de uma grade uniforme.

Campos de distância amostrados adaptativamente (ADFs) substituem a grade por uma octree que amostra densamente perto das características da superfície e de forma esparsa em regiões planas, reduzindo a memória e preservando o detalhe. A compensação é o percurso: as consultas navegam por uma árvore em vez de indexar um array plano, o que é mais difícil de acelerar em hardware GPU de função fixa.

Campos de distância com sinal multicanal (MSDFs) armazenam distâncias a várias arestas próximas por célula, usando canais extras em uma textura. A interpolação toma o mínimo entre os canais, o que preserva os cantos afiados que um campo de canal único arredondaria, ao custo de três a quatro vezes a memória. MSDFs são padrão na renderização de texto de alta qualidade e são comuns para gráficos vetoriais em GPUs.

Ambos se baseiam no mesmo princípio de amostragem: amostrar a distância real, armazená-la e reconstruí-la em tempo de execução.