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 (幅) | レンズの形状 |
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
}
}
サポートされていないプリミティブが指定された場合、サービスは 原点からの距離に基づく球体のような評価に切り替わります。