ナビゲーション
「ナビゲーション」モジュールを使用すると、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つの領域すべてに、バネ・ダンパー式のハプティック力が作用します。表面、キール、そして外側の壁の感触が伝わってきます。
クイックスタート — バブルナビゲーションを有効にする
ナビゲーションは永続的な設定であり、一度送信されると、 明示的に停止するか、サービスを再起動するか、セッションを終了するまで有効なままとなります。
Démarrer(ミニマル — デフォルトの吹き出しは角丸ボックス)
- 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 }
}
}
楕円体 — X/Z方向の方がY方向よりも大きい
水平方向のドリフトを垂直方向のドリフトよりも柔軟にする必要がある場合に使用します:
{
"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 et center_drift_speed.
{
"center": {
"position": { "x": 0.0, "y": 0.0, "z": 0.0 },
"relative": true,
"follow": false,
"speed": 0.02
}
}
センターのアンカー
position et relative 有効化時の中心点の初期位置を制御します:
relative | 意味論 position |
|---|---|
true (デフォルト) | position は カーソルからのずれ — 最初の中心は cursor + position. デフォルト値では (0, 0, 0), バブルはカーソルの真上に表示されます。 |
false | position は 写像空間における絶対点 — 入力時にはマウント領域に変換され、出力時にはアプリケーション領域に戻されるため、往復後の値は一致する。 |
中心のその後の移動
follow et speed バブルがアクティブになると、各サイクルごとに動作を制御します:
follow | speed | 行動 | 以前の同等品 |
|---|---|---|---|
false (デフォルト) | 無視した | 中心は元の位置のままです —固定中心。 | center_mode: "fixed" |
true | > 0 | 中心は、速度でカーソルに向かって移動する speed (m/s) カーソルがその範囲内にある限り。 | center_mode: "auto_follow" (avec center_drift_speed) |
true | 0.0 | 各サイクルごとに、センターがカーソル位置に合わせられます――テレポート効果です。 | center_mode: "track_cursor" |
センターのデフォルトの動作は、現在 フィクセ (follow = false). 以前のバージョンでは
デフォルトのカーソルへと移行していました(auto_follow). 設定してください center.follow = true
以前のドリフト動作を復元するには、以下を調整してください。 center.speed 以前の値に合わせるために
の center_drift_speed.
Lorsque follow = true カーソルが外側の境界線を越えると、中心は
その値が何であれ、カーソルに追従する speed、彼の周囲のバブルを維持し、
カーソルが逃げ出さないようにするためです。
衝突への対応
気泡は、カーソルに加えられる外部の力が collision_detection.force_threshold :
- 速度制限区域 広がっていく 一時的に(~まで
collision_detection.inflate_ratio回velocity_zone_width) これにより、ユーザーが障害物を回避するための選択肢を広げることができる。 - Lorsque
collision_detection.enabledvauttrue(デフォルトでは)、バブルの中心は 衝突力の方向にずれることを拒否するため、ユーザーが ワークスペースを剛体壁にぶつけることを防ぎます。
衝突検知には、ヒステリシス しきい値周辺のちらつきを防ぐには:
衝突が有効になると、それが |ext_force| 積の下に
降りる collision_detection.force_threshold × collision_detection.exit_ratio.
Diminuez exit_ratio ヒステリシスの範囲を広げる(衝突がより長く続くように)には、
値を 1.0 ヒステリシスを無効にし、しきい値を1つだけ使用するには。
{
"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 ヒステリシスを無効にする |
JSON 3.5 の仕様からは2 つの機能グループが除外されていますが、これらは 3.6 に向けて実装が見直されています:
- アバターの国境のボナージュ : フィールド
avatar_boundary_enabled,avatar_boundaryetavatar_boundary_hysteresis. - 作業領域の定義 : フィールド
workspace_bounded,workspace_transition_speedetworkspace_transition_ease.
ティックコードはデフォルト値で常にコンパイルおよび実行されますが、クライアントはHTTPやWebSocketを介してこれらのフィールドを読み書きすることはできません。バージョン3.6では、アバターの境界線が以下の形式で復活します。 bounds 第1レベルで、バブルオブジェクトと同じレベルにあり、配置の変換が完全に適用されています。中心のジグ解析が完了すると、作業領域の境界が元に戻ります。
検証ルール
velocity_zone_width > 00 ≤ bump_width < velocity_zone_widthmax_velocity > 0bump_stiffness ≥ 0spring_inner ≥ 0etspring_inner ≤ spring_surface ≤ spring_outerwall_stiffness ≥ 0damping_inner ≥ 0etdamping_inner ≤ damping_surface ≤ damping_outercollision_detection.force_threshold > 0collision_detection.inflate_ratio ≥ 1.0collision_detection.exit_ratiodans(0, 1]center.speed ≥ 0
Un POST ou configure.navigation 無効なパラメータを含むリクエストは拒否され、イベントが invalid-value が発行されます。以前の設定は引き続き有効です。
イベント
| イベント名 | 以下の場合にトリガーされます |
|---|---|
navigation-started | この端末ではナビゲーションが有効になっています |
navigation-updated | ナビゲーションの設定は、すでに有効になっているにもかかわらず更新されます |
navigation-stopped | ナビゲーションが停止しています(明示的な無効化、 DELETE (またはログアウト) |
invalid-value | あるナビゲーション設定が検証で却下されました |
既知の制限事項
- バージョン3.5では、ワークスペースの境界とアバターの境界が非表示になっています。これら2つの機能グループは、バージョン3.6に向けて再設計されているため、JSONスキーマには含まれていません。詳細は、上記の「パラメータのリファレンス」の項を参照してください。
- 不均一な拡大・縮小 + 回転 : lorsque
rotation_enabledetscale_enabled両方が有効になっている場合、回転がスケーリング軸には適用されないため、速度の方向がわずかに不正確になります。 - デバイスごとのサイズのスケーリング:バブルのサイズ(半径、領域の幅)は、デバイスの物理的なスケーリング係数によってスケーリングされません。MInverse とInverse3 では同じ絶対サイズが使用されているため、デバイスごとに異なって見える場合があります。