Catalogue des formes SDF
Référence visuelle : Inigo Quilez — Fonctions de distance 3D
Qu'est-ce qu'un SDF ?
Une fonction de distance signée renvoie la distance entre un point quelconque de l'espace et la surface la plus proche d'une forme — négative à l'intérieur, nulle sur la surface, positive à l'extérieur. Cette distance sert de donnée d'entrée à une courbe de force : plus on est proche de la surface, plus la force est grande ; plus on s'en éloigne, plus elle est nulle.
Les formes SDF sont utilisées par le module de navigation (forme de bulle).
Une forme est décrite par un primitive et un parameters bloc :
{
"shape": {
"primitive": "sphere",
"parameters": { "r": 0.05 }
}
}
Formes de base
| Primitif | Paramètres | Remarques |
|---|---|---|
sphere | r (rayon) | La forme la plus simple |
ellipsoid | a (rayons des demi-axes sous forme de vec3) | SDF approximative ; précise pour les forces |
box | b (demi-intervalles sous forme de vec3) | Aligné sur l'axe |
rounded_box | b (demi-feuilles), r (rayon de courbure) | Superficie totale = b + r |
box_frame | b (demi-feuilles), e (épaisseur du bord) | Esquisse filaire d'une boîte |
plane | n (vec3 normal), h (décalage le long de n) | Demi-espace infini ; n doit être normalisé |
Capsules et cylindres
| Primitif | Paramètres | Remarques |
|---|---|---|
capsule | a, b (positions des extrémités sous forme de vec3), r (rayon) | Capuchons hémisphériques |
capsule_vertical | h (demi-hauteur), r (rayon) | Abréviation de l'axe des Y |
capped_cylinder | a, b (extrémités des axes sous forme de vec3), r (rayon) | Embouts plats |
capped_cylinder_vertical | h (demi-hauteur), r (rayon) | Abréviation de l'axe des Y |
Famille Torus
| Primitif | Paramètres | Remarques |
|---|---|---|
torus | r1 (rayon principal), r2 (rayon du tube) | Beignet dans le plan XZ |
capped_torus | sc (direction de cap sous forme de vec2), r1, r2 | Arc ; sc = (cos θ, sin θ) |
link | le (buste), r1 (rayon de l'anneau), r2 (rayon du tube) | Forme en mailles |
Cônes
| Primitif | Paramètres | Remarques |
|---|---|---|
cone | c (angle sous forme de vec2 (sin α, cos α)), h (hauteur) | Cône infini tronqué à son sommet |
capped_cone | a, b (points d'extrémité sous forme de vec3), r1 (rayon de la base), r2 (rayon supérieur) | tronc de cône |
rounded_cone | a, b (points d'extrémité sous forme de vec3), r1, r2 | Tronc de cône avec des calottes sphériques |
solid_angle | c (angle sous forme de vec2), r (rayon) | Sphère coupée par un cône |
Formes exotiques
| Primitif | Paramètres | Remarques |
|---|---|---|
vesica_revolved | a, b (axe sous forme de vec3), w (largeur) | Forme de la lentille |
rhombus | la, lb (demi-diagonales), h (demi-hauteur d'extrusion), r (arrondi) | Section transversale d'un diamant |
pyramid | h (hauteur) | Base carrée |
octahedron | r (rayon intérieur) | Octaèdre régulier |
hexagonal_prism | r (rayon de circonférence), h (demi-hauteur) | Le long de Y |
triangular_prism | w (demi-largeur), h (demi-hauteur) | Le long de Z |
Paramètres scalaires (r, h, e, etc.) sont des nombres simples.
Les paramètres vectoriels (a, b, n) sont des objets : { "x": 0.0, "y": 0.0, "z": 0.0 }.
Paramètres de Vec2 (c, sc) sont des objets : { "x": 0.707, "y": 0.707 }.
Exemples JSON
Sphère :
{ "primitive": "sphere", "parameters": { "r": 0.05 } }
Ellipsoïde (plus large dans les axes X et Z) :
{ "primitive": "ellipsoid", "parameters": { "a": { "x": 0.06, "y": 0.03, "z": 0.06 } } }
Encadré :
{ "primitive": "box", "parameters": { "b": { "x": 0.04, "y": 0.02, "z": 0.04 } } }
Encadré :
{ "primitive": "rounded_box", "parameters": { "b": { "x": 0.30, "y": 0.02, "z": 0.30 }, "r": 0.01 } }
Résumé :
{
"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
}
}
Plan (frontière le long de l'axe +X) :
{ "primitive": "plane", "parameters": { "n": { "x": 1.0, "y": 0.0, "z": 0.0 }, "h": 0.0 } }
Tore :
{ "primitive": "torus", "parameters": { "r1": 0.08, "r2": 0.02 } }
Cône tronqué:
{
"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
}
}
Si une primitive non prise en charge est fournie, le service utilise alors par défaut une évaluation de type sphérique basée sur la distance par rapport à l'origine.