SDF-Formkatalog
Visuelle Referenz: Inigo Quilez — 3D-Abstandsfunktionen
Was ist ein SDF?
Eine vorzeichenbehaftete Abstandsfunktion gibt den Abstand eines beliebigen Punktes im Raum zur nächstgelegenen Oberfläche einer Form zurück – negativ innerhalb der Oberfläche, null auf der Oberfläche, positiv außerhalb. Dieser Abstand dient als Eingabe für eine Kraftkurve: Je näher an der Oberfläche, desto größer die Kraft; je weiter entfernt, desto geringer die Kraft.
SDF-Formen werden vom Navigations modul verwendet (Blasenform).
Eine Form wird durch eine primitive und eine parameters Block:
{
"shape": {
"primitive": "sphere",
"parameters": { "r": 0.05 }
}
}
Grundformen
| Primitiv | Parameter | Anmerkungen |
|---|---|---|
sphere | r (Radius) | Einfachste Form |
ellipsoid | a (Halbachsenradien als vec3) | Ungefähre SDF; genau bei Kräfte |
box | b (Halb-Extents als vec3) | Achsenparallel |
rounded_box | b (Halbformate), r (Kurvenradius) | Gesamtumfang = b + r |
box_frame | b (Halbformate), e (Kantenstärke) | Drahtmodell einer Schachtel |
plane | n (normal vec3), h (Versatz entlang n) | Unendlicher Halbraum; n muss normalisiert werden |
Kapseln und Zylinder
| Primitiv | Parameter | Anmerkungen |
|---|---|---|
capsule | a, b (Endpunktpositionen als vec3), r (Radius) | Halbkugelförmige Kappen |
capsule_vertical | h (halbe Höhe), r (Radius) | Kurzform für die Y-Achse |
capped_cylinder | a, b (Achsenendpunkte als vec3), r (Radius) | Flache Endkappen |
capped_cylinder_vertical | h (halbe Höhe), r (Radius) | Kurzform für die Y-Achse |
Torus-Familie
| Primitiv | Parameter | Anmerkungen |
|---|---|---|
torus | r1 (Hauptradius), r2 (Rohrradius) | Donut in der XZ-Ebene |
capped_torus | sc (Richtung des Vektors als vec2), r1, r2 | Bogen; sc = (cos θ, sin θ) |
link | le (Halbfigur), r1 (Ringradius), r2 (Rohrradius) | Form eines Maschendrahtzauns |
Kegel
| Primitiv | Parameter | Anmerkungen |
|---|---|---|
cone | c (Winkel als vec2 (sin α, cos α)), h (Höhe) | Unendlicher Kegel, an der Spitze abgeschnitten |
capped_cone | a, b (Endpunkte als vec3), r1 (Grundradius), r2 (Oberradius) | Kegelstumpf |
rounded_cone | a, b (Endpunkte als vec3), r1, r2 | Kegelstumpf mit Kugelkalotten |
solid_angle | c (Winkel als vec2), r (Radius) | Eine Kugel, die von einem Kegel durchschnitten wird |
Exotische Formen
| Primitiv | Parameter | Anmerkungen |
|---|---|---|
vesica_revolved | a, b (Achse als vec3), w (Breite) | Linsenform |
rhombus | la, lb (Halbdiagonalen), h (Halbe Extrusionshöhe), r (Rundung) | Diamantquerschnitt |
pyramid | h (Höhe) | Quadratischer Sockel |
octahedron | r (Inradius) | Reguläres Oktaeder |
hexagonal_prism | r (Umfangradius), h (halbe Höhe) | Entlang Y |
triangular_prism | w (halbe Breite), h (halbe Höhe) | Entlang der Z |
Skalarparameter (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 }.
JSON-Beispiele
Sphäre:
{ "primitive": "sphere", "parameters": { "r": 0.05 } }
Ellipsoid (breiter in X/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 } } }
Abgerundetes Kästchen:
{ "primitive": "rounded_box", "parameters": { "b": { "x": 0.30, "y": 0.02, "z": 0.30 }, "r": 0.01 } }
Kurzfassung:
{
"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 (Grenze 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 } }
Abgeschnittener Kegel (Kegelstumpf):
{
"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 eine nicht unterstützte Primitive übergeben, greift der Dienst auf eine kugelartige Auswertung des Abstands vom Ursprung zurück.