Catalogue des formes SDF
Référence visuelle : Inigo Quilez — 3D Distance Functions
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 devient l'entrée d'une courbe de force : plus on est près de la surface, plus la force est grande ; au-delà, il n'y a aucune force.
Les formes SDF sont utilisées par le module Navigation (forme de bulle).
Une forme est décrite par une primitive et un bloc parameters :
{
"shape": {
"primitive": "sphere",
"parameters": { "r": 0.05 }
}
}
Formes de base
| Primitive | Paramètres | Remarques |
|---|---|---|
sphere | r (rayon) | Forme la plus simple |
ellipsoid | a (rayons des demi-axes sous forme de vec3) | SDF approximative ; précise pour les forces |
box | b (demi-dimensions sous forme de vec3) | Alignée sur les axes |
rounded_box | b (demi-dimensions), r (rayon des coins) | Étendue totale = b + r |
box_frame | b (demi-dimensions), e (épaisseur des arêtes) | Contour en fil de fer d'une boîte |
plane | n (normale sous forme de vec3), h (décalage le long de n) | Demi-espace infini ; n doit être normalisé |
Capsules et cylindres
| Primitive | Paramètres | Remarques |
|---|---|---|
capsule | a, b (positions des extrémités sous forme de vec3), r (rayon) | Extrémités hémisphériques |
capsule_vertical | h (demi-hauteur), r (rayon) | Raccourci pour l'axe Y |
capped_cylinder | a, b (extrémités de l'axe sous forme de vec3), r (rayon) | Extrémités plates |
capped_cylinder_vertical | h (demi-hauteur), r (rayon) | Raccourci pour l'axe Y |
Famille des tores
| Primitive | Paramètres | Remarques |
|---|---|---|
torus | r1 (rayon majeur), r2 (rayon du tube) | Beignet dans le plan XZ |
capped_torus | sc (direction de la calotte sous forme de vec2), r1, r2 | Arc ; sc = (cos θ, sin θ) |
link | le (demi-longueur), r1 (rayon de l'anneau), r2 (rayon du tube) | Forme de maillon de chaîne |
Cônes
| Primitive | Paramètres | Remarques |
|---|---|---|
cone | c (angle sous forme de vec2 (sin α, cos α)), h (hauteur) | Cône infini tronqué à la pointe |
capped_cone | a, b (extrémités sous forme de vec3), r1 (rayon de la base), r2 (rayon du sommet) | Tronc de cône |
rounded_cone | a, b (extrémités sous forme de vec3), r1, r2 | Tronc de cône à calottes sphériques |
solid_angle | c (angle sous forme de vec2), r (rayon) | Sphère découpée par un cône |
Formes exotiques
| Primitive | Paramètres | Remarques |
|---|---|---|
vesica_revolved | a, b (axe sous forme de vec3), w (largeur) | Forme de lentille |
rhombus | la, lb (demi-diagonales), h (demi-hauteur d'extrusion), r (arrondi) | Section en losange |
pyramid | h (hauteur) | Base carrée |
octahedron | r (rayon inscrit) | Octaèdre régulier |
hexagonal_prism | r (rayon circonscrit), h (demi-hauteur) | Le long de Y |
triangular_prism | w (demi-largeur), h (demi-hauteur) | Le long de Z |
Les paramètres scalaires (r, h, e, etc.) sont de simples nombres.
Les paramètres vectoriels (a, b, n) sont des objets : { "x": 0.0, "y": 0.0, "z": 0.0 }.
Les paramètres vec2 (c, sc) sont des objets : { "x": 0.707, "y": 0.707 }.
Exemples de JSON
Sphère :
{ "primitive": "sphere", "parameters": { "r": 0.05 } }
Ellipsoïde (plus large selon X/Z) :
{ "primitive": "ellipsoid", "parameters": { "a": { "x": 0.06, "y": 0.03, "z": 0.06 } } }
Boîte :
{ "primitive": "box", "parameters": { "b": { "x": 0.04, "y": 0.02, "z": 0.04 } } }
Boîte arrondie :
{ "primitive": "rounded_box", "parameters": { "b": { "x": 0.30, "y": 0.02, "z": 0.30 }, "r": 0.01 } }
Capsule :
{
"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 +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é (tronc de cône) :
{
"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 bascule sur une évaluation de type sphère, basée sur la distance à l'origine.