Last updated on

Gesigneerde Afstandsvelden: Een Visuele Introductie

ENNLESPT-BR


Gesigneerde afstandsvelden (SDF’s) beschrijven een vorm met één enkele functie. In plaats van driehoeken of lijnsegmenten op te slaan, bewaar je een regel die voor elk punt in de ruimte twee vragen beantwoordt: hoe ver is het dichtstbijzijnde oppervlak, en zit ik binnen of buiten?

Die twee antwoorden bestrijken meer dan je op het eerste gezicht zou denken. Rendering, botsingen, belichting, animatie en navigatie stellen allemaal afstands- en zijvragen, en een SDF beantwoordt ze allemaal door dezelfde functie op een ander punt te evalueren. Omdat de vorm in een formule leeft, kun je hem verplaatsen, herhalen, mengen en uitsnijden met gewone rekenkunde.

Deze pagina bouwt het mentale model op met interactieve 2D-voorbeelden en laat daarna zien waar elk idee naartoe leidt. De belangrijkste secties verwijzen naar aparte artikelen die de theorie, de code en de afwegingen volledig uitwerken.

Wat een Gesigneerd Afstandsveld Opslaat

Voor elk punt p\mathbf{p} geeft een SDF een gesigneerde scalair d(p)d(\mathbf{p}) terug:

  • positief buiten de vorm
  • nul op het oppervlak
  • negatief binnen de vorm

De absolute waarde ∣d(p)∣|d(\mathbf{p})| is de kortste afstand tot de grens, en het teken zegt aan welke kant je zit. Een waarde van d(p)=−0.12d(\mathbf{p}) = -0.12 betekent dat het punt 0.12 eenheden binnen de vorm ligt. Een waarde van d(p)=0.12d(\mathbf{p}) = 0.12 betekent dat het 0.12 eenheden erbuiten ligt. Bij nul zit je op het oppervlak. Dat ene getal draagt zowel een zijlabel als een afstand, meer dan een binair binnen/buiten-masker je kan vertellen.

Die extra informatie maakt het veld herbruikbaar. Een mesh legt vast waar het oppervlak is; een SDF legt vast hoe ver elk punt in de ruimte ervan verwijderd is. Het oppervlak verschuiven is dan één enkele aftrekking. d(p)−md(\mathbf{p}) - m evalueren laat de vorm met mm groeien, en d(p)+md(\mathbf{p}) + m laat hem krimpen, wat je collisionbuffers, afschuiningen en schillen geeft zonder de geometrie opnieuw op te bouwen.

——
InsideSurfaceOutside

De verkenner toont zes primitieven (cirkel, box, afgeronde box, lijnsegment, capsule en regelmatige veelhoek) als continue heatmaps, waarbij kleur de gesigneerde afstand volgt en een zwarte lijn de nulcontour markeert. Beweeg overal om de exacte waarde en een label Binnen, Oppervlak of Buiten te lezen. Van vorm wisselen houdt hetzelfde leesproces terwijl de formule eronder verandert, en de formule staat boven de schuifregelaars zodat je elke parameter kunt koppelen aan het veld dat hij produceert. De eindpunten van het segment en de capsule slepen laat zien dat het veld de geometrie onmiddellijk volgt, zonder mesh om opnieuw op te bouwen.

Onder het oppervlak is elke primitieve een compacte uitdrukking. Dat is het volgende idee dat we concreet maken.

Gesigneerde Afstandsformules voor Eenvoudige Vormen

Elke SDF-scène begint met primitieven met compacte formules, en de cirkel is het natuurlijke eerste voorbeeld:

d(p)=∥p−c∥−rd(\mathbf{p}) = |\mathbf{p} - \mathbf{c}| - r

De term ∥p−c∥|\mathbf{p} - \mathbf{c}| is de Euclidische afstand van het samplepunt p\mathbf{p} tot het middelpunt c\mathbf{c}. Het aftrekken van de straal rr verplaatst de nuldoorgang naar de grens. Op de grens is de afstand tot het middelpunt gelijk aan rr, dus de uitdrukking is nul; buiten is ze positief; binnen is ze negatief, en de grootte vertelt hoe diep het punt ligt. In code is het één regel:

float circleSDF(vec2 p, vec2 center, float r) {
    return length(p - center) - r;
}

De box volgt hetzelfde idee van afstand min omvang, per as toegepast. Voor een box gecentreerd op c\mathbf{c} met halve grootte b\mathbf{b}:

q=∣p−c∣−bd(p)=∥max⁡(q,0)∥+min⁡(max⁡(qx,qy),0)\begin{aligned} \mathbf{q} &= |\mathbf{p} - \mathbf{c}| - \mathbf{b} \ d(\mathbf{p}) &= |\max(\mathbf{q}, 0)| + \min(\max(q_x, q_y), 0) \end{aligned}

∥max⁡(q,0)∥|\max(\mathbf{q}, 0)| meet hoe ver het punt van het dichtstbijzijnde vlak verwijderd is wanneer het buiten ligt, en de tweede term geeft de penetratiediepte wanneer het binnen ligt. Ze op te tellen levert één gesigneerde waarde die hetzelfde contract volgt als de cirkel: positief buiten, nul op het oppervlak, negatief binnen.

Dezelfde cirkelformule generaliseert direct naar drie dimensies, wat het signed distance field voor een bol oplevert, een van de weinige vormen met overal in de ruimte een exacte afstand. Voor een bredere catalogus met driehoeken, capsules, torussen en meer, zie Iñigo Quilez’ referentie voor afstandsfuncties.

Vormen Combineren met Constructive Solid Geometry

Eén primitieve maakt zelden een scène. De meeste vormen worden opgebouwd door velden te combineren, en de techniek heeft een formele naam: constructive solid geometry (CSG). Met meshes vereisen booleaanse operaties het doorsnijden en opnieuw trianguleren van oppervlakken. Met SDF’s reduceren ze tot een paar vergelijkingen op afstandswaarden.

Drie operatoren dekken de meeste gevallen:

  • unie: min(a, b)
  • doorsnede: max(a, b)
  • aftrekking (A min B): max(a, -b)

Op elk punt bepaalt het dichtstbijzijnde oppervlak de gecombineerde waarde, dus het minimum van twee gesigneerde afstanden is de afstand tot hun unie. Doorsnede behoudt alleen het gebied binnen beide vormen, daarom neemt ze het maximum. Aftrekking keert het teken van het tweede veld om zodat zijn binnenkant het eerste wegbeitelt. Gaten, uitsparingen en negatieve ruimte worden zo gemodelleerd, en dezelfde operatie drijft realtime vernietiging aan: elke krater is één aftrekking meer in de boom, gevolgd door Marching Cubes om een verse mesh te extraheren voor rendering. Het artikel over vernietigbaar terrein volgt die pijplijn van uithakken en extraheren in detail.

0.50
0 primitives
InsideOutside

De visualisatie opent in Aftrekking-modus, met een ring die een rond gat uit een box snijdt. Blauw markeert buiten en rood binnen, en van operatie wisselen werkt het hele veld bij: Unie voegt de vormen samen langs hun dichtstbijzijnde randen, Doorsnede behoudt alleen de overlap, en de hover-uitlezing meldt de exacte gecombineerde afstand op elk punt. Voeg primitieven toe vanuit het palet en sleep ze op hun plaats om het veld te zien hercomponeren.

Smooth Blending

Harde min en max laten scherpe plooien achter waar vormen samenkomen, wat vaak precies is wat je wilt. Voor organische overgangen rondt een smooth minimum (smin) de overgang af. Een veelvoorkomende vorm gebruikt een blendbreedte kk:

h=clamp(0.5+0.5b−ak,0,1),smin(a,b,k)=mix(b,a,h)−kh(1−h)h = \mathrm{clamp}\left(0.5 + 0.5\frac{b-a}{k}, 0, 1\right), \quad \mathrm{smin}(a,b,k) = \mathrm{mix}(b,a,h) - k h(1-h)

Een kleine kk gedraagt zich bijna als een harde min, en een grotere kk verbreedt het menggebied tot de vormen in elkaar overvloeien. Dezelfde constructie heeft smooth doorsnede- en aftrekkingsvarianten.

0.50
0 primitives
InsideOutside

Deze instantie start in Smooth Unie. De blend-schuifregelaar omhoog zetten verbreedt de naad; terugschakelen naar Unie toont de scherpe versie van dezelfde overlap ter vergelijking. De hover-uitlezing laat zien hoe de waarde op een punt verandert naarmate kk de overgang verzacht.

Smoothen is handig, maar verandert de lokale kromming en versoepelt de strikte afstandsgarantie, een afweging die belangrijk is wanneer een ray marcher afhankelijk is van veilige stapgroottes.

Ruimte Transformeren, Herhalen en Verstoren

Veel SDF-bewerkingen raken de vormformule nooit aan. Ze transformeren de coördinaten vóór evaluatie:

  1. Translatie: evalueer op p−t\mathbf{p} - \mathbf{t}
  2. Rotatie: evalueer op R−1pR^{-1}\mathbf{p}
  3. Schaling: evalueer op p/s\mathbf{p}/s en vermenigvuldig het resultaat met ss
  4. Herhaling: omhul coördinaten met mod of fract om een vorm over de ruimte te betegelen

Omdat elke instantie één formule deelt, kan één cirkeldefinitie een raster van cirkels worden, en kan één primitieve een hele scène bevolken. Het schaalgeval is het geval om op te letten: de invoer delen door ss rekt de ruimte op, dus het ruwe resultaat moet met ss worden vermenigvuldigd om een echte afstand te herstellen.

Domeinbewerkingen combineren ook met ruis. Verstoorde coördinaten in een SDF voeren levert steenachtige, gesmolten of wolkachtige oppervlakken op, terwijl de function-first workflow behouden blijft. Value noise, Perlin noise en fractale ruis komen aan bod in het artikel over ruisfuncties.

Oppervlaktenormalen uit de Gradiënt

Zodra een query een oppervlaktepunt vindt, is de volgende vraag meestal welke kant dat oppervlak op wijst. Belichting, reflecties en botsingsrespons hebben allemaal die richting nodig. Een SDF geeft die zonder opgeslagen normalenbuffer, omdat de afstand het snelst toeneemt in de richting die wegwijst van het dichtstbijzijnde oppervlak. Die richting is de gradiënt ∇d(p)\nabla d(\mathbf{p}), en op de grens is het de naar buiten gerichte oppervlaktenormaal.

Gradient arrow Surface normal

De visualisatie legt gradiëntpijlen over de heatmap. Elke pijl wijst weg van het dichtstbijzijnde oppervlak, en pijlen dicht bij de nulcontour zijn gemarkeerd omdat de gradiënt daar de normaal is. Beweeg om een probe te plaatsen en de afstand, gradiëntrichting en gradiëntgrootte te lezen; klik om die vast te zetten en sleep dan de epsilon-schuifregelaar. Een kleine epsilon (0.001) dringt de eindige-verschilsamples samen en de richting wordt ruisig; een grote epsilon (0.5) maakt het resultaat gladder maar buigt het weg van de ware normaal bij hoeken en sterke kromming. De standaardwaarde 0.01 balanceert beide voor analytische SDF’s.

De eindige-verschilschatting bemonstert het veld op kleine verschuivingen langs elke as:

∇d(p)≈[d(p+εx)−d(p−εx)d(p+εy)−d(p−εy)]\nabla d(\mathbf{p}) \approx \begin{bmatrix} d(\mathbf{p}+\varepsilon_x)-d(\mathbf{p}-\varepsilon_x) \ d(\mathbf{p}+\varepsilon_y)-d(\mathbf{p}-\varepsilon_y) \end{bmatrix}

De oranje stippen rond de probe markeren die samplepunten. Merk op dat de gradiëntgrootte over het hele veld dicht bij 1 blijft. Dit is de eikonale eigenschap (∣∇d∣=1|\nabla d| = 1) waaraan exacte SDF’s voldoen, en daarom is de gradiënt al een eenheidsvector: normaliseer hem na de schatting voordat je hem in belichting gebruikt.

Exacte Velden, Benaderde Velden en Stapveiligheid

Niet elk gesigneerd afstandsveld meldt een echte afstand. Een formule zoals de cirkel geeft overal de exacte Euclidische afstand terug. Een veld dat uit een mesh, een smooth CSG-blend of een ruis-gemoduleerd oppervlak is gesampled, geeft een waarde terug die gesigneerd en afstand-achtig is, maar onnauwkeurig kan zijn.

De richting van de fout is belangrijk. Een veld dat de afstand onderschat (0.2 teruggeeft terwijl de ware waarde 0.5 is) laat een ray marcher kleinere stappen nemen, dus hij convergeert nog steeds. Een veld dat overschat (0.5 teruggeeft terwijl de ware waarde 0.2 is) kan een ray door een dunne wand laten stappen. Exacte velden hebben de voorkeur waar veiligheidsmarges belangrijk zijn, zoals bij lange camerastralen of botsingsdetectie, en benaderde velden hebben strakkere drempels nodig. Het ray marching-artikel behandelt de stapveiligheidsregels in detail.

Letterglyphs, gescande modellen en door artiesten gemaakte meshes hebben geen compacte formule, dus hun velden worden berekend en opgeslagen in plaats van afgeleid. Het artikel over gesamplede gesigneerde afstandsvelden doorloopt de hele pijplijn, van het vinden van de dichtstbijzijnde driehoek per sample tot het bepalen van binnen en buiten en het kiezen van een resolutie.

Waar SDF’s Passen in een Pijplijn

SDF’s zijn één geometrierepresentatie naast meerdere, en ze passen het beste waar vormen procedureel, vervormbaar of vanuit veel plaatsen bevraagd zijn. Verschillende toepassingen gebruiken het veld op verschillende manieren. Een deeltjessysteem evalueert afstand en gradiënt voor elk deeltje in vlucht, dus de kosten per query wegen zwaarder dan de complexiteit van de geteste vorm. Een navigatiesysteem leest de veldwaarde als speling en de gradiënt als een richting naar of weg van obstakels. Zachte schaduwen en ambient occlusion gebruiken het veld als een goedkope occlusietest langs lichtstralen in plaats van te vertrouwen op schaduwkaarten.

De onderstaande tabel koppelt de gangbare vragen aan de veldevaluatie die ze beantwoordt en aan het artikel dat die toepassing diepgaand behandelt.

Vraag Wat de SDF levert Lees verder
Waar raakt een straal de scène? door afstand geleide stappen langs de straal Ray marching
Ligt dit punt binnen een volume? het teken van het veld Botsingsdetectie
Hoe scheiden twee objecten zich? penetratiediepte uit de grootte, richting uit de gradiënt Botsingsdetectie
Waar stuitert een deeltje? afstand en gradiënt op het deeltje Fysica en deeltjessystemen
Hoeveel speling heeft een plek? de veldwaarde, met de gradiënt naar het dichtstbijzijnde obstakel AI-pathfinding en navigatie
Hoe zacht is een schaduw? hoe dicht een lichtstraal komt bij het occluderen van geometrie Schaduwen en ambient occlusion
Waar heeft een explosie uitgehold? een CSG-aftrekking in het veld Vernietigbaar terrein

Meshes blijven de betere keuze voor door artiesten gemaakte topologie, UV-workflows en hardwarematige driehoeksrasterisatie, en de meeste GPU-pijplijnen zijn eromheen gebouwd. SDF’s winnen wanneer je goedkope herhaalde afstandsquery’s nodig hebt of vormen die elk frame veranderen. Productie-engines houden meestal beide: gerasteriseerde meshes voor de zichtbare scène en afstandsvelden voor de ruimtelijke query’s erachter. Het artikel over SDF’s in game development zet die hybride strategie uiteen voor botsingen, fysica, AI, belichting en terrein.

Samenvatting

Een gesigneerd afstandsveld slaat vorm op als één scalaire functie met twee garanties: de grootte is de afstand tot het dichtstbijzijnde oppervlak, en het teken zegt aan welke kant je zit. Vanuit die ene representatie kun je:

  1. rays marchen met door afstand geleide veilige stappen
  2. scènes opbouwen met min en max
  3. oppervlaktenormalen schatten uit de gradiënt
  4. coördinaten transformeren en herhalen om complexe layouts te bouwen

De meeste geavanceerde SDF-technieken zijn variaties op één lus: evalueer het veld, gebruik het resultaat, herhaal. Zodra het contract duidelijk is, worden de gelinkte artikelen variaties op datzelfde idee.