SDF-Formenkatalog
Visuelle Referenz: Inigo Quilez — 3D Distance Functions
Was ist eine signierte Distanzfunktion (SDF)?
Eine signierte Distanzfunktion liefert den Abstand von einem beliebigen Punkt im Raum zur nächstgelegenen Oberfläche einer Form — negativ im Inneren, null auf der Oberfläche, positiv außerhalb. Dieser Abstand wird zur 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
| Primitive | Parameter | Hinweise |
|---|---|---|
sphere | r (Radius) | Einfachste Form |
ellipsoid | a (Halbachsenradien als vec3) | Näherungs-SDF; genau für Kräfte |
box | b (Halbausdehnungen als vec3) | Achsenparallel |
rounded_box | b (Halbausdehnungen), r (Eckenradius) | Gesamtausdehnung = b + r |
box_frame | b (Halbausdehnungen), e (Kantendicke) | Drahtgitter-Umriss einer Box |
plane | n (Normalenvektor vec3), h (Versatz entlang n) | Unendlicher Halbraum; n muss normalisiert sein |
Kapseln und Zylinder
| Primitive | Parameter | Hinweise |
|---|---|---|
capsule | a, b (Endpunktpositionen als vec3), r (Radius) | Halbkugelförmige Kappen |
capsule_vertical | h (Halbhöhe), r (Radius) | Kurzform für die Y-Achse |
capped_cylinder | a, b (Achsenendpunkte als vec3), r (Radius) | Flache Endkappen |
capped_cylinder_vertical | h (Halbhöhe), r (Radius) | Kurzform für die Y-Achse |
Torusfamilie
| Primitive | Parameter | Hinweise |
|---|---|---|
torus | r1 (Hauptradius), r2 (Röhrenradius) | Ringform in der XZ-Ebene |
capped_torus | sc (Kappenrichtung als vec2), r1, r2 | Bogen; sc = (cos θ, sin θ) |
link | le (Halblänge), r1 (Ringradius), r2 (Röhrenradius) | Kettenglied-Form |
Kegel
| Primitive | Parameter | Hinweise |
|---|---|---|
cone | c (Winkel als vec2 (sin α, cos α)), h (Höhe) | Unendlicher Kegel, an der Spitze abgeschnitten |
capped_cone | a, b (Endpunkte als vec3), r1 (Basisradius), r2 (Spitzenradius) | Kegelstumpf |
rounded_cone | a, b (Endpunkte als vec3), r1, r2 | Kegelstumpf mit kugelförmigen Kappen |
solid_angle | c (Winkel als vec2), r (Radius) | Kugel, durch einen Kegel geschnitten |
Exotische Formen
| Primitive | Parameter | Hinweise |
|---|---|---|
vesica_revolved | a, b (Achse als vec3), w (Breite) | Linsenform |
rhombus | la, lb (Halbdiagonalen), h (Halbhöhe der Extrusion), r (Abrundung) | Rautenförmiger Querschnitt |
pyramid | h (Höhe) | Quadratische Basis |
octahedron | r (Inkreisradius) | Regelmäßiges Oktaeder |
hexagonal_prism | r (Umkreisradius), h (Halbhöhe) | Entlang Y |
triangular_prism | w (Halbbreite), h (Halbhöhe) | Entlang Z |
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 } } }
Box:
{ "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 +X):
{ "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.