ナビゲーション
ナビゲーションモジュールを使用すると、Inverse3 カーソルでアプリケーションの ワークスペース内を移動することができます。これは、レート制御移動(rate-control locomotion)または「ゲームパッドのようなドリフト(gamepad-like drift)」とも呼ばれます。 カーソルが物理的なワークスペースの端で固い壁にぶつかる代わりに、 仮想的な中心からの距離がワークスペース全体を移動させる速度にマッピングされる「ソフトシェル(soft shell)」領域に入ります。 カーソルを遠くへ押せば押すほど、シーンのスクロール速度は速くなります。
デフォルト(現時点では唯一の)動作は、バブルナビゲーションです。バブルの形状は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> | ナビゲーションを停止 |
バブルの形状一覧
バブルのデッドゾーンは、符号付き距離関数(signed-distance-function、SDF)の形で定義されます。 形状によってナビゲーションの感触が異なります。快適な長方形の休憩エリアには角丸長方形(デフォルト)、等方性ドリフトには球体(sphere)、特定の軸を優先させる場合は楕円体(ellipsoid)、通路にはカプセル(capsule)を使用します。
丸みを帯びた四角形(デフォルト)
デフォルトのデッドゾーンは、深さよりもわずかに高く、やや平らな形状をしており、Inverse3 およびMInverse の両方で快適な使用感を得られるよう調整されています:
{
"shape": {
"primitive": "rounded_box",
"parameters": { "b": { "x": 0.05, "y": 0.02, "z": 0.03 }, "r": 0.01 }
}
}
ku — 等方性ドリフト
{
"shape": {
"primitive": "sphere",
"parameters": { "r": 0.05 }
}
}
楕円体 — X/Z方向がY方向よりも広い
水平ドリフトが垂直ドリフトよりも緩やかに感じられるようにしたい場合に使用します:
{
"shape": {
"primitive": "ellipsoid",
"parameters": { "a": { "x": 0.06, "y": 0.03, "z": 0.06 } }
}
}
カプセル — 細長い通路
両端点 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"
}
}
}
}
]
}
速度曲線
速度範囲の距離は、イージング曲線を通じてマッピングされた後、ワークスペースの速度に変換されます。ユーザーがシェル内側へさらに深く押し込んだ際に、シーンがどのように加速するかを希望するかに合わせて、適切なイージングを選択してください。
velocity_ease | 雰囲気 | 使用時期 |
|---|---|---|
linear | 一定の増加 | 予測可能で無難なデフォルト値 |
quadratic_in | ゆっくりとしたスタート、素早い押し出し | 表面付近では精度が高く、長距離移動が速い |
cubic_in | 非常に遅いスタート | 非常に精密で、長距離移動時には徐々に加速する |
sine_out | 滑らかで素早いスタート、外周付近で緩やかになる | 反応が速く、上限が緩やかに設定される |
quadratic_out | 加速が速く、長距離走行でも快適 | 素早い微調整、快適な巡航 |
{ "velocity_ease": "quadratic_in", "max_velocity": 1.5 }
中心動作
バブルの中心には4つのフィールド(position, relative, follow, speed)で構成されるネスト center オブジェクトを通じて設定します。これは center, center_enabled, center_mode, center_drift_speed以前の平面構造に代わって構成されています。
{
"center": {
"position": { "x": 0.0, "y": 0.0, "z": 0.0 },
"relative": true,
"follow": false,
"speed": 0.02
}
}
中心が固定される位置
positionと relativeは、アクティブ化時の初期中心位置を制御します:
relative | positionの意味 |
|---|---|
true (デフォルト値) | positionは カーソルからのオフセットです。当初の焦点は cursor + positionです。デフォルト値 (0, 0, 0)裏面のバブルは、正確にその位置に生成されます。 |
false | positionは アプリケーション空間の原点です。入力時にはマウント空間に変換され、出力時には再びアプリケーション空間に変換されるため、往復変換後も値は一致します。 |
その後、重心が移動する仕組み
バブルが有効になった後 followわあ speedは、各ティックごとの動作を制御します:
follow | speed | 動作 | 以前の同等設定 |
|---|---|---|---|
false (デフォルト値) | 無視された | 中心は初期化された位置のまま維持されます —固定中心。 | center_mode: "fixed" |
true | > 0 | カーソルが内部にある間、中心は speed m/sの速度でカーソルのほうへドリフトします。 | center_mode: "auto_follow" (center_drift_speed (使用) |
true | 0.0 | 各マティックは中心が広いため、その位置へ即座に移動します――まるで瞬間移動のような感覚です。 | center_mode: "track_cursor" |
中心動作のデフォルト値は、現在 固定(follow = false)です。以前のバージョンでは、デフォルトでカーソル方向にドリフト(auto_follow)しました。以前のドリフト動作を復元するには、 center.follow = trueに設定し、 center.speedを移行する center_drift_speed 値に合わせて調整してください。
follow = trueまた、カーソルが外周の境界線を越えると、 speed…にかかわらず、中心はカーソルの動きに合わせて移動し、バブルをカーソルの周囲に維持して、カーソルが外れないようにします。
衝突時の応答
バブルは collision_detection.force_thresholdを超える外部からのカーサー力に反応します:
- 速度域が一時的に 膨張します(最大
velocity_zone_widthのcollision_detection.inflate_ratio(腹部まで)。 これにより、ユーザーが障害物の周囲で操作できる余裕のあるスペースが広がります。 collision_detection.enabledかtrue(デフォルト設定)の場合、バブルの中心は衝突力の方向にずれることはありません。 これにより、ユーザーが作業領域を固い壁の方へ引き寄せることを防ぎます。
衝突検出では、閾値付近での点滅を防ぐために ヒステリシスを使用します:
衝突が一度有効になると、 |ext_force|が次の乗数の下限を下回るまで、アクティブな状態を維持します。
collision_detection.force_threshold × collision_detection.exit_ratio.
exit_ratioを下げると、ヒステリシス区間が広がり(衝突がより長く維持され)、 1.0に設定すると、ヒステリシスが無効になり、単一のしきい値が使用されます。
{
"collision_detection": {
"enabled": true,
"force_threshold": 0.5,
"inflate_ratio": 2.0,
"exit_ratio": 0.7
}
}
パラメータの参照
最も頻繁に調整する項目
| パラメータ | デフォルト値 | 説明 |
|---|---|---|
shape | {rounded_box, r=0.01, b=(0.05,0.02,0.03)} | デッドゾーンを定義するSDF形式 |
velocity_zone_width | 0.03 m | 速度制御(レート制御)シェルの厚さ |
max_velocity | 0.5 分/秒 | 最大ナビゲーション速度 |
velocity_ease | "quadratic_in" | 距離→速度のイージング曲線 |
center.follow | false | 中心がカーソルを追跡しているかどうか |
center.speed | 0.02 分/秒 | follow = true時のドリフト速度 |
パラメータ一覧
| フィールド | タイプ | デフォルト値 | 説明 |
|---|---|---|---|
center.position | vec3 | (0, 0, 0) | 初期の中心 — relative = true実行時はカーソルからのオフセット、 false実行時は、アプリ空間の絶対座標 |
center.relative | bool | true | true: positionは、カーソルからのオフセットです。 false: アプリ空間における絶対座標であり、境界でマウント空間に変換されます |
center.follow | bool | false | false: 中心は初期化された位置に固定されます。 true: 中心がカーソルの動きに合わせて移動します |
center.speed | float | 0.02 | follow = true時のドリフト速度(m/s)。 0.0その場合、各ティックごとにカーソルに即座に合わせられます |
shape | 形状 | {rounded_box, r=0.01, b=(0.05,0.02,0.03)} | デッドゾーン SDF 形状 |
velocity_zone_width | float | 0.03 | 速度制御シェルの幅(m) |
max_velocity | float | 0.5 | 最大ナビゲーション速度(m/s) |
velocity_ease | ストリング | "quadratic_in" | 距離 → 速度のイージング |
reset_velocity_on_entry | bool | true | カーソルが速度範囲に再び入ると、累積速度を0にリセットします |
bump_width | float | 0.005 | 表面の触覚バンプ(m) |
bump_stiffness | float | 200.0 | 表面バンプのばね定数 |
spring_inner | float | 0.0 | バブル中心のスプリング |
spring_surface | float | 10.0 | 表面のバネ |
spring_outer | float | 15.0 | 外周境界のばね |
wall_stiffness | float | 700.0 | 外周境界を越えたハードウォールスプリング |
damping_inner | float | 0.1 | 中心の減衰 |
damping_surface | float | 4.0 | 表面の減衰 |
damping_outer | float | 7.0 | 外周境界の減衰 |
rotation_enabled | bool | false | ワークスペースの回転をナビゲーションの方向に反映します |
scale_enabled | bool | false | ワークスペースのスケールをナビゲーションの速度に反映します |
collision_detection.enabled | bool | true | 衝突方向へのナビゲーションをブロックします |
collision_detection.force_threshold | float | 1.0 | 衝突に突入するための外力の大きさ(N) |
collision_detection.inflate_ratio | float | 2.0 | 衝突時の速度範囲の幅に掛ける倍率(必ず 1.0 以上) |
collision_detection.exit_ratio | float | 0.7 | ヒステリシス比 — |ext_force| < force_threshold × exit_ratioになるまで衝突状態を維持します。範囲 (0, 1]; 1.0この場合、ヒステリシスは無効になります |
以下の 2 つの機能グループは、バージョン 3.6 に向けて実装が再構成される間、バージョン 3.5 の JSON スキーマから除外されます:
- アバター境界のクランプ:
avatar_boundary_enabled,avatar_boundary,avatar_boundary_hysteresisフィールド。 - ワークスペースの境界設定:
workspace_bounded,workspace_transition_speed,workspace_transition_easeフィールド。
ティックコードは依然としてデフォルトでコンパイルおよび実行されますが、クライアントはHTTPやWebSocketを介してそのフィールドを読み書きすることはできません。3.6では、アバター境界がバブルオブジェクトと同等の最上位 bounds 項目として再度提供され、配置変換(placement transform)が適用されます。ワークスペースのバウンディングは、中心ジッター(centre-jitter)の調査が完了次第、再度提供される予定です。
検証ルール
velocity_zone_width > 00 ≤ bump_width < velocity_zone_widthmax_velocity > 0bump_stiffness ≥ 0spring_inner ≥ 0そしてspring_inner ≤ spring_surface ≤ spring_outerwall_stiffness ≥ 0damping_inner ≥ 0そしてdamping_inner ≤ damping_surface ≤ damping_outercollision_detection.force_threshold > 0collision_detection.inflate_ratio ≥ 1.0collision_detection.exit_ratioは(0, 1]範囲内である必要がありますcenter.speed ≥ 0
誤ったパラメータが含まれている POST または configure.navigation リクエストは拒否され、 invalid-value イベントが発生します。以前の設定は引き続き有効なままとなります。
イベント
| イベント名 | 発生時期 |
|---|---|
navigation-started | デバイスでナビゲーションが有効になったとき |
navigation-updated | ナビゲーションの構成がすでにアクティブな状態で更新される場合 |
navigation-stopped | ナビゲーションが停止したとき(明示的な無効化、 DELETE, またはセッション終了) |
invalid-value | ナビゲーションの構成が検証の結果、却下された場合 |
既知の制限事項
- 3.5 における非表示のワークスペース境界およびアバター境界:これら 2 つの機能グループは、3.6 に向けて再構成されている間、JSON スキーマから除外されています。パラメータのリファレンス項目の下にある上記の注記をご確認ください。
- 不均一なスケール + 回転:
rotation_enabledわあscale_enabledすべてがオンになっていると、速度の方向が若干不正確になります。回転はスケール軸には適用されません。 - デバイスごとのサイズスケーリング:バブルのサイズ(半径、領域の幅)は、デバイスの物理的なスケーリング係数によって調整されません。MInverseとInverse3は同じ絶対サイズを使用するため、デバイスによって見え方が異なる場合があります。