SDF-模具目录
视觉参考: 伊尼戈·奎莱斯 — 3D 距离函数
什么是带符号距离函数(SDF)?
一个带符号的距离函数可计算空间中任意一点到 该形状最近表面之间的距离——在内部为负值,在表面上为零, 在外部为正值。该距离将作为力曲线的输入:离表面越近, 作用力越大;距离越远,则不产生作用力。
SDF 形式由导航模块(气泡形式)使用。
一个形式由一个 primitive 以及一个 parameters-块描述:
{
"shape": {
"primitive": "sphere",
"parameters": { "r": 0.05 }
}
}
基本形式
| 原始的 | 参数 | 注意事项 |
|---|---|---|
sphere | r (半径) | 最简单的形式 |
ellipsoid | a (哈尔巴赫半径作为 vec3) | 近似SDF;适用于力 |
box | b (半轴伸长率以 vec3 表示) | 轴平行 |
rounded_box | b (半扩展), r (拐角半径) | 总膨胀量 = b + r |
box_frame | b (半扩展), e (坎滕迪克) | 一个盒子的金属网轮廓 |
plane | n (法线向量 vec3), h (沿...偏移 n) | 无穷半空间; n 必须恢复正常 |
胶囊和圆柱体
| 原始的 | 参数 | 注意事项 |
|---|---|---|
capsule | a, b (端点位置以 vec3 形式表示), r (半径) | 半球形盖帽 |
capsule_vertical | h (半高), r (半径) | Y轴的简写形式 |
capped_cylinder | a, b (轴端点作为 vec3), r (半径) | 平头端盖 |
capped_cylinder_vertical | h (半高), r (半径) | Y轴的简写形式 |
托鲁斯家族
| 原始的 | 参数 | 注意事项 |
|---|---|---|
torus | r1 (主半径), r2 (管半径) | XZ平面上的环形结构 |
capped_torus | sc (方向向量 vec2), r1, r2 | 博根; sc = (cos θ, sin θ) |
link | le (半身像), r1 (环半径), r2 (管半径) | 链节形状 |
凯格尔
| 原始的 | 参数 | 注意事项 |
|---|---|---|
cone | c (角度作为 vec2 (sin α, cos α)), h (高度) | 顶端被截断的无穷锥 |
capped_cone | a, b (端点为 vec3), r1 (基半径), r2 (尖端半径) | 截头圆柱体 |
rounded_cone | a, b (端点为 vec3), r1, r2 | 带球形帽的截头圆柱体 |
solid_angle | c (角度以 vec2 为单位), r (半径) | 被圆锥体截断的球体 |
奇异的形态
| 原始的 | 参数 | 注意事项 |
|---|---|---|
vesica_revolved | a, b (轴作为 vec3), w (Breite) | Linsenform |
rhombus | la, lb (半对角线), h (挤出件的半高), r (Abrundung) | 菱形横截面 |
pyramid | h (高度) | 二次基 |
octahedron | r (内切圆半径) | 正八面体 |
hexagonal_prism | r (圆周半径), h (半高) | 沿Y轴 |
triangular_prism | w (半宽), h (半高) | 沿着Z |
参数类型
Skalare 参数 (r, h, e 等)都是简单的数值。
向量参数(a, b, n) 是对象: { "x": 0.0, "y": 0.0, "z": 0.0 }.
Vec2-Parameter (c, sc) 是对象: { "x": 0.707, "y": 0.707 }.
JSON示例
库格尔:
{ "primitive": "sphere", "parameters": { "r": 0.05 } }
椭球体(在X和Z方向上更宽):
{ "primitive": "ellipsoid", "parameters": { "a": { "x": 0.06, "y": 0.03, "z": 0.06 } } }
框:
{ "primitive": "box", "parameters": { "b": { "x": 0.04, "y": 0.02, "z": 0.04 } } }
圆角框:
{ "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
}
}
平面(沿+X方向的边界):
{ "primitive": "plane", "parameters": { "n": { "x": 1.0, "y": 0.0, "z": 0.0 }, "h": 0.0 } }
环面:
{ "primitive": "torus", "parameters": { "r1": 0.08, "r2": 0.02 } }
截锥体(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
}
}
如果指定了不受支持的基元,该服务将根据 到原点的距离,采用类似球面的计算方式。