ナビゲーション
ナビゲーションモジュールを使用すると、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)の形状で定義されます。 形状によってナビゲーションの感触が異なります。例えば、丸みを帯びた箱型(デフォルト)は 快適な長方形の休息ゾーンとなり、球体は等方性のドリフトを、 楕円体は特定の軸を優先し、カプセル型は通路に適しています。
角丸ボックス(デフォルト)
デフォルトのデッドゾーンは、幅が深くよりわずかに高い平らな形状となっており、 Inverse3 MInverseの両方で快適に感じられるよう調整されています:
{
"shape": {
"primitive": "rounded_box",
"parameters": { "b": { "x": 0.05, "y": 0.02, "z": 0.03 }, "r": 0.01 }
}
}
球体 — 等方性ドリフト
{
"shape": {
"primitive": "sphere",
"parameters": { "r": 0.05 }
}
}
楕円体 — Y軸方向よりもX/Z軸方向の方が幅が広い
水平方向のドリフトを垂直方向よりも緩やかに感じさせたい場合に使用します:
{
"shape": {
"primitive": "ellipsoid",
"parameters": { "a": { "x": 0.06, "y": 0.03, "z": 0.06 } }
}
}
カプセル — 細長い廊下
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"
}
}
}
}
]
}
速度曲線
速度ゾーンの距離は、ワークスペースの速度に変換される前に、イージングカーブを通じてマッピングされます。ユーザーがシェルをさらに押し込むにつれて、シーンがどのように加速するかを想定して、適切なイージングを選択してください。
velocity_ease | 感じる | 使用時期 |
|---|---|---|
linear | 一定勾配 | 予想通り、良いデフォルト |
quadratic_in | 出だしはゆっくり、後半はペースを上げる | 地表付近での高精度、長ストロークでの高速動作 |
cubic_in | スタートが非常に遅かった | 非常に正確で、ストロークが長く、徐々に加速する |
sine_out | 滑らかで速いスタートを切り、外側付近でペースが横ばいになる | レスポンシブ、大文字は控えめに |
quadratic_out | 発進が速く、長距離走行も快適 | 軽快な加速、快適なクルージング |
{ "velocity_ease": "quadratic_in", "max_velocity": 1.5 }
センターの挙動
バブルの中心は、入れ子構造によって構成されています center 4つのフィールドを持つ
オブジェクト — position, relative, follow, speed — 従来のフラットな
レイアウトに代わって 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:
- 一時的な速度制限区域 膨らむ (最大
collision_detection.inflate_ratio回velocity_zone_width) これにより、ユーザーが障害物を回避するための余裕が生まれます。 - いつ
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 | (時)のドリフト速度(m/s) follow = true; 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 | カーソルが速度ゾーンに再進入した際、累積速度をリセットする |
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 ヒステリシスを無効にする |
3.5のJSONスキーマからは2つのフィーチャーグループが除外されていますが、 その実装は3.6向けに再構成されています:
- アバター境界のクランプ: フィールド
avatar_boundary_enabled,avatar_boundaryそしてavatar_boundary_hysteresis. - ワークスペースの境界: フィールド
workspace_bounded,workspace_transition_speedそしてworkspace_transition_ease.
デフォルト設定では、ティックコードはコンパイルおよび実行されますが、クライアントはHTTPやWebSocket経由でそれらのフィールドを読み書きすることはできません。バージョン3.6では、アバター境界はトップレベルとして返されます。 bounds バブルオブジェクトのピアで、完全な配置
トランスフォームが適用されたもの。ワークスペースのバウンディングは、センター・ジッターの調査が
完了次第、返されます。
検証ルール
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
A POST または configure.navigation 無効なパラメータを含むリクエストは拒否され、
invalid-value イベントが発生しても、以前の設定は有効なままです。
イベント
| イベント名 | いつ解雇されたのか |
|---|---|
navigation-started | デバイスでナビゲーションが有効になっています |
navigation-updated | ナビゲーションの設定が、すでにアクティブな状態で更新されます |
navigation-stopped | ナビゲーションが停止しています(明示的な無効化、 DELETE、またはセッション終了時) |
invalid-value | ナビゲーションの設定が検証で拒否されました |
既知の制限事項
- バージョン3.5では、ワークスペースの境界とアバターの境界が非表示になっています。これらの機能グループはJSONスキーマから削除されていますが、バージョン3.6では再構成されています。詳細は、上記の「パラメータのリファレンス」の注記を参照してください。
- 不均一な拡大・縮小と回転: 両方が
rotation_enabledそしてscale_enabledがオンになっている場合、速度の方向がわずかに不正確になります。これは、座標軸に回転が適用されていないためです。 - デバイスごとのサイズ調整:バブルのサイズ(半径、ゾーン幅)は、デバイスの物理的なスケール係数に応じて調整されません。MInverse Inverse3 同じ絶対サイズInverse3 、デバイスによって表示が異なって見える場合があります。