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 系列
| 原始的 | 参数 | 注释 |
|---|---|---|
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 (宽度) | 镜片形状 |
rhombus | la, lb (半对角线), h (半高挤压), r (四舍五入) | 钻石横截面 |
pyramid | h (高度) | 方形底座 |
octahedron | r (内半径) | 正八面体 |
hexagonal_prism | r (圆周半径), h (半高) | 沿Y |
triangular_prism | w (半宽), h (半高) | 沿着Z |
参数类型
标量参数(r, h, e(……等)是纯数字。
向量参数(a, b, n) 是对象: { "x": 0.0, "y": 0.0, "z": 0.0 }.
Vec2 参数 (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 } }
摘要:
{
"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 } }
截锥体:
{
"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
}
}
如果提供了不受支持的原始数据,该服务将回退到 以原点为中心的球面式计算。