Navigation
Das Navigationsmodul ermöglicht es einem Inverse3 , den Arbeitsbereich der Anwendung zu verschieben – manchmal auch als „Rate-Control-Locomotion“ oder „gamepadähnliche Drift“ bezeichnet. Anstatt dass der Cursor am Rand des physischen Arbeitsbereichs auf eine harte Wand trifft, betritt er eine weiche Hülle, in der sein Abstand zu einem virtuellen Zentrum auf eine Geschwindigkeit abgebildet wird, die den gesamten Arbeitsbereich verschiebt. Je weiter der Cursor drückt, desto schneller scrollt die Szene.
Das primäre (und derzeit einzige) Verhalten ist die Bubble-Navigation. Die Blasenform wird mithilfe einer SDF-Primitive definiert – siehe „Was ist ein SDF?“ für eine Erläuterung des Konzepts.
Bubble-Navigation – Konzept
Eine virtuelle Blase wird um einen Mittelpunkt im Einbauraum des Geräts herum verankert. Der Cursor durchläuft drei konzentrische 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. Du kannst die Szene frei manipulieren. |
| Geschwindigkeitszone | Zwischen der Oberfläche und der äußeren Grenze | Die Kurve „Weg → Geschwindigkeit“ verschiebt den Arbeitsbereich in Richtung des Cursors. |
| Wandbereich | Jenseits der äußeren Grenze | Eine starke Feder drückt den Cursor zurück, und die Navigationsgeschwindigkeit erreicht ihren Höchstwert. |
In allen drei Bereichen wird eine haptische Kraft durch Feder-Dämpfer-Mechanismen erzeugt – man spürt die Oberfläche, die Drift-Hülle und die Außenwand.
Schnellstart – Bubble-Navigation aktivieren
Die Navigation ist eine dauerhafte, einmalige Konfiguration – sobald sie einmal gesendet wurde, bleibt sie aktiv, bis Sie sie explizit beenden, den Dienst neu starten oder die Sitzung schließen.
Start (Minimal – kugelförmige Blase mit Standardgröße)
- 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 | Zweck |
|---|---|---|
GET | /{type}/{id}/config/navigation?session=<expr> | Aktuelle Navigationskonfiguration + Status |
POST | /{type}/{id}/config/navigation?session=<expr> | Navigation starten oder aktualisieren |
DELETE | /{type}/{id}/config/navigation?session=<expr> | Navigation beenden |
Katalog für Blasenformen
Die tote Zone der Blase wird durch eine SDF-Form (Signed-Distance-Function) beschrieben. Unterschiedliche Formen sorgen für unterschiedliche Navigationserlebnisse – eine Kugel für isotropes Driften, ein Ellipsoid oder ein Quader zur Bevorzugung bestimmter Achsen, eine Kapsel für Korridore.
Kugel (Standard)
{
"shape": {
"primitive": "sphere",
"parameters": { "r": 0.05 }
}
}
Ellipsoid – in X/Z-Richtung breiter als in Y-Richtung
Verwenden Sie diese Einstellung, wenn sich die horizontale Drift lockerer anfühlen soll als die vertikale:
{
"shape": {
"primitive": "ellipsoid",
"parameters": { "a": { "x": 0.06, "y": 0.03, "z": 0.06 } }
}
}
Abgerundete Box – rechteckige Totzone mit abgerundeten Ecken
{
"shape": {
"primitive": "rounded_box",
"parameters": { "b": { "x": 0.04, "y": 0.02, "z": 0.04 }, "r": 0.008 }
}
}
Kapsel – langgestreckter Korridor
Zwei Endpunkte a/b plus ein Radius 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 Größenanpassung 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",
"workspace_bounded": true
}
}
}
}
]
}
Geschwindigkeitskurve
Der Abstand zur Geschwindigkeitszone wird über eine Beschleunigungskurve abgebildet, bevor er in die Geschwindigkeit im Arbeitsbereich umgewandelt wird. Wählen Sie die Beschleunigungskurve, die dem gewünschten Beschleunigungsverlauf der Szene entspricht, wenn der Benutzer tiefer in die Hülle vordringt.
velocity_ease | Fühlen | Wann anzuwenden |
|---|---|---|
linear | Konstante Steigung | Vorhersehbar, gute Standardauswahl |
quadratic_in | Langsamer Start, schneller Endspurt | Präzise im Nahbereich, schnell bei großen Verfahrwegen |
cubic_in | Ein sehr langsamer Start | Sehr präzise, mit langem Hub |
sine_out | Sanfter, schneller Start, flacht im äußeren Bereich ab | Reaktionsschnell, mit sanften Großbuchstaben |
quadratic_out | Schnell beim Anfahren, komfortabel auf langen Strecken | Schnelles Beschleunigen, komfortables Cruisen |
{ "velocity_ease": "quadratic_in", "max_velocity": 1.5 }
Zentrierungsmodi
Der Mittelpunkt der Blase kann dem Cursor folgen, sich an ihn ausrichten oder im Bildausschnitt feststehen.
center_mode | Verhalten | Anwendungsfall |
|---|---|---|
auto_follow (Standard) | bewegt sich langsam auf den Cursor zu center_drift_speed wenn sich der Cursor innerhalb der Sprechblase befindet | Allgemeine Navigation – die Mitte „entspannt“ sich zwischen den Tastenanschlägen wieder unter dem Cursor |
fixed | Die Mitte verschiebt sich nie automatisch | Navigation mit einem bestimmten Bezugspunkt als Ankerpunkt |
track_cursor | Die Mitte springt bei jedem Ticken zum Cursor | Bewegung im Teleport-Stil – der Cursor befindet sich immer in der Mitte der Blase |
{ "center_mode": "fixed" }
In jedem Modus gilt: Wenn der Cursor die äußere Begrenzung überschreitet, folgt die Mitte dem Cursor, um die Blase um ihn herum zu halten und zu verhindern, dass der Cursor entwischt.
Begrenzung des Arbeitsbereichs
Die meisten Geräte haben eine begrenzte Reichweite. Wenn workspace_bounded ist festgelegt,
bleibt der Mittelpunkt der Blase innerhalb des physischen Arbeitsbereichs des Geräts, sodass
die daraus resultierende Navigation den Cursor nicht außerhalb seines erreichbaren Bereichs bewegt.
{ "workspace_bounded": true }
Liegt der Ausgangspunkt außerhalb des Arbeitsbereichs, verschiebt das Modul ihn
im Laufe der Zeit wieder hinein (workspace_transition_speed / workspace_transition_ease)
anstatt zu ruckeln – wodurch ein haptischer Ruck beim Start vermieden wird.
Grenzen des Avatars
Wenn avatar_boundary_enabled ist festgelegt, das endgültige Position des Avatars in der Welt
(Arbeitsbereich + Cursor) wird innerhalb einer beliebigen SDF-Form begrenzt. Nützlich, um
den Benutzer in einem Raum, einem Korridor, einem Fahrzeugcockpit usw. zu halten, ohne
dass pro Achse Begrenzungen programmiert werden müssen.
{
"avatar_boundary_enabled": true,
"avatar_boundary": {
"primitive": "box",
"parameters": { "b": { "x": 5.0, "y": 3.0, "z": 5.0 } }
}
}
Die avatar_boundary Die Form akzeptiert dieselben Grundformen wie die Blasenform
(sphere, ellipsoid, rounded_box, capsule, box, ...).
Reaktion bei einer Kollision
Die Blase reagiert auf äußere Cursorkräfte, die collision_threshold:
- Die Geschwindigkeitszone vorübergehend bläst auf (bis zu
collision_inflate_scaleMalvelocity_zone_width), um dem Benutzer mehr Spielraum zu geben, das Hindernis zu umfahren. - Mit
stop_at_collision, weigert sich der Mittelpunkt der Blase, in die Richtung der Kollisionskraft zu driften, wodurch verhindert wird, dass der Benutzer den Arbeitsbereich gegen eine feste Wand zieht.
{ "stop_at_collision": true, "collision_threshold": 0.5, "collision_inflate_scale": 2.0 }
Parameterübersicht
Am häufigsten gestimmt
| Parameter | Standard | Beschreibung |
|---|---|---|
shape | {sphere, r=0.05} | SDF-Form, die die Totzone definiert |
velocity_zone_width | 0.03 m | Dicke der Hülle zur Geschwindigkeitsregelung |
max_velocity | 1.0 m/s | Maximale Fahrgeschwindigkeit |
velocity_ease | "linear" | Entfernung → Geschwindigkeits-Easing-Kurve |
center_mode | "auto_follow" | Wie das Zentrum den Cursor verfolgt |
workspace_bounded | false | Befestigung in der Mitte des physischen Arbeitsbereichs des Geräts |
Vollständige Parameterliste
| Feld | Typ | Standard | Beschreibung |
|---|---|---|---|
center | vec3 | (0,0,0) | Anfangsposition der Blase im Einbauraum |
shape | Form | {sphere, r=0.05} | SDF-Form der Totzone |
velocity_zone_width | float | 0.03 | Breite der Durchflussregelungshülle (m) |
max_velocity | float | 1.0 | Maximale Fahrgeschwindigkeit (m/s) |
velocity_ease | String | "linear" | Entfernung→Geschwindigkeits-Easing |
reset_velocity_on_entry | bool | true | Die kumulierte Geschwindigkeit auf Null zurücksetzen, wenn der Cursor erneut in den Geschwindigkeitsbereich gelangt |
bump_width | float | 0.003 | Taktile Erhebung an der Oberfläche (m) |
bump_stiffness | float | 500.0 | Federkonstante der Oberflächenunebenheit |
spring_inner | float | 4.0 | Frühling im Bubble Centre |
spring_surface | float | 7.0 | Frühling an der Oberfläche |
spring_outer | float | 12.0 | Frühling an der Außengrenze |
wall_stiffness | float | 700.0 | Feder mit harter Wand hinter der Außengrenze |
damping_inner | float | 0.2 | Dämpfung in der Mitte |
damping_surface | float | 0.7 | Dämpfung an der Oberfläche |
damping_outer | float | 5.0 | Dämpfung an der Außengrenze |
rotation_enabled | bool | false | Wende die Drehung des Arbeitsbereichs auf die Navigationsrichtung an |
scale_enabled | bool | false | Wende den Arbeitsbereichsmaßstab auf die Navigationsgeschwindigkeit an |
center_mode | enum | "auto_follow" | "auto_follow" / "fixed" / "track_cursor" |
center_drift_speed | float | 0.03 | Driftgeschwindigkeit in auto_follow Geschwindigkeit (m/s) |
workspace_bounded | bool | false | Die Blase in der Mitte des Arbeitsbereichs des Geräts fixieren |
workspace_transition_speed | float | 1.2 | Geschwindigkeit des anfänglichen Klemmübergangs |
workspace_transition_ease | String | "quadratic_in_out" | Abmilderung des anfänglichen Klemmenübergangs |
stop_at_collision | bool | false | Navigation in Kollisionsrichtung blockieren |
collision_threshold | float | 0.001 | Schwellenwert für die äußere Kraft zur Erkennung einer Kollision (N) |
collision_inflate_scale | float | 2.0 | Multiplikator für die Breite der Geschwindigkeitszone bei einer Kollision |
avatar_boundary_enabled | bool | false | Avatar-Begrenzungs-Clamping aktivieren |
avatar_boundary | Form | {sphere, r=0.1} | SDF-Form für die Beschränkung der Avatar-Position |
Validierungsregeln
velocity_zone_width > 00 ≤ bump_width < velocity_zone_widthmax_velocity > 0spring_inner ≤ spring_surface ≤ spring_outerdamping_inner ≤ damping_surface ≤ damping_outercollision_threshold > 0,collision_inflate_scale ≥ 1.0- Alle Geschwindigkeitswerte sind nicht negativ
A POST oder configure.navigation mit ungültigen Parametern wird abgelehnt und eine
invalid-value Das Ereignis wird ausgelöst; die vorherige Konfiguration bleibt aktiv.
Veranstaltungen
| Name der Veranstaltung | Entlassen, als |
|---|---|
navigation-started | Die Navigation ist auf dem Gerät aktiviert |
navigation-updated | Die Navigationseinstellungen werden aktualisiert, während die Navigation bereits aktiv ist |
navigation-stopped | Die Navigation ist deaktiviert (explizite Deaktivierung, DELETEoder beim Schließen der Sitzung) |
invalid-value | Eine Navigationskonfiguration wird bei der Validierung abgelehnt |
Bekannte Einschränkungen
- Nicht einheitliche Skalierung + Drehung: wenn beide
rotation_enabledundscale_enabledsind aktiviert, ist die Geschwindigkeitsrichtung leicht ungenau – die Drehung wird nicht auf die Skalenachsen angewendet. - Arbeitsbereichsbegrenzender Übergang: Der sanfte Rückstellübergang wird nur bei der Initialisierung ausgeführt. Wenn der Mittelpunkt der Blase während des normalen Betriebs außerhalb des Arbeitsbereichs driftet, springt die Begrenzung ohne Überblendung zurück.
- Größenskalierung pro Gerät: Die Blasengrößen (Radius, Zonenbreite) werden nicht anhand des physikalischen Skalierungsfaktors des Geräts skaliert – Minverse Inverse3 dieselben absoluten Größen, was auf den jeweiligen Geräten unterschiedlich wirken kann.