ナビゲーション
「ナビゲーション」モジュールにより、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 │
└──────────────────────────────────────────┘
| ゾーン | カーソル位置 | 行動 |
|---|---|---|
| トットゾーン | 気泡の内部 | ナビゲーションなし。軽微な減衰。シーンを自由に操作できます。 |
| 速度制限区域 | 表面と外縁の間 | 「距離 → 速度曲線」は、作業領域をカーソルの位置に向かって移動させます。 |
| Wandzone | 国境の向こう側 | 硬いバネがカーソルをバブルの中に押し戻し、移動速度が制限される。 |
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ルート
| 方法 | Pfad | Zweck |
|---|---|---|
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)を用いた形状によって記述されます。形状が異なれば、ナビゲーションの感触も異なります。例えば、快適な長方形の休息ゾーンには角の丸い直方体(標準)、等方的なドリフトには球体、特定の軸を優先させるには楕円体、そして回廊にはカプセルが用いられます。
角が丸められた直方体(標準)
標準の「トットゾーン」は、深さよりも幅がやや広い平らな空間であり、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 und center_drift_speed.
{
"center": {
"position": { "x": 0.0, "y": 0.0, "z": 0.0 },
"relative": true,
"follow": false,
"speed": 0.02
}
}
中心点が固定される場所
position und relative アクティブ化時の中心点の初期位置を制御します:
relative | 「」の意味 position |
|---|---|
true (標準) | position ist ein カーソルからのオフセット – 初期の中心点は cursor + position. デフォルト値では (0, 0, 0) 気泡がカーソルの真上に表示されます。 |
false | position ist ein 適用領域内の絶対点 – これは、組立室への入室時に換算され、退室時に再び使用室へ換算されるため、往路と復路の換算値が一致するようになっています。 |
その後、中心点がどのように動くか
follow und speed バブルがアクティブになると、1クロックごとに動作を制御します:
follow | speed | 行動 | これまでの同等品 |
|---|---|---|---|
false (標準) | 無視された | 中心点は、初期化された位置に留まります。つまり、固定された中心点となります。 | center_mode: "fixed" |
true | > 0 | 中心も一緒に流れていく speed カーソルが範囲内にある限り、カーソルの方向にm/sの速度で移動します。 | center_mode: "auto_follow" (mit center_drift_speed) |
true | 0.0 | 各小節ごとに中心点がカーソル位置にジャンプする――まるでテレポートしたような感覚だ。 | center_mode: "track_cursor" |
中心点のデフォルトの挙動は、現在次のようになっています。 フェスト (follow = false). 以前のバージョンでは、デフォルトで中心点がカーソルの位置に向かって移動するように設定されていました(auto_follow). 設定してください center.follow = true、以前のドリフト挙動を復元するために、そして center.speed 以前の値である center_drift_speed an.
Wenn follow = true 金箔が外側の境界線を越えてカーソルが移動すると、中心点は以下に関係なくカーソルに追従します。 speed、そうすることで、バブルがカーソルを包み込み続け、カーソルが逃げ出せないようにするためです。
衝突挙動
この気泡は、外部からのカーソル力に反応し、その力は collision_detection.force_threshold überschreiten:
- 速度制限区域 広がっていく 一時的に停止中(~まで)
collision_detection.inflate_ratio-分野:velocity_zone_width)、障害物の周りを回避するための余裕を持たせるためです。 - Wenn
collision_detection.enabledauftrue(デフォルト値)が設定されている場合、バブルの中心は衝突力の方向にずれることがないため、作業領域を硬い壁の方へ引き寄せることはできません。
衝突検出では、以下を使用します。 ヒステリシス、しきい値付近でのちらつきを防ぐために:衝突が発生すると、それが有効な状態は、 |ext_force| その商品の下へ collision_detection.force_threshold × collision_detection.exit_ratio 下がります。下げて 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 gilt. 範囲 (0, 1]; 1.0 ヒステリシスを無効にする |
バージョン3.5のJSONスキーマには2つの関数グループが含まれていませんが、 バージョン3.6向けの実装は現在見直されています:
- アバター境界での拘束: フィールド
avatar_boundary_enabled,avatar_boundaryundavatar_boundary_hysteresis. - 作業領域の制限: フィールド
workspace_bounded,workspace_transition_speedundworkspace_transition_ease.
Tickコードは引き続きデフォルト値でコンパイルおよび実行されますが、クライアントはHTTPやWebSocketを介してこれらのフィールドを読み取ったり書き込んだりすることはできません。バージョン3.6では、アバター制限が同等の最上位要素として復活します。 bounds バブルオブジェクトの横に、完全な配置変換を伴って戻ります。中心点の揺れに関する検証が完了すると、作業領域の境界が元に戻ります。
検証ルール
velocity_zone_width > 00 ≤ bump_width < velocity_zone_widthmax_velocity > 0bump_stiffness ≥ 0spring_inner ≥ 0undspring_inner ≤ spring_surface ≤ spring_outerwall_stiffness ≥ 0damping_inner ≥ 0unddamping_inner ≤ damping_surface ≤ damping_outercollision_detection.force_threshold > 0collision_detection.inflate_ratio ≥ 1.0collision_detection.exit_ratioで(0, 1]center.speed ≥ 0
アイン POST oder configure.navigation 無効なパラメータが指定された場合は拒否され、
invalid-value- イベントがトリガーされます。それ以前の設定は引き続き有効です。
イベント
| イベント名 | 以下の場合にトリガーされる |
|---|---|
navigation-started | デバイスでナビゲーションが有効になります |
navigation-updated | ナビゲーションの設定が、すでに有効になっている状態で更新されています |
navigation-stopped | ナビゲーションが終了します(明示的な無効化、 DELETE (または会議終了時) |
invalid-value | ナビゲーション設定が検証の結果、却下されました |
既知の制限事項
- 3.5 では、作業領域の制限とアバターの境界は非表示になっています。これらの機能グループは、JSON スキーマには含まれていませんが、3.6 では見直される予定です。詳細は、上記の「パラメータリファレンス」の注記を参照してください。
- 不均一な拡大縮小と回転: wenn
rotation_enabledundscale_enabled両方が有効になっている場合、速度の方向がわずかに不正確になります。つまり、回転がスケーリング軸に適用されないためです。 - デバイスごとのサイズスケーリング:バブルのサイズ(半径、ゾーンの幅)は、デバイスの物理的なスケーリング倍率に応じて変更されません。MInverse とInverse3 では同じ絶対サイズが使用されるため、デバイスによって表示上の印象が異なる場合があります。