Física com SDF e Sistemas de Partículas

EN NL ES PT-BR


Motores de física lidam com duas cargas de trabalho muito diferentes. Corpos rígidos precisam das consultas de profundidade de penetração e direção de separação abordadas em detecção de colisão com SDF . Sistemas de partículas e interações de corpos moles precisam do oposto: consultas por partícula contra superfícies implícitas complexas, em escalas onde métodos baseados em malha seriam proibitivamente caros. Este artigo aborda as três maneiras pelas quais SDFs atendem a essa carga de trabalho: resposta de colisão discreta, campos de força contínuos e a representação de level set usada na simulação de fluidos baseada em grade.

Se a convenção de sinal ou o gradiente estiverem confusos, a visão geral de Campos de Distância com Sinal constrói ambos a partir dos primeiros princípios. Para a visão geral do motor como um todo, veja SDFs no desenvolvimento de jogos .

Resposta de Colisão de Partículas

Quando uma partícula entra em um volume definido por um SDF (isto é, quando d(p)<0d(\mathbf{p}) < 0), a lógica de resposta precisa projetar a partícula de volta à superfície e refletir sua velocidade. O SDF fornece tudo o que é necessário em duas avaliações:

void resolveParticleCollision(inout vec3 position, inout vec3 velocity,
                               SDF volume, float bounceFactor) {
    float d = evaluateSDF(position, volume);
    if (d >= 0.0) return;  // Not penetrating

    vec3 normal = normalize(gradientSDF(position, volume));

    // Push particle back to surface
    position -= d * normal;

    // Reflect velocity about the surface normal
    float vn = dot(velocity, normal);
    if (vn < 0.0) {
        velocity -= (1.0 + bounceFactor) * vn * normal;
    }
}

O gradiente fornece a normal da superfície no ponto de fronteira mais próximo, e multiplicar pela distância negativa -d projeta a partícula exatamente para a superfície. A reflexão de velocidade usa a fórmula de espelho padrão com um fator de quique configurável que controla a perda de energia no impacto. Um fator de 1.0 preserva toda a energia cinética (quique elástico perfeito); 0.0 elimina completamente a componente normal (a partícula desliza ao longo da superfície).

Um exemplo trabalhado mostra cada linha fazendo trabalho real. Considere um SDF de esfera de raio 1 na origem, uma partícula em (0.8,0.5,0)(0.8, 0.5, 0) com velocidade (0.5,0.7,0)(-0.5, 0.7, 0) e um fator de quique de 0.8.

A avaliação de distância: (0.8,0.5,0)=0.64+0.25=0.890.943\|(0.8, 0.5, 0)\| = \sqrt{0.64 + 0.25} = \sqrt{0.89} \approx 0.943, então d=0.9431=0.057d = 0.943 - 1 = -0.057. A partícula está 0.057 unidades abaixo da superfície. O gradiente normalizado é p/p=(0.848,0.530,0)\mathbf{p}/\|\mathbf{p}\| = (0.848, 0.530, 0).

Projeção: position -= d * normal soma 0.057(0.848,0.530,0)=(0.048,0.030,0)0.057 \cdot (0.848, 0.530, 0) = (0.048, 0.030, 0), resultando em (0.848,0.530,0)(0.848, 0.530, 0), cujo comprimento é exatamente 1. A partícula se assenta na superfície.

Reflexão: vn=(0.5,0.7,0)(0.848,0.530,0)=0.424+0.371=0.053v_n = (-0.5, 0.7, 0) \cdot (0.848, 0.530, 0) = -0.424 + 0.371 = -0.053. Como vn<0v_n < 0 (a partícula estava se movendo para dentro), a atualização de velocidade subtrai (1+0.8)(0.053)(0.848,0.530,0)=(0.081,0.051,0)(1 + 0.8)(-0.053)(0.848, 0.530, 0) = (-0.081, -0.051, 0) da velocidade, resultando em (0.419,0.751,0)(-0.419, 0.751, 0). A componente para dentro foi removida e invertida com um quique: a partícula deixa a superfície com uma componente normal escalada pelo fator de quique.

Esse padrão escala para milhões de partículas na GPU porque cada partícula precisa apenas de uma avaliação de distância e uma avaliação de gradiente, ambas puramente aritméticas. Não há estrutura de aceleração para percorrer nem triângulo para localizar. O gradiente em si custa mais do que a distância: um gradiente de diferenças centrais amostra o campo seis vezes, ou quatro vezes com um stencil tetraédrico, então uma resposta de colisão completa é aproximadamente sete avaliações de campo por partícula. Isso ainda é trivialmente barato comparado a localizar e testar um triângulo.

Dois casos extremos merecem atenção. Partículas que entram mais fundo do que seu raio em um único passo (a versão discreta do problema de tunelamento) precisam do mesmo sphere casting do spoke de colisão, ou de um limite na correção por passo para que um único impacto violento não teletransporte a partícula para o lado errado do campo. E quando o fator de quique é 0, a linha de reflexão é pulada completamente e apenas a projeção roda; essa é a configuração comum para fumaça e poeira, que devem assentar e deslizar em vez de quicar de um lado para o outro.

Campos de Força Baseados em SDF

O gradiente do SDF também pode impulsionar forças contínuas em vez de eventos de colisão discretos. Um campo de repulsão mantém as partículas longe de um volume aplicando uma força proporcional ao quão próximas elas estão:

vec3 sdfRepulsionForce(vec3 position, SDF volume, float maxDistance, float strength) {
    float d = evaluateSDF(position, volume);
    if (d > maxDistance) return vec3(0.0);

    // Force falls off linearly from maxDistance to surface,
    // then increases linearly for penetration
    float forceMagnitude = strength * (1.0 - d / maxDistance);
    vec3 direction = normalize(gradientSDF(position, volume));
    return forceMagnitude * direction;
}

Isso cria uma fronteira suave ao longo da qual as partículas deslizam em vez de colidir com um quique discreto. Na própria superfície a força está em intensidade total, em maxDistance é zero, e entre eles cai linearmente. A mesma direção de gradiente que serve à resposta de colisão agora serve como direção da força.

Um exemplo trabalhado: uma partícula 0.5 unidades fora de uma superfície, com maxDistance = 2.0 e strength = 3.0. A magnitude da força é 3.0(10.5/2.0)=3.00.75=2.253.0 \cdot (1 - 0.5/2.0) = 3.0 \cdot 0.75 = 2.25, empurrando diretamente para longe da superfície. Uma partícula 1.5 unidades fora recebe 3.0(11.5/2.0)=0.753.0 \cdot (1 - 1.5/2.0) = 0.75, um quarto da força. A relação é uma linha reta da força total na superfície até nada no raio de corte, o que faz a fronteira parecer suave e previsível.

O campo de força é útil para campos de vento ao redor de edifícios (o edifício é uma união de SDFs de caixa, e as partículas sentem um empurrão perto de suas faces e arestas), efeitos de repulsão magnética e para manter partículas de fumaça dentro de um contêiner definido por operações CSG. Como a força depende apenas do campo e do ponto, ela se combina com qualquer outra força (gravidade, arrasto, turbulência) por simples adição de vetores.

A Conexão com a Simulação de Fluidos

Campos de distância também são centrais na simulação de fluidos baseada em grade, onde a mesma representação aparece em dois lugares. No método de level set, a superfície do fluido é rastreada implicitamente como o conjunto de nível zero de uma função de distância com sinal. Cada passo de simulação advecta o campo com a velocidade do fluido e então o renormaliza para que permaneça próximo de um verdadeiro campo de distância; a superfície é onde o campo cruza o zero. Isso evita as dores de cabeça de topologia de rastrear uma malha de superfície explícita através de respingos, gotículas e massas de fluido que se fundem.

O SDF também reaparece na etapa de projeção de pressão, onde a equação de Poisson é resolvida em células da grade classificadas como fluido, sólido ou ar pelo sinal de sua distância. Células dentro da geometria sólida (distância negativa ao campo sólido) recebem condições de contorno que empurram o campo de velocidade para fora dos obstáculos. O mesmo campo que define a superfície visível do fluido também define onde a solução de pressão é restringida.

Este é um tópico mais profundo do que uma seção pode cobrir, mas vale a pena saber que a representação de SDF se estende perfeitamente da física de jogos em tempo real para a dinâmica de fluidos computacional completa: mesmo campo, mesma convenção de sinal, mesmo conjunto de nível zero, apenas com advecção e renormalização adicionadas por cima.

Resumo

Em escala de partícula, o contrato do SDF substitui busca por aritmética:

  • Resposta de colisão avalia o campo uma vez para penetração, lê o gradiente para a normal, projeta a partícula na superfície e reflete a velocidade com um quique configurável.
  • Campos de força escalam o gradiente por uma função de decaimento para criar fronteiras suaves ao longo das quais as partículas deslizam em vez de quicar.
  • Simulação de fluidos rastreia a superfície como um level set advectado e restringe a solução de pressão com sinais de distância.

A matemática de penetração que inicia essa cadeia, vetores de translação mínima e sphere casts, é o assunto do mergulho profundo em detecção de colisão . O outro lado da física com SDF, o que acontece quando o próprio ambiente se deforma, vive no mergulho profundo em terreno destrutível .