Catalogue des formes SDF
Ressources visuelles : Inigo Quilez — Fonctions de distance en 3D
Qu'est-ce que le SDF ?
La fonction de distance signéerenvoie la distance entre un point quelconque de l'espace et la surface la plus proche de la forme. Elle estnégativeà l'intérieur,nullesur la surface etpositiveà l'extérieur. Cette distance sert d'entrée à la courbe de force : plus on se rapproche de la surface, plus la force est importante, et plus on s'en éloigne, plus la force tend vers zéro.
La forme SDF est utilisée dans le module Navigation (forme en bulle).
La forme est primitive et parameters Il est écrit sous forme de blocs :
{
"shape": {
"primitive": "sphere",
"parameters": { "r": 0.05 }
}
}
Formes de base
| Primitive | Paramètres | Remarques |
|---|---|---|
sphere | r(rayon) | La forme la plus simple |
ellipsoid | a(rayon du demi-axe sous forme de vec3) | SDF approximative. Précision suffisante pour le calcul des forces |
box | b(demi-extension sous forme de vec3) | Parallélisme des axes |
rounded_box | b(demi-extension),r(rayon de l'angle) | Dimensions totales = b + r |
box_frame | b(demi-extension),e(Épaisseur des bords) | Contour filaire de la boîte |
plane | n(normale vec3),h(n (décalage de direction) | Un demi-espace infini.n doit être normalisé |
Capsules et cylindres
| Primitive | Paramètres | Remarques |
|---|---|---|
capsule | a,b(position des sommets, vec3),r(rayon) | Capuchon hémisphérique |
capsule_vertical | h(demi-hauteur),r(rayon) | Abréviation de l'axe Y |
capped_cylinder | a,b(extrémité de l'axe, vec3),r(rayon) | Capuchon à face plane |
capped_cylinder_vertical | h(demi-hauteur),r(rayon) | Abréviation de l'axe Y |
Système torique
| Primitive | Paramètres | Remarques |
|---|---|---|
torus | r1(rayon principal),r2(rayon du tube) | Forme de beignet sur le plan XZ |
capped_torus | sc(direction de la casquette, vec2),r1,r2 | Arc.sc = (cos θ, sin θ) |
link | le(demi-longueur),r1(rayon de l'anneau),r2(rayon du tube) | Forme des maillons de la chaîne |
cône
| Primitive | Paramètres | Remarques |
|---|---|---|
cone | c(angle, vec2 (sin α, cos α)),h(Hauteur) | Cône infini tronqué à sa pointe |
capped_cone | a,b(point d'extrémité, vec3),r1(rayon de la base),r2(rayon supérieur) | tronc de cône |
rounded_cone | a,b(point d'extrémité, vec3),r1,r2 | un tronc de cône surmonté d'un capuchon sphérique |
solid_angle | c(angle, vec2),r(rayon) | Sphère découpée par un cône |
Formes particulières
| Primitive | Paramètres | Remarques |
|---|---|---|
vesica_revolved | a,b(axe, vec3),w(largeur) | Forme de la lentille |
rhombus | la,lb(demi-diagonale),h(demi-hauteur de l'extrusion),r(Arrondi) | section en losange |
pyramid | h(Hauteur) | une base carrée |
octahedron | r(rayon d'encerclement) | Octaèdre régulier |
hexagonal_prism | r(rayon extérieur),h(demi-hauteur) | Direction de l'axe Y |
triangular_prism | w(demi-largeur),h(demi-hauteur) | Dans la direction de l'axe Z |
Paramètres scalaires (r,h,e (etc.) sont de simples valeurs numériques.
Les paramètres vectoriels (a,b,n) est un objet :{ "x": 0.0, "y": 0.0, "z": 0.0 }。
Paramètres Vec2 (c,sc) est un objet :{ "x": 0.707, "y": 0.707 }。
Exemple de JSON
Ballon :
{ "primitive": "sphere", "parameters": { "r": 0.05 } }
Ellipsoïde(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 } } }
Encadré aux coins arrondis :
{ "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(limite le long de l'axe +X) :
{ "primitive": "plane", "parameters": { "n": { "x": 1.0, "y": 0.0, "z": 0.0 }, "h": 0.0 } }
Toroïde :
{ "primitive": "torus", "parameters": { "r1": 0.08, "r2": 0.02 } }
Cône à sommet(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 spécifiée, le service recourt à une approximation sphérique basée sur la distance par rapport à l'origine.