Zum Hauptinhalt springen

SDF-Formenkatalog

Visuelle Referenz: Inigo Quilez – 3D-Abstandsfunktionen

Was ist eine signierte Distanzfunktion (SDF)?​

Eine signierte Distanzfunktion liefert den Abstand eines beliebigen Punktes im Raum zur nächstgelegenen Oberfläche einer Form – negativ im Inneren, null auf der Oberfläche, positiv außerhalb. Dieser Abstand dient als Eingabe für eine Kraftkurve: Je näher man an der Oberfläche ist, desto stärker wirkt die Kraft; weiter entfernt wirkt keine Kraft.

SDF-Formen werden vom Navigationsmodul (Blasenform) verwendet.

Eine Form wird durch ein primitive und einen parameters-Block beschrieben:

{
"shape": {
"primitive": "sphere",
"parameters": { "r": 0.05 }
}
}

Grundformen​

PrimitivParameterHinweise
spherer (Radius)Einfachste Form
ellipsoida (Halbachsenradien als vec3)Näherungs-SDF; genau für Kräfte
boxb (Halbausdehnungen als vec3)Achsenparallel
rounded_boxb (Halbausdehnungen), r (Eckenradius)Gesamtausdehnung = b + r
box_frameb (Halbausdehnungen), e (Kantendicke)Umriss einer Box aus Drahtgitter
planen (Normalenvektor vec3), h (Versatz entlang n)Unendlicher Halbraum; n muss normalisiert sein

Kapseln und Zylinder​

PrimitivParameterHinweise
capsulea, b (Endpunktpositionen als vec3), r (Radius)Halbkugelförmige Kappen
capsule_verticalh (Halbhöhe), r (Radius)Kurzform für die Y-Achse
capped_cylindera, b (Achsenendpunkte als vec3), r (Radius)Flache Endkappen
capped_cylinder_verticalh (Halbhöhe), r (Radius)Kurzform für die Y-Achse

Torus-Familie​

PrimitivParameterHinweise
torusr1 (Hauptradius), r2 (Röhrenradius)Ringform in der XZ-Ebene
capped_torussc (Kappenrichtung als vec2), r1, r2Bogen; sc = (cos θ, sin θ)
linkle (Halblänge), r1 (Ringradius), r2 (Röhrenradius)Kettenglied-Form

Kegel​

PrimitivParameterHinweise
conec (Winkel als vec2 (sin α, cos α)), h (Höhe)Unendlicher Kegel, an der Spitze abgeschnitten
capped_conea, b (Endpunkte als vec3), r1 (Grundradius), r2 (Spitzenradius)Kegelstumpf
rounded_conea, b (Endpunkte als vec3), r1, r2Kegelstumpf mit kugelförmigen Kappen
solid_anglec (Winkel als vec2), r (Radius)Kugel, von einem Kegel durchschnitten

Exotische Formen​

PrimitivParameterHinweise
vesica_revolveda, b (Achse als vec3), w (Breite)Linsenform
rhombusla, lb (Halbdiagonalen), h (Halbhöhe der Extrusion), r (Abrundung)Rautenförmiger Querschnitt
pyramidh (Höhe)Quadratische Basis
octahedronr (Inkreisradius)Regelmäßiges Oktaeder
hexagonal_prismr (Umkreisradius), h (Halbhöhe)Entlang Y
triangular_prismw (Halbbreite), h (Halbhöhe)Entlang Z
Parametertypen

Skalare Parameter (r, h, e usw.) sind einfache Zahlen. Vektorparameter (a, b, n) sind Objekte: { "x": 0.0, "y": 0.0, "z": 0.0 }. Vec2-Parameter (c, sc) sind Objekte: { "x": 0.707, "y": 0.707 }.

Beispiele mit JSON​

Kugel:

{ "primitive": "sphere", "parameters": { "r": 0.05 } }

Ellipsoid (breiter in X- und Z-Richtung):

{ "primitive": "ellipsoid", "parameters": { "a": { "x": 0.06, "y": 0.03, "z": 0.06 } } }

Kasten:

{ "primitive": "box", "parameters": { "b": { "x": 0.04, "y": 0.02, "z": 0.04 } } }

Abgerundete Box:

{ "primitive": "rounded_box", "parameters": { "b": { "x": 0.30, "y": 0.02, "z": 0.30 }, "r": 0.01 } }

Kapsel:

{
"primitive": "capsule",
"parameters": {
"a": { "x": 0.0, "y": -0.03, "z": 0.0 },
"b": { "x": 0.0, "y": 0.03, "z": 0.0 },
"r": 0.04
}
}

Ebene (Begrenzung entlang der +X-Achse):

{ "primitive": "plane", "parameters": { "n": { "x": 1.0, "y": 0.0, "z": 0.0 }, "h": 0.0 } }

Torus:

{ "primitive": "torus", "parameters": { "r1": 0.08, "r2": 0.02 } }

Kegelstumpf (Frustum):

{
"primitive": "capped_cone",
"parameters": {
"a": { "x": 0.0, "y": -0.05, "z": 0.0 },
"b": { "x": 0.0, "y": 0.05, "z": 0.0 },
"r1": 0.04, "r2": 0.01
}
}

Wird ein nicht unterstütztes Primitiv angegeben, greift der Dienst auf eine kugelähnliche Auswertung anhand des Abstands zum Ursprung zurück.