Navigation
Das Navigationsmodul ermöglicht es einem Cursor Inverse3 , den Arbeitsbereich der Anwendung zu verschieben – was manchmal als geschwindigkeitsgesteuerte Fortbewegung oder „Joystick-artige Drift“ bezeichnet wird. Anstatt am Rand des physischen Arbeitsbereichs auf eine harte Wand zu stoßen, gelangt der Cursor in eine flexible Hülle, in der sein Abstand zu einem virtuellen Zentrum mit einer Geschwindigkeit verknüpft ist, die den gesamten Arbeitsbereich verschiebt. Je weiter der Cursor verschoben wird, desto schneller scrollt die Szene.
Die wichtigste (und derzeit einzige) Funktionsweise ist die Navigation per Blase. Die Form der Blase wird mithilfe einer SDF-Primitive definiert – siehe „Was ist ein SDF? “ für eine Erläuterung des Konzepts.
Sprachblasennavigation – Konzept
Eine virtuelle Blase wird um einen zentralen Punkt im Einbauraum des Geräts herum verankert. Der Cursor bewegt sich innerhalb von drei konzentrischen Zonen:
┌──────────────────────────────────────────┐
│ WALL ZONE │ cursor beyond outer shell
│ ┌────────────────────────────────────┐ │
│ │ VELOCITY ZONE │ │ soft shell → scene moves
│ │ ┌──────────────────────────────┐ │ │
│ │ │ DEAD ZONE (inside) │ │ │ no scene movement
│ │ │ │ │ │
│ │ │ ● centre │ │ │
│ │ │ │ │ │
│ │ └──────────────────────────────┘ │ │
│ │ bubble surface │ │
│ └────────────────────────────────────┘ │
│ outer boundary │
└──────────────────────────────────────────┘
| Zone | Cursorposition | Verhalten |
|---|---|---|
| Tote Zone | Innerhalb der Blase | Keine Navigation. Leichte Dämpfung. Sie können die Szene frei bearbeiten. |
| Geschwindigkeitszone | Zwischen der Oberfläche und der Außengrenze | Die Kurve „Entfernung → Geschwindigkeit“ verschiebt den Arbeitsbereich in Richtung des Cursors. |
| Wandbereich | Jenseits der Außengrenze | Eine starre Feder drückt den Schieberegler nach innen, wodurch die Navigationsgeschwindigkeit begrenzt wird. |
In allen drei Bereichen wirkt eine haptische Kraft vom Typ Feder-Dämpfer – Sie spüren die Oberfläche, den Seitenrumpf und die Außenwand.
Schnellstart – Sprechblasennavigation aktivieren
Die Navigation ist eine dauerhafte Konfiguration, die einmalig gesendet wird: Sie bleibt aktiv, bis Sie sie explizit beenden, den Dienst neu starten oder die Sitzung schließen.
Starten (Minimal – Standard-Sprechblase in abgerundeter Box)
- 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"}'
Beenden
- WebSocket
- HTTP
{
"inverse3": [
{
"device_id": "04C3",
"configure": {
"navigation": { "mode": "disabled" }
}
}
]
}
curl -X DELETE "http://localhost:10001/inverse3/04C3/config/navigation?session=:0"
Weitere HTTP-Routen
| Methode | Chemin | Rolle |
|---|---|---|
GET | /{type}/{id}/config/navigation?session=<expr> | Aktuelle Navigationseinstellungen und Status |
POST | /{type}/{id}/config/navigation?session=<expr> | Navigation starten oder aktualisieren |
DELETE | /{type}/{id}/config/navigation?session=<expr> | Navigation beenden |
Katalog der Blasenformen
Die Totzone der Blase wird durch eine Form mit vorzeichenbehafteter Abstandsfunktion (SDF) beschrieben. Verschiedene Formen sorgen für unterschiedliche Navigationserlebnisse – eine abgerundete Box (Standardwert) für einen komfortablen rechteckigen Ruhebereich, eine Kugel für eine isotrope Drift, ein Ellipsoid zur Bevorzugung bestimmter Achsen, eine Kapsel für Korridore.
Abgerundetes Feld (Standard)
Der Standard-Totenbereich ist ein flacher Bereich, der in der Breite etwas größer ist als in der Tiefe und so eingestellt ist, dass er sowohl auf Inverse3 als auch auf MInverse angenehm zu bedienen ist:
{
"shape": {
"primitive": "rounded_box",
"parameters": { "b": { "x": 0.05, "y": 0.02, "z": 0.03 }, "r": 0.01 }
}
}
Sphäre – isotrope Drift
{
"shape": {
"primitive": "sphere",
"parameters": { "r": 0.05 }
}
}
Ellipsoid – in X/Z-Richtung größer als in Y-Richtung
Zu verwenden, wenn die horizontale Abdrift flexibler sein muss als die vertikale Abdrift:
{
"shape": {
"primitive": "ellipsoid",
"parameters": { "a": { "x": 0.06, "y": 0.03, "z": 0.06 } }
}
}
Kapsel – langgestrecktes Couloir
Zwei Endpunkte a/b sowie eine Abteilung 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
}
}
}
Vollständiges Beispiel mit individueller Dimensionierung und Bewegungsgefühl:
{
"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"
}
}
}
}
]
}
Geschwindigkeitskurve
Die Entfernung aus dem Geschwindigkeitsbereich wird anhand einer Beschleunigungskurve (Easing) umgewandelt, bevor sie in die Geschwindigkeit des Arbeitsbereichs umgerechnet wird. Wählen Sie die Beschleunigung aus, die der Art und Weise entspricht, wie die Szene beschleunigen soll, wenn der Benutzer stärker in die Hülle drückt.
velocity_ease | Sensation | Wann sollte man es verwenden? |
|---|---|---|
linear | Konstante Steigung | Vorhersehbar, gute Standardauswahl |
quadratic_in | Langsamer Start, schnellerer Schub | Präzise in der Nähe der Oberfläche, lange, schnelle Fahrt |
cubic_in | Sehr langsamer Start | Sehr präzise, auf langen Strecken nimmt die Geschwindigkeit zu |
sine_out | Schneller und flüssiger Start, Trittplatte nahe der Außenseite | Reaktionsfreudig, gleitet sanft aus |
quadratic_out | Schnell beim Anfahren, komfortabel auf langen Strecken | Ein kurzer, kräftiger Schub, dann komfortables Cruisen |
{ "velocity_ease": "quadratic_in", "max_velocity": 1.5 }
Verhalten des Zentrums
Der Mittelpunkt der Blase wird mithilfe eines verschachtelten Objekts festgelegt. center mit vier
Feldern — position, relative, follow, speed — das die bisherige
flache Anordnung ersetzt, bestehend aus 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
}
}
Verankerung des Zentrums
position et relative bestimmen die anfängliche Position des Zentrums bei der Aktivierung:
relative | Semantik von position |
|---|---|
true (Standard) | position ist ein Versatz gegenüber dem Cursor — der ursprüngliche Mittelpunkt ist cursor + position. Mit dem Standardwert (0, 0, 0), erscheint die Sprechblase genau auf dem Cursor. |
false | position ist ein Absolutpunkt im Anwendungsraum — Er wird am Eingang in einen Speicherbereich umgewandelt und am Ausgang wieder in einen Anwendungsbereich zurückverwandelt, sodass die Werte nach einem Hin- und Rücklauf übereinstimmen. |
Spätere Verschiebung des Zentrums
follow et speed steuern das Verhalten in jedem Zyklus, sobald die Blase aktiv ist:
follow | speed | Verhalten | Vorherige Entsprechung |
|---|---|---|---|
false (Standard) | ignoriert | Der Mittelpunkt bleibt an seiner ursprünglichen Position – fester Mittelpunkt. | center_mode: "fixed" |
true | > 0 | Der Mittelpunkt bewegt sich mit der Geschwindigkeit speed (m/s), solange sich der Cursor darin befindet. | center_mode: "auto_follow" (mit center_drift_speed) |
true | 0.0 | Der Mittelpunkt wird bei jedem Zyklus auf den Cursor ausgerichtet – Teleportationseffekt. | center_mode: "track_cursor" |
Das Standardverhalten des Zentrums ist nun fixe (follow = false). Frühere Versionen
verwiesen auf den Standard-Schieberegler (auto_follow). Legen Sie fest center.follow = true
um das ursprüngliche Driftverhalten wiederherzustellen, und passen Sie center.speed um dem früheren Wert
von center_drift_speed.
Wenn follow = true Sobald der Cursor die äußere Grenze überschreitet, folgt der Mittelpunkt
dem Cursor, unabhängig vom Wert von speed, um die Blase um ihn herum zu erhalten und
zu verhindern, dass der Cursor entwischt.
Reaktion auf Kollisionen
Die Blase reagiert auf äußere Kräfte, die auf den Schieberegler einwirken und die collision_detection.force_threshold :
- Die Geschwindigkeitszone erweitert sich vorübergehend (bis
collision_detection.inflate_ratioMalvelocity_zone_width), um dem Nutzer mehr Spielraum zu geben, das Hindernis zu umfahren. - Wenn
collision_detection.enabledist werttrue(standardmäßig) weigert sich der Mittelpunkt der Blase, in Richtung der Aufprallkraft abzudriften, wodurch verhindert wird, dass der Benutzer den Arbeitsbereich gegen eine starre Wand schiebt.
Die Kollisionserkennung nutzt dieHysterese Um ein Flackern um die Schwelle herum zu vermeiden:
Sobald eine Kollision aktiv ist, bleibt sie aktiv, bis |ext_force| unter dem
Produkt collision_detection.force_threshold × collision_detection.exit_ratio.
Verringern exit_ratio Um den Hysterese-Bereich zu vergrößern (längere Kollisionen), stellen Sie
den Wert auf 1.0 um die Hysterese zu deaktivieren und nur einen Schwellenwert zu verwenden.
{
"collision_detection": {
"enabled": true,
"force_threshold": 0.5,
"inflate_ratio": 2.0,
"exit_ratio": 0.7
}
}
Parameterübersicht
Am häufigsten angepasst
| Parameter | Standardwert | Beschreibung |
|---|---|---|
shape | {rounded_box, r=0.01, b=(0.05,0.02,0.03)} | SDF-Form, die die Totzone definiert |
velocity_zone_width | 0.03 m | Dicke der Kontrollhülle bei Geschwindigkeit |
max_velocity | 0.5 m/s | Höchstgeschwindigkeit |
velocity_ease | "quadratic_in" | Übergangskurve von der Entfernung zur Geschwindigkeit |
center.follow | false | Geben Sie an, ob der Mittelpunkt dem Cursor folgt |
center.speed | 0.02 m/s | Driftgeschwindigkeit, wenn follow = true |
Vollständige Liste der Parameter
| Champ | Typ | Standardwert | Beschreibung |
|---|---|---|---|
center.position | vec3 | (0, 0, 0) | Zentrierung – Versatz gegenüber dem Cursor, wenn relative = true, absoluter Punkt im Abbildungsraum, wenn false |
center.relative | bool | true | true : position ist ein Versatz gegenüber dem Cursor. false : absoluter Punkt des Abbildungsraums, der an der Grenze in einen Montage-Raum umgewandelt wird |
center.follow | bool | false | false : Der Mittelpunkt bleibt an seiner Ausgangsposition. true : Die Mitte folgt dem Cursor |
center.speed | float | 0.02 | Driftgeschwindigkeit (m/s), wenn follow = true ; 0.0 Zentriere das Zentrum bei jedem Zyklus auf den Cursor |
shape | Form | {rounded_box, r=0.01, b=(0.05,0.02,0.03)} | SDF-Form der toten Zone |
velocity_zone_width | float | 0.03 | Dicke der Kontrollhülle bei Geschwindigkeit (m) |
max_velocity | float | 0.5 | Maximale Fahrgeschwindigkeit (m/s) |
velocity_ease | String | "quadratic_in" | Übergang von der Entfernung zur Geschwindigkeit |
reset_velocity_on_entry | bool | true | Setzt die kumulierte Geschwindigkeit zurück, sobald der Cursor wieder in den Geschwindigkeitsbereich gelangt |
bump_width | float | 0.005 | Oberflächen-Tastnoppen (m) |
bump_stiffness | float | 200.0 | Steifigkeitskonstante der Feder von der Erhebung bis zur Oberfläche |
spring_inner | float | 0.0 | Feder im Zentrum der Blase |
spring_surface | float | 10.0 | An die Oberfläche zurückkehren |
spring_outer | float | 15.0 | Zuständigkeit an der Außengrenze |
wall_stiffness | float | 700.0 | Steifigkeit der starren Wandfeder jenseits der Außengrenze |
damping_inner | float | 0.1 | Abschreibung in der Mitte |
damping_surface | float | 4.0 | Flächenbezogene Abschreibung |
damping_outer | float | 7.0 | Abschreibung an der Außengrenze |
rotation_enabled | bool | false | Wende die Drehung des Arbeitsbereichs auf die Navigationsrichtung an |
scale_enabled | bool | false | Wende den Maßstab des Arbeitsbereichs auf die Navigationsgeschwindigkeit an |
collision_detection.enabled | bool | true | Blockieren Sie die Fahrt in Richtung des Unfalls |
collision_detection.force_threshold | float | 1.0 | Stärke der für eine Kollision erforderlichen äußeren Kraft (N) |
collision_detection.inflate_ratio | float | 2.0 | Multiplikator für die Breite der Geschwindigkeitszone bei einer Kollision (muss ≥ 1,0 sein) |
collision_detection.exit_ratio | float | 0.7 | Hystereseverhältnis – bleibt in der Kollision, solange |ext_force| < force_threshold × exit_ratio. Strand (0, 1] ; 1.0 deaktiviert die Hysterese |
Zwei Funktionsgruppen fehlen im JSON-Schema 3.5, da ihre Implementierungen für die Version 3.6 überarbeitet werden:
- Begrenzung des Avatars : die Felder
avatar_boundary_enabled,avatar_boundaryetavatar_boundary_hysteresis. - Abgrenzung des Arbeitsbereichs : die Felder
workspace_bounded,workspace_transition_speedetworkspace_transition_ease.
Der Tick-Code lässt sich weiterhin mit den Standardwerten kompilieren und ausführen, aber die Clients können diese Felder weder über HTTP noch über WebSocket lesen oder beschreiben. In Version 3.6 wird der Avatar-Rahmen in Form eines bounds auf der ersten Ebene, auf derselben Ebene wie das Blasenobjekt, mit einer vollständigen Positionierungstransformation; die Abgrenzung des Arbeitsbereichs wird wiederhergestellt, sobald die Analyse des Zentrumsjitters abgeschlossen ist.
Validierungsregeln
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 mit ungültigen Parametern wird abgelehnt und ein Ereignis invalid-value wird ausgegeben; die vorherige Konfiguration bleibt aktiv.
Veranstaltungen
| Name der Veranstaltung | Wird ausgelöst, wenn |
|---|---|
navigation-started | Auf einem Gerät ist die Navigation aktiviert |
navigation-updated | Die Navigationseinstellungen werden aktualisiert, obwohl sie bereits aktiv sind. |
navigation-stopped | Die Navigation ist deaktiviert (ausdrückliche Deaktivierung, DELETE (oder Abmeldung) |
invalid-value | Eine Navigationskonfiguration wird bei der Validierung abgelehnt |
Bekannte Einschränkungen
- Abgrenzung des Arbeitsbereichs und ausgeblendete Avatar-Grenzen in Version 3.5: Die beiden Funktionsgruppen fehlen im JSON-Schema, da sie für Version 3.6 überarbeitet werden. Siehe den Hinweis oben unter „Parameterreferenz“.
- Ungleichmäßige Skalierung + Drehung : wenn
rotation_enabledetscale_enabledSind beide aktiviert, ist die Geschwindigkeitssteuerung leicht ungenau, da die Drehung nicht auf die Skalierungsachsen angewendet wird. - Skalierung der Größe je nach Gerät: Die Größe der Blasen (Radius, Bereichsbreite) wird nicht anhand des physikalischen Skalierungsfaktors des Geräts skaliert; MInverse und Inverse3 verwenden dieselben absoluten Größen, die daher auf den jeweiligen Seiten unterschiedlich erscheinen können.