ナビゲーション
ナビゲーションモジュールを使用すると、Inverse3 でアプリケーションの ワークスペースを移動させることができます。これは、レート制御移動や「ゲームパッドのようなドリフト」と呼ばれることもあります。 カーソルが物理的なワークスペースの端にある固い壁にぶつかる代わりに、 柔らかいシェルに入り、仮想的な中心からの距離が ワークスペース全体をスライドさせる速度に変換されます。カーソルが押し込む距離が長ければ長いほど、 シーンのスクロール速度は速くなります。
主な(そして現時点では唯一の)動作は、バブルナビゲーションです。バブルの 形状はSDFプリミティブを使用して定義されます。その概念については、 「SDFとは?」を参照してください。
バブルナビゲーション — コンセプト
デバイスのマウント空間内の中心点を基点として、仮想的なバブルが形成されます。 カーソルは、3つの同心円状のゾーンを通過します:
┌──────────────────────────────────────────┐
│ WALL ZONE │ cursor beyond outer shell
│ ┌────────────────────────────────────┐ │
│ │ VELOCITY ZONE │ │ soft shell → scene moves
│ │ ┌──────────────────────────────┐ │ │
│ │ │ DEAD ZONE (inside) │ │ │ no scene movement
│ │ │ │ │ │
│ │ │ ● centre │ │ │
│ │ │ │ │ │
│ │ └──────────────────────────────┘ │ │
│ │ bubble surface │ │
│ └────────────────────────────────────┘ │
│ outer boundary │
└──────────────────────────────────────────┘
| ゾーン | カーソルの位置 | 行動 |
|---|---|---|
| デッドゾーン | バブルの中 | ナビゲーションなし。光の減衰あり。シーンを自由に操作できます。 |
| 速度制限区域 | 表面と外縁の間 | 「距離→速度」カーブは、ワークスペースをカーソルの向きに移動させます。 |
| 壁面エリア | 外縁を越えて | 硬いバネがカーソルを押し戻し、移動速度が頭打ちになる。 |
3つのゾーンすべてにスプリングダンパー式の触覚力が加わり、 表面、ドリフトシェル、そして外壁の感触が伝わってきます。
クイックスタート — バブルナビゲーションを有効にする
ナビゲーションは永続的なワンショット設定です。一度送信すれば、明示的に停止するか、サービスを再起動するか、セッションを終了するまで有効なままになります。
開始(最小設定 — デフォルトサイズの球形バブル)
- WebSocket
- HTTP
{
"inverse3": [
{
"device_id": "04C3",
"configure": {
"navigation": { "mode": "bubble" }
}
}
]
}
curl -X POST "http://localhost:10001/inverse3/04C3/config/navigation?session=:0" \
-H "Content-Type: application/json" \
-d '{"mode": "bubble"}'
ストップ
- WebSocket
- HTTP
{
"inverse3": [
{
"device_id": "04C3",
"configure": {
"navigation": { "mode": "disabled" }
}
}
]
}
curl -X DELETE "http://localhost:10001/inverse3/04C3/config/navigation?session=:0"
その他のHTTPルート
| 方法 | パス | 目的 |
|---|---|---|
GET | /{type}/{id}/config/navigation?session=<expr> | 現在のナビゲーション設定と状態 |
POST | /{type}/{id}/config/navigation?session=<expr> | ナビゲーションを開始または更新する |
DELETE | /{type}/{id}/config/navigation?session=<expr> | ナビゲーションを停止 |
バブル形状カタログ
バブルのデッドゾーンは、符号付き距離関数(SDF)形状によって定義されます。 形状が異なれば、ナビゲーションの感触も変わります。等方性のドリフトには球体、 特定の軸を優先させるには楕円体や箱型、通路にはカプセル型が用いられます。
球体(デフォルト)
{
"shape": {
"primitive": "sphere",
"parameters": { "r": 0.05 }
}
}
楕円体 — Y軸方向よりもX/Z軸方向の方が幅が広い
水平方向のドリフトを垂直方向よりも緩やかに感じさせたい場合に使用します:
{
"shape": {
"primitive": "ellipsoid",
"parameters": { "a": { "x": 0.06, "y": 0.03, "z": 0.06 } }
}
}
角が丸いボックス — 角が丸い長方形のデッドゾーン
{
"shape": {
"primitive": "rounded_box",
"parameters": { "b": { "x": 0.04, "y": 0.02, "z": 0.04 }, "r": 0.008 }
}
}
カプセル — 細長い廊下
2つの終点 a/b さらに半径 r:
{
"shape": {
"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
}
}
}
サイズ調整や動きの感覚を反映した完全な例:
{
"inverse3": [
{
"device_id": "04C3",
"configure": {
"navigation": {
"mode": "bubble",
"bubble": {
"shape": {
"primitive": "ellipsoid",
"parameters": { "a": { "x": 0.06, "y": 0.03, "z": 0.06 } }
},
"velocity_zone_width": 0.025,
"max_velocity": 1.0,
"velocity_ease": "quadratic_in",
"workspace_bounded": true
}
}
}
}
]
}
速度曲線
速度ゾーンの距離は、ワークスペースの速度に変換される前に、イージングカーブを通じてマッピングされます。ユーザーがシェルをさらに押し込むにつれて、シーンがどのように加速するかを想定して、適切なイージングを選択してください。
velocity_ease | 感じる | 使用時期 |
|---|---|---|
linear | 一定勾配 | 予想通り、良いデフォルト |
quadratic_in | 出だしはゆっくり、後半はペースを上げる | 地表付近での高精度、長ストロークでの高速動作 |
cubic_in | スタートが非常に遅かった | 非常に正確で、ストロークが長く、徐々に加速する |
sine_out | 滑らかで速いスタートを切り、外側付近でペースが横ばいになる | レスポンシブ、大文字は控えめに |
quadratic_out | 発進が速く、長距離走行も快適 | 軽快な加速、快適なクルージング |
{ "velocity_ease": "quadratic_in", "max_velocity": 1.5 }
中心モード
バブルの中心は、カーソルを追従させたり、カーソルにスナップさせたり、座標空間内で固定させたりすることができます。
center_mode | 行動 | ユースケース |
|---|---|---|
auto_follow (既定値) | カーソルの位置に向かってゆっくりと漂いながら center_drift_speed カーソルがバブルの中にあるとき | 汎用ナビゲーション — ボタンを押すたびに、中央がカーソルの下で「元の位置に戻る」 |
fixed | センターは自動的に移動することはありません | 特定の基準点を中心としたアンカーナビゲーション |
track_cursor | センターは1ティックごとにカーソルにスナップします | テレポート式の移動 — カーソルは常にバブルの中心に位置します |
{ "center_mode": "fixed" }
どのモードでも、カーソルが外側の境界を越えてしまった場合、中心がカーソルを追跡し、 バブルをカーソルの周囲に保ち、カーソルが外へ飛び出さないようにします。
ワークスペースの境界
ほとんどのデバイスには、物理的な到達範囲に制限があります。 workspace_bounded が設定されている場合、
バブルの中心はデバイスの物理的な作業領域内に保持されるため、
その結果生じるナビゲーションによって、カーソルが到達可能な範囲外に追いやられることはありません。
{ "workspace_bounded": true }
初期位置が作業領域の外側にある場合、モジュールは時間をかけてそれを
作業領域内にゆっくりと戻します(workspace_transition_speed / workspace_transition_ease)
スナップさせずに — 起動時のハプティックによる急激な動きを回避します。
アバターの境界
いつ avatar_boundary_enabled が設定されると、最終的な アバターの世界座標
(ワークスペース+カーソル)が、任意のSDF形状の内側に固定されます。
軸ごとの固定処理をスクリプトで記述することなく、
ユーザーを部屋、廊下、車両のコックピットなどの内部に収めるのに便利です。
{
"avatar_boundary_enabled": true,
"avatar_boundary": {
"primitive": "box",
"parameters": { "b": { "x": 5.0, "y": 3.0, "z": 5.0 } }
}
}
について avatar_boundary このシェイプは、バブルシェイプと同じプリミティブを受け付けます
(sphere, ellipsoid, rounded_box, capsule, box、……)。
衝突時の挙動
バブルは、外部からのカーソルによる力が collision_threshold:
- 一時的な速度制限区域 膨らむ (最大
collision_inflate_scale回velocity_zone_width) これにより、ユーザーが障害物の周りを より自由に動き回れるようになります。 - ~とともに
stop_at_collision, バブルの中心は衝突力の方向へ 移動することを拒否するため、ユーザーがワークスペースを 硬い壁にぶつけてしまうのを防ぎます。
{ "stop_at_collision": true, "collision_threshold": 0.5, "collision_inflate_scale": 2.0 }
パラメータリファレンス
最もよくチューニングされている
| パラメータ | デフォルト | 説明 |
|---|---|---|
shape | {sphere, r=0.05} | デッドゾーンを定義するSDF形状 |
velocity_zone_width | 0.03 m | 速度制御シェルの厚さ |
max_velocity | 1.0 分/秒 | 最大航行速度 |
velocity_ease | "linear" | 距離→速度のイージングカーブ |
center_mode | "auto_follow" | センターがカーソルをどのように追跡するか |
workspace_bounded | false | クランプの中心をデバイスの物理的な作業領域に合わせる |
パラメータ一覧
| フィールド | タイプ | デフォルト | 説明 |
|---|---|---|---|
center | vec3 | (0,0,0) | マウント空間における初期バブルの中心 |
shape | 形状 | {sphere, r=0.05} | デッドゾーンSDF形状 |
velocity_zone_width | float | 0.03 | 流量制御シェルの幅(m) |
max_velocity | float | 1.0 | 最大航行速度(m/s) |
velocity_ease | ストリング | "linear" | 距離→速度のイージング |
reset_velocity_on_entry | bool | true | カーソルが速度ゾーンに再進入した際、累積速度をリセットする |
bump_width | float | 0.003 | 表面の凹凸(m) |
bump_stiffness | float | 500.0 | 表面の凹凸によるばね定数 |
spring_inner | float | 4.0 | バブルセンターの春 |
spring_surface | float | 7.0 | 地表の春 |
spring_outer | float | 12.0 | 外縁の春 |
wall_stiffness | float | 700.0 | 外側の境界を越えて硬い壁に跳ね返る |
damping_inner | float | 0.2 | 中央での減衰 |
damping_surface | float | 0.7 | 表面での減衰 |
damping_outer | float | 5.0 | 外縁部での減衰 |
rotation_enabled | bool | false | ワークスペースの回転をナビゲーションの方向に適用する |
scale_enabled | bool | false | ワークスペースのスケールをナビゲーション速度に適用する |
center_mode | 列挙型 | "auto_follow" | "auto_follow" / "fixed" / "track_cursor" |
center_drift_speed | float | 0.03 | ドリフト速度 auto_follow 速度(m/s) |
workspace_bounded | bool | false | バブルの中心をデバイスの作業領域に固定する |
workspace_transition_speed | float | 1.2 | 初期クランプ遷移の速度 |
workspace_transition_ease | ストリング | "quadratic_in_out" | 初期クランプ遷移の緩和 |
stop_at_collision | bool | false | 衝突方向への移動をブロックする |
collision_threshold | float | 0.001 | 衝突を検知するための外力閾値(N) |
collision_inflate_scale | float | 2.0 | 衝突時の速度ゾーン幅の乗数 |
avatar_boundary_enabled | bool | false | アバター境界のクランプを有効にする |
avatar_boundary | 形状 | {sphere, r=0.1} | アバター位置の制約条件に対するSDF形状 |
検証ルール
velocity_zone_width > 00 ≤ bump_width < velocity_zone_widthmax_velocity > 0spring_inner ≤ spring_surface ≤ spring_outerdamping_inner ≤ damping_surface ≤ damping_outercollision_threshold > 0,collision_inflate_scale ≥ 1.0- すべての速度の値は非負である
A POST または configure.navigation 無効なパラメータを含むリクエストは拒否され、
invalid-value イベントが発生しても、以前の設定は有効なままです。
イベント
| イベント名 | いつ解雇されたのか |
|---|---|
navigation-started | デバイスでナビゲーションが有効になっています |
navigation-updated | ナビゲーションの設定が、すでにアクティブな状態で更新されます |
navigation-stopped | ナビゲーションが停止しています(明示的な無効化、 DELETE、またはセッション終了時) |
invalid-value | ナビゲーションの設定が検証で拒否されました |
既知の制限事項
- 不均一な拡大・縮小と回転: 両方が
rotation_enabledそしてscale_enabledがオンになっている場合、速度の方向がわずかに不正確になります。これは、座標軸に回転が適用されていないためです。 - ワークスペース境界での遷移:スムーズなクランプバック遷移は初期化時のみ実行されます。通常の使用中にバブルの中心がワークスペースの外へ逸脱した場合、クランプはイージングなしで即座にスナップします。
- デバイスごとのサイズ調整:バブルのサイズ(半径、ゾーン幅)は、デバイスの物理的なスケール係数に応じて調整されません。Minverse Inverse3 同じ絶対サイズがInverse3 、デバイスによって表示が異なって見える場合があります。