Aller au contenu principal

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​

PrimitiveParamètresRemarques
spherer (rayon)Forme la plus simple
ellipsoida (rayons des demi-axes sous forme de vec3)SDF approximative ; précise pour les forces
boxb (demi-dimensions sous forme de vec3)Alignée sur les axes
rounded_boxb (demi-dimensions), r (rayon des coins)Étendue totale = b + r
box_frameb (demi-dimensions), e (épaisseur des arêtes)Contour en fil de fer d'une boîte
planen (normale sous forme de vec3), h (décalage le long de n)Demi-espace infini ; n doit être normalisé

Capsules et cylindres​

PrimitiveParamètresRemarques
capsulea, b (positions des extrémités sous forme de vec3), r (rayon)Extrémités hémisphériques
capsule_verticalh (demi-hauteur), r (rayon)Raccourci pour l'axe Y
capped_cylindera, b (extrémités de l'axe sous forme de vec3), r (rayon)Extrémités plates
capped_cylinder_verticalh (demi-hauteur), r (rayon)Raccourci pour l'axe Y

Famille des tores​

PrimitiveParamètresRemarques
torusr1 (rayon majeur), r2 (rayon du tube)Beignet dans le plan XZ
capped_torussc (direction de la calotte sous forme de vec2), r1, r2Arc ; sc = (cos θ, sin θ)
linkle (demi-longueur), r1 (rayon de l'anneau), r2 (rayon du tube)Forme de maillon de chaîne

Cônes​

PrimitiveParamètresRemarques
conec (angle sous forme de vec2 (sin α, cos α)), h (hauteur)Cône infini tronqué à la pointe
capped_conea, b (extrémités sous forme de vec3), r1 (rayon de la base), r2 (rayon du sommet)Tronc de cône
rounded_conea, b (extrémités sous forme de vec3), r1, r2Tronc de cône à calottes sphériques
solid_anglec (angle sous forme de vec2), r (rayon)Sphère découpée par un cône

Formes exotiques​

PrimitiveParamètresRemarques
vesica_revolveda, b (axe sous forme de vec3), w (largeur)Forme de lentille
rhombusla, lb (demi-diagonales), h (demi-hauteur d'extrusion), r (arrondi)Section en losange
pyramidh (hauteur)Base carrée
octahedronr (rayon inscrit)Octaèdre régulier
hexagonal_prismr (rayon circonscrit), h (demi-hauteur)Le long de Y
triangular_prismw (demi-largeur), h (demi-hauteur)Le long de Z
Types de paramètres

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.