Navigation
Das Navigationsmodul ermöglicht es, den Cursor in der Anwendung „ Inverse3 “ innerhalb des Arbeitsbereichs zu bewegen – dies wird manchmal als „geschwindigkeitsgesteuerte Bewegung“ oder „Game-Pad-ähnliches Driften “ bezeichnet. Der Cursor stößt am Rand des physischen Arbeitsbereichs nicht auf eine harte Wand, sondern gelangt in eine weiche Hülle: Der Abstand des Cursors zum virtuellen Zentrum wird in Geschwindigkeit umgewandelt, wodurch der gesamte Arbeitsbereich verschoben wird. Je weiter der Cursor verschoben wird, desto schneller scrollt die Szene.
Derzeitist die Blasen-Navigation diewichtigste (und einzige)Funktion. Die Form der Blasen wird durch SDF-Elemente definiert – weitere Informationen hierzu finden Sie unter „Was ist SDF?“.
Blasennavigation – Konzept
Die virtuelle Blaseist an einem zentralen Punkt im Einbauraum des Geräts verankert. Der Cursor durchläuft drei konzentrische Bereiche:
┌──────────────────────────────────────────┐
│ WALL ZONE │ cursor beyond outer shell
│ ┌────────────────────────────────────┐ │
│ │ VELOCITY ZONE │ │ soft shell → scene moves
│ │ ┌──────────────────────────────┐ │ │
│ │ │ DEAD ZONE (inside) │ │ │ no scene movement
│ │ │ │ │ │
│ │ │ ● centre │ │ │
│ │ │ │ │ │
│ │ └──────────────────────────────┘ │ │
│ │ bubble surface │ │
│ └────────────────────────────────────┘ │
│ outer boundary │
└──────────────────────────────────────────┘
| Gebiet | Cursorposition | Verhalten |
|---|---|---|
| Tote Zone | Im Inneren der Blase | Keine Navigation. Leichte Dämpfung. Sie können die Szene frei steuern. |
| Geschwindigkeitsbereich | Zwischen der Oberfläche der Blase und der äußeren Begrenzung | Die Kurve „Entfernung → Geschwindigkeit“ bewirkt, dass sich der Arbeitsbereich in Richtung des Cursors bewegt. |
| Wandbereich | Über die äußeren Grenzen hinaus | Eine harte Feder drückt den Cursor wieder nach innen, wodurch die Navigationsgeschwindigkeit ihre Obergrenze erreicht. |
In allen drei Bereichen wirdeine feder-dämpfende taktile Kraftausgeübt – Sie können die Oberfläche, die Driftschale sowie die Außenwand spüren.
Schnellstart – Bubble-Navigation aktivieren
Die Navigation ist eine dauerhafte, einmalige Konfiguration – sie muss nur einmal gesendet werden und bleibt dann aktiv, bis Sie die Navigation ausdrücklich beenden, den Dienst neu starten oder die Sitzung schließen.
Starten (Minimalkonfiguration – Standard: abgerundete Box mit Sprechblase)
- 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"}'
Stopp
- 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 | Pfad | Verwendungszweck |
|---|---|---|
GET | /{type}/{id}/config/navigation?session=<expr> | Aktuelle Navigationskonfiguration und -status |
POST | /{type}/{id}/config/navigation?session=<expr> | Navigation starten oder aktualisieren |
DELETE | /{type}/{id}/config/navigation?session=<expr> | Navigation beenden |
Verzeichnis der Blasenformen
Die tote Zone der Blase wird durch die Form der vorzeichenbehafteten Abstandsfunktion (SDF) beschrieben. Unterschiedliche Formen führen zu unterschiedlichen Navigationsgefühlen: Die abgerundete Box (Standard) eignet sich für komfortable, rechteckige Ruhezonen, die Kugel für isotropes Driften, die Ellipsoidform für eine Ausrichtung entlang bestimmter Achsen und die Kapselform für koridorartige Szenarien.
Abgerundete Box (Standard)
Die Standard-Tote Zone ist ein flacher Bereich, dessen Höhe etwas größer ist als seine Tiefe – nach der Anpassung sorgt sie sowohl bei Inverse3 als auch bei MInverse für ein angenehmes Schreibgefühl:
{
"shape": {
"primitive": "rounded_box",
"parameters": { "b": { "x": 0.05, "y": 0.02, "z": 0.03 }, "r": 0.01 }
}
}
Kugel – isotropes Driften
{
"shape": {
"primitive": "sphere",
"parameters": { "r": 0.05 }
}
}
Ellipsoid – in X- und Z-Richtung breiter als in Y-Richtung
Wird verwendet, wenn die Empfindlichkeit der Handabtastung bei horizontaler Verschiebung geringer ist als in vertikaler Richtung:
{
"shape": {
"primitive": "ellipsoid",
"parameters": { "a": { "x": 0.06, "y": 0.03, "z": 0.06 } }
}
}
Kapselkörper – schmaler Korridor
von zwei Endpunkten a/b mit dem Radius r Definition:
{
"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
}
}
}
Ein vollständiges Beispiel mit benutzerdefinierten Abmessungen 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 Entfernungen in den Geschwindigkeitszonen werden zunächst über eine Beschleunigungskurve abgebildet und anschließend in die Geschwindigkeit im Arbeitsbereich umgerechnet. Wählen Sie bitte eine Beschleunigungsfunktion aus, die Ihrer gewünschten Beschleunigungsart entspricht – also wie sich die Szene beschleunigen soll, wenn der Benutzer weiter in die Tiefe der Hülle vordringt.
velocity_ease | Haptik | Anwendungsszenarien |
|---|---|---|
linear | Konstante Steigung | Vorhersehbar, als Standardwert empfohlen |
quadratic_in | Der Start verläuft langsam, doch je weiter man voranschreitet, desto schneller wird es. | Präzise bei Nahbereichsbetrieb, schnell bei Bewegungen über große Entfernungen |
cubic_in | Der Start verlief sehr langsam | Sehr präzise, schrittweise Beschleunigung bei großen Entfernungen |
sine_out | Der Start verläuft sanft und schnell; bei Annäherung an die Außengrenze wird die Fahrt gleichmäßiger. | Reaktionsschnell, gleichmäßige Beschleunigung bis zur Höchstgeschwindigkeit |
quadratic_out | Schnelles Ansprechen, angenehmes Spielgefühl auch über große Entfernungen | Schnelles, leichtes Schieben, komfortables Cruisen |
{ "velocity_ease": "quadratic_in", "max_velocity": 1.5 }
Kernverhalten
Der Mittelpunkt der Blase verläuft durch die verschachtelten center Konfigurieren Sie das Objekt, das vier Felder enthält –position、relative、follow、speed——ersetzte das von center、center_enabled、center_mode und center_drift_speed ein veraltetes, flaches Layout.
{
"center": {
"position": { "x": 0.0, "y": 0.0, "z": 0.0 },
"relative": true,
"follow": false,
"speed": 0.02
}
}
Die Verankerungsposition in der Mitte
position und relative Steuerung der anfänglichen Mittelposition bei der Aktivierung:
relative | position die Bedeutung |
|---|---|
true(Standard) | position Bezieht sich auf den CursorOffset——Ausgangspunkt ist cursor + position。Standardwerte verwenden (0, 0, 0) In diesem Moment entsteht genau an der Cursorposition eine Blase. |
false | position ist im AnwendungsbereichAbsolutpunkt——Beim Eingang wird der Wert in Speicherplatz umgewandelt, beim Ausgang wieder in Anwendungsspeicherplatz, sodass der Wert bei Hin- und Rückweg gleich bleibt. |
Wie bewegt sich der Mittelpunkt danach?
follow und speed Verhalten nach Aktivierung der Blasen in jedem Aktualisierungszyklus:
follow | speed | Verhalten | Äquivalente Konfiguration in älteren Versionen |
|---|---|---|---|
false(Standard) | Ignorieren | Der Mittelpunkt behält die Position bei, die er bei der Initialisierung hatte –fester Mittelpunkt. | center_mode: "fixed" |
true | > 0 | Befindet sich der Cursor innerhalb der Blase, so ist der Mittelpunkt speed mit einer Geschwindigkeit von m/s in Richtung des Cursors. | center_mode: "auto_follow"(in Kombination mit center_drift_speed) |
true | 0.0 | Das Zentrum passt sich in jedem Aktualisierungszyklus direkt an den Cursor an –ein Gefühl wie beim Teleportieren. | center_mode: "track_cursor" |
Das Standardverhalten des Zentrums wurde nun geändert aufFixieren(follow = false). In früheren Versionen wurde standardmäßig eine Cursor-Drift berücksichtigt (auto_follow). Wenn Sie das alte Drift-Verhalten wiederherstellen möchten, nehmen Sie bitte folgende Einstellung vor: center.follow = true, und wird center.speed Anpassung an die alte center_drift_speed Die Werte stimmen überein.
Wenn follow = true Und wenn der Cursor über den äußeren Rand hinausgleitet, unabhängig davon, ob speed Warum folgt der Mittelpunkt immer dem Cursor, sodass die Blase stets um den Cursor herumschwebt und dieser nicht entweichen kann?
Reaktion bei einem Aufprall
Wenn die externe Cursorkraft collision_detection.force_threshold Dann reagieren die Blasen:
- Geschwindigkeitsbegrenzungen können vorübergehend geltenAusdehnung(bis zu
velocity_zone_width的collision_detection.inflate_ratio(mal), damit der Benutzer beim Umfahren von Hindernissen mehr Handlungsspielraum hat. - Wenn
collision_detection.enabledfürtrue(Standardwert): In diesem Fall wird verhindert, dass sich der Mittelpunkt der Blase in Richtung der Kollisionskraft verschiebt, wodurch verhindert wird, dass der Benutzer den Arbeitsbereich gegen eine feste Wand zieht.
Für die Kollisionserkennung wirdHystereseEin Mechanismus zur Vermeidung von Schwankungen im Bereich des Schwellenwerts: Sobald eine Kollision ausgelöst wurde, bleibt sie aktiv, bis |ext_force| auf … sinken collision_detection.force_threshold × collision_detection.exit_ratio unter dem Produkt von … liegen. Senken exit_ratio Der Hysterese-Bereich kann vergrößert werden (um die Kollision viskoser zu gestalten); er kann auf 1.0 Dann kann die Hysterese deaktiviert und nur ein einziger Schwellenwert verwendet werden.
{
"collision_detection": {
"enabled": true,
"force_threshold": 0.5,
"inflate_ratio": 2.0,
"exit_ratio": 0.7
}
}
Parameterübersicht
Die am häufigsten angepassten Parameter
| Parameter | Standardwert | Erläuterung |
|---|---|---|
shape | {rounded_box, r=0.01, b=(0.05,0.02,0.03)} | Definition der SDF-Form der Totzone |
velocity_zone_width | 0.03 m | Die Dicke der Hülle wird durch die Geschwindigkeit gesteuert |
max_velocity | 0.5 m/s | Maximale Fahrgeschwindigkeit |
velocity_ease | "quadratic_in" | Dämpfungskurve von Entfernung zu Geschwindigkeit |
center.follow | false | Folgt die Mitte dem Cursor? |
center.speed | 0.02 m/s | follow = true Driftgeschwindigkeit zu diesem Zeitpunkt |
Vollständige Liste der Parameter
| Feld | Typ | Standardwert | Beschreibung |
|---|---|---|---|
center.position | vec3 | (0, 0, 0) | Ausgangspunkt –relative = true „时“ ist der Versatz des relativen Cursors,false Dies ist ein absoluter Koordinatenpunkt im Anwendungsraum |
center.relative | bool | true | true:position Der Versatz des relativen Cursors.false: Absolute Koordinatenpunkte im Anwendungsraum, die an den Rändern in Koordinaten des Einbauraums umgerechnet werden |
center.follow | bool | false | false: Der Mittelpunkt bleibt an seiner Ausgangsposition.true: Der Mittelpunkt folgt dem Cursor |
center.speed | float | 0.02 | follow = true Driftgeschwindigkeit zu diesem Zeitpunkt (Meter/Sekunde);0.0 Jeden Zyklus direkt am Cursor anzeigen |
shape | Form | {rounded_box, r=0.01, b=(0.05,0.02,0.03)} | Tote Zone – SDF-Form |
velocity_zone_width | float | 0.03 | Breite des Gehäuses für die Drehzahlregelung (Meter) |
max_velocity | float | 0.5 | Maximale Fahrgeschwindigkeit (m/s) |
velocity_ease | String | "quadratic_in" | Dämpfungsfunktion von der Entfernung zur Geschwindigkeit |
reset_velocity_on_entry | bool | true | Sobald der Cursor wieder in den Geschwindigkeitsbereich gelangt, wird die kumulierte Geschwindigkeit auf Null zurückgesetzt. |
bump_width | float | 0.005 | Breite der taktilen Erhebungen an der Oberfläche (Meter) |
bump_stiffness | float | 200.0 | Federkonstante bei einer Oberflächenausbuchtung |
spring_inner | float | 0.0 | Die Feder im Zentrum der Blase |
spring_surface | float | 10.0 | Die Feder an der Oberfläche |
spring_outer | float | 15.0 | Die Feder an der Außenkante |
wall_stiffness | float | 700.0 | Hartwandfeder, die über die Außenkante hinausragt |
damping_inner | float | 0.1 | Dämpfung in der Mitte |
damping_surface | float | 4.0 | Dämpfung an der Oberfläche |
damping_outer | float | 7.0 | Dämpfung an der Außengrenze |
rotation_enabled | bool | false | Die Drehung des Arbeitsraums auf die Navigationsrichtung anwenden |
scale_enabled | bool | false | Anwendung der Arbeitsbereichszoomfunktion auf die Navigationsgeschwindigkeit |
collision_detection.enabled | bool | true | Navigation entlang der Kollisionsrichtung unterbinden |
collision_detection.force_threshold | float | 1.0 | Größe der für die Kollision erforderlichen äußeren Kraft (N) |
collision_detection.inflate_ratio | float | 2.0 | Vergrößerungsfaktor für die Breite des Geschwindigkeitsbereichs während der Kollision (muss ≥ 1,0 sein) |
collision_detection.exit_ratio | float | 0.7 | Verzögerungsfaktor – Beibehaltung des Kollisionszustands, bis |ext_force| < force_threshold × exit_ratio。Wertebereich (0, 1];1.0 Anzeige der Verzögerung deaktivieren |
Die folgenden beiden Funktionsgruppen wurden im JSON-Modus der Version 3.5 weggelassen, ihre Implementierung wird jedoch für Version 3.6 neu konzipiert:
- Avatar – Grenzklammer: Feld
avatar_boundary_enabled、avatar_boundaryundavatar_boundary_hysteresis。 - Einschränkungen hinsichtlich der Arbeitsbereichsgrenzen: Feld
workspace_bounded、workspace_transition_speedundworkspace_transition_ease。
Der Code wird weiterhin mit den Standardwerten kompiliert und ausgeführt, aber der Client kann diese Felder weder über HTTP noch über WebSocket lesen oder schreiben. In Version 3.6 wird die Avatar-Grenze als oberstes Element auf derselben Ebene wie das Bubble-Objekt behandelt. bounds Die Felder werden wieder hinzugefügt, einschließlich der vollständigen Platzierungstransformationen; die Arbeitsbereichsgrenzen werden wieder hinzugefügt, sobald die Fehlerbehebung bezüglich des Zentrums-Jitter-Problems abgeschlossen ist.
Prüfregeln
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_ratioWerte im Bereich von(0, 1]innerhalb des Bereichscenter.speed ≥ 0
mit ungültigen Parametern POST oder configure.navigation Die Anfrage wird abgelehnt und löst Folgendes aus: invalid-value Ereignis; die vorherige Konfiguration bleibt weiterhin gültig.
Vorfall
| Bezeichnung des Vorfalls | Auslösezeitpunkt |
|---|---|
navigation-started | Die Navigation auf dem Gerät wurde aktiviert |
navigation-updated | Wenn die Navigation aktiviert ist, wird ihre Konfiguration aktualisiert. |
navigation-stopped | Die Navigation wurde angehalten (explizit deaktiviert,DELETE (Anfrage oder Sitzung beendet) |
invalid-value | Die Navigationskonfiguration wurde aufgrund einer fehlgeschlagenen Validierung abgelehnt. |
Bekannte Einschränkungen
- 3.5 Versteckte Arbeitsbereichsgrenzen und Avatar-Grenzen: Diese beiden Funktionsgruppen sind im JSON-Modus nicht vorhanden, da sie für Version 3.6 neu gestaltet werden. Weitere Informationen finden Sie in den Erläuterungen oben unter „Parameterübersicht “.
- Inhomogene Skalierung + Drehung: Wenn
rotation_enabledundscale_enabledWenn beide Funktionen gleichzeitig aktiviert sind, kommt es zu einer leichten Abweichung in der Geschwindigkeitsrichtung – die Drehung wird nicht auf die Skalierungsachse angewendet. - An das Gerät anpassen: Die Größe der Blasen (Radius, Breite des Bereichs) wird nicht entsprechend dem physikalischen Skalierungsfaktor des Geräts angepasst –MInverse und Inverse3 verwenden dieselben absoluten Maße, weshalb sich die Bedienung der beiden Seiten möglicherweise unterscheidet.