ナビゲーション
ナビゲーションモジュールを使用すると、 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 }
}
}
楕球体――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 和 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 | 速度制御用ハウジングの幅(メートル) |
max_velocity | float | 0.5 | 最大航行速度(m/s) |
velocity_ease | ストリング | "quadratic_in" | 距離から速度への減速関数 |
reset_velocity_on_entry | bool | true | カーソルが速度領域に再び入った際、累積速度をゼロにリセットする |
bump_width | float | 0.005 | 表面の触覚用突起の幅(メートル) |
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 つの機能セットは、JSON モードのバージョン 3.5 では省略されていますが、その実装はバージョン 3.6 に向けて再設計が進められています:
- アバター 境界クランプ:フィールド
avatar_boundary_enabled、avatar_boundary和avatar_boundary_hysteresis。 - ワークスペースの境界制約:フィールド
workspace_bounded、workspace_transition_speed和workspace_transition_ease。
tick コードは引き続きデフォルト値でコンパイルおよび実行されますが、クライアントは 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
無効な引数を使用した 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 では同じ絶対サイズが使用されているため、両者の操作感が異なる場合があります。