Aller au contenu principal

Catalogue des formes SDF

Référence visuelle : Inigo Quilez — Fonctions de distance en 3D

Qu'est-ce qu'une fonction de distance signée (SDF) ?​

Une fonction de distance signée fournit 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 pour une courbe de force : plus on est proche de la surface, plus la force est forte ; plus on s'en éloigne, plus la force est nulle.

Les formes SDF sont utilisées par le module de navigation (forme en bulle).

Une forme est définie par un primitive et un parameters- Bloc décrit :

{
"shape": {
"primitive": "sphere",
"parameters": { "r": 0.05 }
}
}

Formes de base​

PrimitifParamètresRemarques
spherer (Rayon)Forme la plus simple
ellipsoida (Rayons de Halbachsen sous forme de vec3)SDF approximative ; précise pour les forces
boxb (Allongements de halba sous forme de vec3)Parallèle aux axes
rounded_boxb (allongements à mi-course), r (rayon de l'angle)Extension totale = b + r
box_frameb (allongements à mi-course), e (Kantendicke)Contour en treillis métallique d'une boîte
planen (vecteur normal vec3), h (Décalage le long de n)Demi-espace infini ; n doit être normalisé

Capsules et cylindres​

PrimitifParamètresRemarques
capsulea, b (positions des points d'extrémité sous forme de vec3), r (Rayon)Capuchons hémisphériques
capsule_verticalh (à mi-hauteur), r (Rayon)Abréviation de l'axe Y
capped_cylindera, b (extrémités des axes sous forme de vec3), r (Rayon)Embouts plats
capped_cylinder_verticalh (à mi-hauteur), r (Rayon)Abréviation de l'axe Y

Famille des tores​

PrimitifParamètresRemarques
torusr1 (rayon principal), r2 (Rayon du tube)Forme annulaire dans le plan XZ
capped_torussc (direction de la cape sous forme de vec2), r1, r2Bogen ; sc = (cos θ, sin θ)
linkle (mi-longueur), r1 (Rayon de l'anneau), r2 (Rayon du tube)Forme de maillon de chaîne

Kegel​

PrimitifParamètresRemarques
conec (Angle sous forme de vec2 (sin α, cos α)), h (Hauteur)Cône infini, tronqué à sa pointe
capped_conea, b (points d'extrémité sous forme de vec3), r1 (rayon de base), r2 (rayon de pointe)Tronc de cône
rounded_conea, b (points d'extrémité sous forme de vec3), r1, r2Tronc de cône muni de capuchons sphériques
solid_anglec (Angle sous forme de vec2), r (Rayon)Une boule traversée par un cône

Formes exotiques​

PrimitifParamètresRemarques
vesica_revolveda, b (axe de type vec3), w (Largeur)Linsenform
rhombusla, lb (demi-diagonales), h (hauteur à mi-hauteur de l'extrusion), r (Abrundung)Section transversale en forme de losange
pyramidh (Hauteur)Base quadratique
octahedronr (rayon de l'encerclement)Octaèdre régulier
hexagonal_prismr (rayon de cercle), h (à mi-hauteur)Le long de Y
triangular_prismw (demi-largeur), h (à mi-hauteur)Le long de Z
Types de paramètres

Paramètre scalaire (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 }. Vec2-Paramètre (c, sc) sont des objets : { "x": 0.707, "y": 0.707 }.

Exemples avec JSON​

Kugel :

{ "primitive": "sphere", "parameters": { "r": 0.05 } }

Ellipsoïde (plus large dans les directions 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 } } }

Boîte aux angles arrondis :

{ "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
}
}

Plan (limite 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 } }

Tronc de cône (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
}
}

Si une primitive non prise en charge est spécifiée, le service utilise une évaluation de type sphérique basée sur la distance par rapport à l'origine.