SDF-fysica en Deeltjessystemen

EN NL ES PT-BR


Fysica-engines verwerken twee heel verschillende workloads. Starre lichamen hebben de penetratiediepte- en scheidingsrichtingquery’s nodig die worden behandeld in SDF-botsingsdetectie . Deeltjessystemen en zachte-lichaaminteracties hebben het tegenovergestelde nodig: per-deeltje-query’s tegen complexe impliciete oppervlakken, op schalen waar mesh-gebaseerde methoden prohibitief duur zouden zijn. Dit artikel behandelt de drie manieren waarop SDF’s die workload bedienen: discrete botsingsrespons, continue krachtvelden en de level-set-representatie die wordt gebruikt in grid-gebaseerde vloeistofsimulatie.

Als de tekenconventie of de gradiënt vaag is, bouwt het Signed Distance Fields overzicht beide op vanuit de eerste principes. Voor het overkoepelende beeld in de engine, zie SDF’s in game-ontwikkeling .

Deeltjesbotsingsrespons

Wanneer een deeltje een volume binnengaat dat is gedefinieerd door een SDF (dat wil zeggen, wanneer d(p)<0d(\mathbf{p}) < 0), moet de responslogica het deeltje terugprojecteren naar het oppervlak en zijn snelheid reflecteren. De SDF levert alles wat nodig is in twee evaluaties:

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;
    }
}

De gradiënt geeft de oppervlaktenormaal op het dichtstbijzijnde grenspunt, en vermenigvuldiging met de negatieve afstand -d projecteert het deeltje exact naar het oppervlak. De snelheidsreflectie gebruikt de standaard spiegelformule met een instelbare bouncefactor die het energieverlies bij impact regelt. Een factor van 1,0 behoudt alle kinetische energie (perfecte elastische botsing); 0,0 elimineert de normale component volledig (het deeltje glijdt langs het oppervlak).

Een uitgewerkt voorbeeld toont elke regel die echt werk doet. Neem een bol-SDF met straal 1 op de oorsprong, een deeltje op (0.8,0.5,0)(0.8, 0.5, 0) met snelheid (0.5,0.7,0)(-0.5, 0.7, 0) en een bouncefactor van 0,8.

De afstandsevaluatie: (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, dus d=0.9431=0.057d = 0.943 - 1 = -0.057. Het deeltje bevindt zich 0,057 eenheden onder het oppervlak. De genormaliseerde gradiënt is p/p=(0.848,0.530,0)\mathbf{p}/\|\mathbf{p}\| = (0.848, 0.530, 0).

Projectie: position -= d * normal voegt 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) toe, wat (0.848,0.530,0)(0.848, 0.530, 0) geeft, waarvan de lengte precies 1 is. Het deeltje zit op het oppervlak.

Reflectie: 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. Omdat vn<0v_n < 0 (het deeltje bewoog naar binnen), trekt de snelheidsupdate (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) van de snelheid af, wat (0.419,0.751,0)(-0.419, 0.751, 0) geeft. De naar binnen gerichte component werd verwijderd en omgekeerd met een bounce: het deeltje verlaat het oppervlak met een normale component geschaald door de bouncefactor.

Dit patroon schaalt naar miljoenen deeltjes op de GPU omdat elk deeltje slechts één afstandsevaluatie en één gradiëntevaluatie nodig heeft, beide zuivere rekenkunde. Er is geen acceleratiestructuur om te doorlopen en geen driehoek om te lokaliseren. De gradiënt zelf kost meer dan de afstand: een centraal-verschilgradiënt samplet het veld zes keer, of vier keer met een tetraëdrische stencil, dus een volledige botsingsrespons is ruwweg zeven veldevaluaties per deeltje. Dat is nog steeds triviaal goedkoop vergeleken met het lokaliseren en testen van een driehoek.

Twee randgevallen verdienen aandacht. Deeltjes die in één stap dieper binnendringen dan hun straal (de discrete versie van het tunnelenprobleem) hebben dezelfde sphere casting uit de botsings-spoke nodig, of een begrenzing van de correctie per stap zodat een enkele hevige impact het deeltje niet naar de verkeerde kant van het veld teleporteert. En wanneer de bouncefactor 0 is, wordt de reflectieregel volledig overgeslagen en draait alleen de projectie; dit is de gebruikelijke opzet voor rook en stof, die moeten neerdalen en glijden in plaats van pingpongen.

SDF-Gebaseerde Krachtvelden

De SDF-gradiënt kan ook continue krachten aansturen in plaats van discrete botsingsgebeurtenissen. Een repulsieveld houdt deeltjes weg van een volume door een kracht uit te oefenen die evenredig is met hoe dichtbij ze zijn:

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;
}

Dit creëert een zachte grens waar deeltjes langs glijden in plaats van er met een discrete bounce tegenaan te komen. Op het oppervlak zelf is de kracht op volledige sterkte, op maxDistance is hij nul, en daartussen valt hij lineair af. Dezelfde gradiëntrichting die botsingsrespons bedient, dient nu als krachtrichting.

Een uitgewerkt voorbeeld: een deeltje 0,5 eenheden buiten een oppervlak, met maxDistance = 2.0 en strength = 3.0. De krachtgrootte is 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, die direct weg van het oppervlak duwt. Een deeltje 1,5 eenheden erbuiten ontvangt 3.0(11.5/2.0)=0.753.0 \cdot (1 - 1.5/2.0) = 0.75, een kwart van de kracht. De relatie is een rechte lijn van volledige kracht op het oppervlak tot niets op de cutoff-straal, waardoor de grens zacht en voorspelbaar aanvoelt.

Het krachtveld is nuttig voor windvelden rond gebouwen (het gebouw is een unie van box-SDF’s, en deeltjes voelen een duw nabij de vlakken en randen), magnetische repulsie-effecten en het binnenhouden van rookdeeltjes in een container gedefinieerd door CSG-operaties. Omdat de kracht alleen afhangt van het veld en het punt, combineert het met elke andere kracht (zwaartekracht, weerstand, turbulentie) via eenvoudige vectoroptelling.

De Verbinding met Vloeistofsimulatie

Afstandsvelden staan ook centraal in grid-gebaseerde vloeistofsimulatie, waar dezelfde representatie op twee plaatsen verschijnt. In de level-set-methode wordt het vloeistofoppervlak impliciet gevolgd als de zero level set van een signed distance function. Elke simulatietstap advecteert het veld met de vloeistofsnelheid en renormaliseert het vervolgens zodat het dicht bij een echt afstandsveld blijft; het oppervlak is waar het veld door nul gaat. Dit vermijdt de topologie-ergernissen van het volgen van een expliciet oppervlakte-mesh door spetters, druppels en samenvloeiende vloeistofmassa’s.

De SDF verschijnt ook opnieuw in de drukprojectiestap, waar de Poisson-vergelijking wordt opgelost op gridcellen die op basis van hun afstandsteken zijn geclassificeerd als vloeistof, vast of lucht. Cellen binnen vaste geometrie (negatieve afstand tot het vaste veld) krijgen randvoorwaarden die het snelheidsveld uit obstakels duwen. Hetzelfde veld dat het zichtbare vloeistofoppervlak definieert, definieert ook waar de drukoplossing wordt beperkt.

Dit is een dieper onderwerp dan één sectie kan behandelen, maar het is de moeite waard om te weten dat de SDF-representatie naadloos overgaat van realtime game-fysica naar volledige computationele vloeistofdynamica: hetzelfde veld, dezelfde tekenconventie, dezelfde zero level set, alleen met advectie en renormalisatie er bovenop.

Samenvatting

Op deeltjesschaal vervangt het SDF-contract zoeken door rekenkunde:

  • Botsingsrespons evalueert het veld één keer voor penetratie, leest de gradiënt voor de normaal, projecteert het deeltje naar het oppervlak en reflecteert de snelheid met een instelbare bounce.
  • Krachtvelden schalen de gradiënt met een afvalfunctie om zachte grenzen te creëren waar deeltjes langs glijden in plaats van af te stuiteren.
  • Vloeistofsimulatie volgt het oppervlak als een geadvecteerde level set en beperkt de drukoplossing met afstandstekens.

De penetratiewiskunde die deze keten start, minimale translatievectoren en sphere casts, is het onderwerp van de botsingsdetectie-deep-dive . De andere kant van SDF-fysica, wat er gebeurt wanneer de omgeving zelf deformeert, leeft in de vernietigbaar-terrein-deep-dive .