Navigation
Mit dem Navigationsmodul können Sie den Cursor unter Inverse3 durch den Arbeitsbereich (Workspace) der Anwendung bewegen. Dies wird auch als „Rate-Control-Locomotion“ oder „gamepad-like drift“ bezeichnet. Anstatt dass der Cursor am Rand des physischen Arbeitsbereichs auf eine feste Wand stößt, betritt er einen „Soft-Shell“-Bereich, in dem die Entfernung vom virtuellen Zentrum auf die Geschwindigkeit abgebildet wird, mit der er sich durch den gesamten Arbeitsbereich bewegt. Je weiter Sie den Cursor verschieben, desto schneller scrollt die Szene.
Die Standardfunktion (derzeit die einzige) ist die Bubble-Navigation. Die Form der Bubbles wird mithilfe von SDF-Primitivendefiniert; weitere Informationen zu diesem Konzept finden Sie unter „Was ist SDF?“.
Bubble-Navigation – Konzept
Dievirtuelle Blasewird relativ zum Mittelpunkt des Gerätehalterungsbereichs fixiert. 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 │
└──────────────────────────────────────────┘
| Bereich | Cursorposition | Bewegung |
|---|---|---|
| Tote Zone | Im Inneren der Blase | Es gibt keine Navigation. Es wird eine leichte Dämpfung angewendet. Die Szene lässt sich frei steuern. |
| Geschwindigkeitsbereich | Zwischen der Oberfläche und der Außenkontur | Der Arbeitsbereich bewegt sich entsprechend der Kurve „Weg → Geschwindigkeit“ in Richtung des Cursors. |
| Wandbereich | Jenseits der äußeren Grenze | Eine starke Feder drückt den Cursor nach innen, wodurch die Navigationsgeschwindigkeit ihren Höchstwert erreicht. |
In allen drei Bereichen werden haptische Kräfte mit Feder-Dämpfer-Charakteristikangewendet, sodass Sie die Oberfläche, die Drift-Hülle und die Außenwand spüren können.
Schnellstart – Bubble-Navigation aktivieren
Die Navigation ist eine dauerhafte Einmal-Einstellung. Sobald sie einmal übertragen wurde, bleibt sie aktiv, bis sie explizit beendet wird, der Dienst neu gestartet wird oder die Sitzung geschlossen wird.
Start (Mindestkonfiguration – Standard-Bubble in Form eines abgerundeten Rechtecks)
- 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"
Sonstige HTTP-Pfade
| Methode | Pfad | Verwendungszweck |
|---|---|---|
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 |
Liste der Blasenformen
Die „Dead Zone“ einer Blase wird in Form einer vorzeichenbehafteten Abstandsfunktion (Signed-Distance-Function, SDF) definiert. Je nach Form ändert sich das Navigationsgefühl. Für komfortable rechteckige Ruhezonen wird ein abgerundetes Rechteck (Standardwert) verwendet, für isotropen Drift eine Kugel (sphere), um bestimmte Achsen zu bevorzugen, ein Ellipsoid (ellipsoid) und für Durchgänge eine Kapsel (capsule).
Rundes Rechteck (Standard)
Die Standard-Dead-Zone ist ein etwas flacher Bereich, der etwas höher ist als die Tiefe, und wurde so angepasst, dass sie sowohl bei „ Inverse3 “ als auch bei „ MInverse “ ein angenehmes Gefühl vermittelt:
{
"shape": {
"primitive": "rounded_box",
"parameters": { "b": { "x": 0.05, "y": 0.02, "z": 0.03 }, "r": 0.01 }
}
}
Gu — Isotrope Drift
{
"shape": {
"primitive": "sphere",
"parameters": { "r": 0.05 }
}
}
Ellipsoid – Die X- und Z-Achse sind breiter als die Y-Achse
Dies wird verwendet, wenn sich der horizontale Drift lockerer anfühlen soll als der vertikale Drift:
{
"shape": {
"primitive": "ellipsoid",
"parameters": { "a": { "x": 0.06, "y": 0.03, "z": 0.06 } }
}
}
Kapsel – ein schmaler Gang
die beiden Endpunkte a/bund Radius rwird festgelegt:
{
"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 Bewegungseffekten:
{
"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 im Geschwindigkeitsbereich werden über eine Easing-Kurve abgebildet und anschließend in die Geschwindigkeit im Arbeitsbereich umgerechnet. Wählen Sie eine Easing-Kurve aus, die Ihren Vorstellungen entspricht, wie die Szene beschleunigt werden soll, wenn der Benutzer tiefer in die Shell hineinschiebt.
velocity_ease | Gefühl | Anwendungszeitpunkt |
|---|---|---|
linear | gleichmäßige Zunahme | Vorhersehbare und unauffällige Standardwerte |
quadratic_in | Langsamer Start, schneller Vorstoß | In der Nähe der Oberfläche präzise, auf große Entfernungen schnell |
cubic_in | Ein sehr langsamer Start | Sehr präzise und bei Langstreckenfahrten schrittweise Beschleunigung |
sine_out | Sanfter und schneller Start, der sich in der Nähe der Außenkante abschwächt | Die Reaktion erfolgt schnell, und die Obergrenze wird allmählich erreicht. |
quadratic_out | Schnell beim Anfahren, komfortabel auf langen Strecken | Schnelle Feineinstellung, komfortables Fahren |
{ "velocity_ease": "quadratic_in", "max_velocity": 1.5 }
Kernbewegung
Das Zentrum der Blase bilden vier Felder (position, relative, follow, speed) bestehend aus verschachtelten center Die Einstellung erfolgt über ein Objekt. Dies bedeutet, dass center, center_enabled, center_mode, center_drift_speedEs ersetzt die bisherige flächige Struktur, die aus … bestand.
{
"center": {
"position": { "x": 0.0, "y": 0.0, "z": 0.0 },
"relative": true,
"follow": false,
"speed": 0.02
}
}
Position, an der der Mittelpunkt fixiert wird
positionund relativesteuert die anfängliche Zentrumsposition zum Zeitpunkt der Aktivierung:
relative | positiondie Bedeutung von |
|---|---|
true (Standardwert) | position은 Versatz vom Cursor aus. Der ursprüngliche Schwerpunkt lag auf cursor + position. Standardwert (0, 0, 0)Die Blase wird genau an der angegebenen Stelle erzeugt. |
false | position은 Der Nullpunkt im Anwendungsraum. Bei der Eingabe wird der Wert in den Mount-Bereich umgewandelt und bei der Ausgabe wieder in den Anwendungsbereich zurückgewandelt, sodass die Werte auch nach der Hin- und Rückwandlung übereinstimmen. |
Wie sich der Schwerpunkt anschließend verlagert
Nachdem die Blase aktiviert wurde followWow speedsteuert die Aktion bei jedem Tick:
follow | speed | Bewegung | Vorherige gleichwertige Einstellung |
|---|---|---|---|
false (Standardwert) | Ignoriert | Der Mittelpunkt bleibt an seiner ursprünglichen Position erhalten – fester Mittelpunkt. | center_mode: "fixed" |
true | > 0 | Solange sich der Cursor im Inneren befindet, liegt der Mittelpunkt speed Es driftet mit einer Geschwindigkeit von m/s in Richtung des Cursors. | center_mode: "auto_follow" (center_drift_speed (Verwendung) |
true | 0.0 | Bei jedem Zug ist der Schwerpunkt so groß, dass man sofort an die Position gelangt – es fühlt sich an wie Teleportation. | center_mode: "track_cursor" |
Der Standardwert für die zentrale Aktion lautet nun Fixieren(follow = false). In früheren Versionen kam es standardmäßig zu einer Drift in Richtung des Cursors (auto_follow) habe ich gemacht. Um die vorherige Drift-Bewegung wiederherzustellen, center.follow = trueauf … einstellen und center.speedverschieben center_drift_speed Passen Sie den Wert entsprechend an.
follow = trueund wenn der Cursor die äußere Begrenzung überschreitet, speedUnabhängig davon folgt der Mittelpunkt dem Cursor, hält die Blase in der Nähe des Cursors und sorgt dafür, dass der Cursor nicht aus dem Bild verschwindet.
Reaktion auf einen Zusammenstoß
Bubble ist collision_detection.force_thresholdreagiert auf externe Cursorkräfte, die diesen Wert überschreiten:
- Der Geschwindigkeitsbereich ist vorübergehend Ausdehnungmacht (maximal
velocity_zone_widthvoncollision_detection.inflate_ratio(bis zum Bauch). Dadurch vergrößert sich der Bewegungsspielraum, den der Benutzer um Hindernisse herum hat. collision_detection.enabledgatrue(Standardwert) driftet der Mittelpunkt der Blase nicht in Richtung der Kollisionskraft ab. Dadurch wird verhindert, dass der Benutzer den Arbeitsbereich an eine feste Wand zieht.
Die Kollisionserkennung dient dazu, ein Flackern im Bereich des Schwellenwerts zu verhindern, Hysteresewird verwendet:
Sobald die Kollision einmal aktiviert ist, |ext_force|bleibt aktiv, bis der Wert unter den folgenden Multiplikator fällt.
collision_detection.force_threshold × collision_detection.exit_ratio.
exit_ratioWird dieser Wert verringert, vergrößert sich der Hysterese-Bereich (die Kollision hält länger an), 1.0Wenn Sie diese Option aktivieren, wird die Hysterese deaktiviert und ein einzelner Schwellenwert verwendet.
{
"collision_detection": {
"enabled": true,
"force_threshold": 0.5,
"inflate_ratio": 2.0,
"exit_ratio": 0.7
}
}
Parameterübersicht
Die am häufigsten angepassten Elemente
| Parameter | Standardwert | Beschreibung |
|---|---|---|
shape | {rounded_box, r=0.01, b=(0.05,0.02,0.03)} | SDF-Form zur Definition einer „Dead Zone“ |
velocity_zone_width | 0.03 m | Dicke der Schale bei der Geschwindigkeitsregelung (Rate-Control) |
max_velocity | 0.5 m/s | Maximale Navigationsgeschwindigkeit |
velocity_ease | "quadratic_in" | Entfernung → Geschwindigkeits-Easing-Kurve |
center.follow | false | Ob der Mittelpunkt dem Cursor folgt |
center.speed | 0.02 m/s | follow = trueDriftgeschwindigkeit beim Fahren |
Vollständige Liste der Parameter
| Feld | Typ | Standardwert | Beschreibung |
|---|---|---|---|
center.position | vec3 | (0, 0, 0) | Anfänglicher Schwerpunkt — relative = truebeim Arbeiten der Offset relativ zum Cursor, falseBei der Ausführung: die absoluten Koordinaten im App-Bereich |
center.relative | bool | true | true: positionist der Versatz vom Cursor aus. false: Dies sind die absoluten Koordinaten im App-Bereich, die an den Grenzen in den Mount-Bereich umgewandelt werden. |
center.follow | bool | false | false: Der Mittelpunkt wird an der initialisierten Position fixiert. true: Der Mittelpunkt folgt dem Cursor |
center.speed | float | 0.02 | follow = trueDriftgeschwindigkeit (m/s) bei . 0.0Dann wird der Cursor bei jedem Tick sofort angepasst. |
shape | Form | {rounded_box, r=0.01, b=(0.05,0.02,0.03)} | SDF-Form der Totzone |
velocity_zone_width | float | 0.03 | Breite der Geschwindigkeitsbegrenzungszone (m) |
max_velocity | float | 0.5 | Maximale Navigationsgeschwindigkeit (m/s) |
velocity_ease | String | "quadratic_in" | Entfernung → Geschwindigkeit – Easing |
reset_velocity_on_entry | bool | true | Sobald der Cursor wieder in den Geschwindigkeitsbereich eintritt, wird die kumulierte Geschwindigkeit auf 0 zurückgesetzt. |
bump_width | float | 0.005 | Taktile Erhebungen auf der Oberfläche (m) |
bump_stiffness | float | 200.0 | Federkonstante der Oberflächenbump-Anschlüsse |
spring_inner | float | 0.0 | Feder mit Blasenmitte |
spring_surface | float | 10.0 | Federn an der Oberfläche |
spring_outer | float | 15.0 | Die Feder an der Außenkante |
wall_stiffness | float | 700.0 | Hard-Wall-Feder, die über die Außenbegrenzung hinausragt |
damping_inner | float | 0.1 | Zentraldämpfung |
damping_surface | float | 4.0 | Oberflächendämpfung |
damping_outer | float | 7.0 | Dämpfung an den Außenrändern |
rotation_enabled | bool | false | Die Drehung des Arbeitsbereichs wird auf die Navigationsrichtung angewendet. |
scale_enabled | bool | false | Die Skalierung des Arbeitsbereichs wird auf die Navigationsgeschwindigkeit angewendet. |
collision_detection.enabled | bool | true | Blockiert die Navigation in Richtung des Zusammenstoßes |
collision_detection.force_threshold | float | 1.0 | Größe der äußeren Kraft (N) zum Einleiten einer Kollision |
collision_detection.inflate_ratio | float | 2.0 | Multiplikationsfaktor, der mit der Breite des Geschwindigkeitsbereichs während der Kollision multipliziert wird (muss ≥ 1,0 sein) |
collision_detection.exit_ratio | float | 0.7 | Hysterese-Verhältnis — |ext_force| < force_threshold × exit_ratiobleibt im Kollisionszustand, bis … Bereich (0, 1]; 1.0In diesem Fall wird die Hysterese deaktiviert. |
Diese beiden Funktionsgruppen werden aus dem JSON-Schema der Version 3.5 entfernt, während ihre Implementierung für Version 3.6 neu gestaltet wird:
- Avatar-Grenzwertbegrenzung:
avatar_boundary_enabled,avatar_boundary,avatar_boundary_hysteresisFeld. - Begrenzung des Arbeitsbereichs:
workspace_bounded,workspace_transition_speed,workspace_transition_easeFeld.
Der Tick-Code wird zwar weiterhin standardmäßig kompiliert und ausgeführt, der Client kann die entsprechenden Felder jedoch weder über HTTP noch über WebSocket lesen oder schreiben. In Version 3.6 ist der Avatar-Grenzwert ein Top-Level-Element auf gleicher Ebene wie das Bubble-Objekt. bounds Es wird als Element erneut bereitgestellt und verfügt über eine vollständige Platzierungstransformation (placement transform). Die Begrenzung des Arbeitsbereichs wird voraussichtlich erneut bereitgestellt, sobald die Untersuchung des Zentrums-Jitters 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_ratioist(0, 1]Es muss innerhalb des Bereichs liegen.center.speed ≥ 0
die ungültige Parameter enthält POST oder configure.navigation Die Anfrage wird abgelehnt, und invalid-value Es tritt ein Ereignis auf. Die vorherige Konfiguration bleibt weiterhin aktiv.
Veranstaltung
| Name der Veranstaltung | Zeitpunkt des Auftretens |
|---|---|
navigation-started | Wenn die Navigation auf dem Gerät aktiviert wird |
navigation-updated | Wenn die Navigationskonfiguration aktualisiert wird, während sie bereits aktiv ist |
navigation-stopped | Wenn die Navigation beendet wird (explizite Deaktivierung, DELETE, oder bei Beendigung der Sitzung) |
invalid-value | Wenn die Navigationskonfiguration bei der Überprüfung abgelehnt wird |
Bekannte Einschränkungen
- 3.5: Ausgeblendete Arbeitsbereichsgrenzen und Avatar-Grenzen: Diese beiden Funktionsgruppen fehlen im JSON-Schema, da sie für Version 3.6 neu strukturiert werden. Bitte beachten Sie den Hinweis oben unter „Parameterreferenz “.
- Uneinheitliche Skalierung + Drehung:
rotation_enabledWowscale_enabledWenn alle Optionen aktiviert sind, ist die Geschwindigkeitsrichtung etwas ungenau. Die Drehung wird nicht auf die Skalenachse angewendet. - Geräteabhängige Größenskalierung: Die Größe der Blasen (Radius, Breite des Bereichs) wird nicht an den physikalischen Skalierungsfaktor des jeweiligen Geräts angepasst. Da „MInverse“ und „Inverse3“ dieselbe absolute Größe verwenden, können sie je nach Gerät unterschiedlich wahrgenommen werden.