Zum Hauptinhalt springen
Version: 3.5.x

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 │
└──────────────────────────────────────────┘
ZoneCursorpositionVerhalten
Tote ZoneInnerhalb der BlaseKeine Navigation. Leichte Dämpfung. Du kannst die Szene frei manipulieren.
GeschwindigkeitszoneZwischen der Oberfläche und der äußeren GrenzeDie Kurve „Weg → Geschwindigkeit“ verschiebt den Arbeitsbereich in Richtung des Cursors.
WandbereichJenseits der äußeren GrenzeEine 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)

{
"inverse3": [
{
"device_id": "04C3",
"configure": {
"navigation": { "mode": "bubble" }
}
}
]
}

Stopp

{
"inverse3": [
{
"device_id": "04C3",
"configure": {
"navigation": { "mode": "disabled" }
}
}
]
}

Weitere HTTP-Routen

MethodePfadZweck
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_easeFühlenWann anzuwenden
linearKonstante SteigungVorhersehbar, gute Standardauswahl
quadratic_inLangsamer Start, schneller EndspurtPräzise im Nahbereich, schnell bei großen Verfahrwegen
cubic_inEin sehr langsamer StartSehr präzise, mit langem Hub
sine_outSanfter, schneller Start, flacht im äußeren Bereich abReaktionsschnell, mit sanften Großbuchstaben
quadratic_outSchnell beim Anfahren, komfortabel auf langen StreckenSchnelles 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_modeVerhaltenAnwendungsfall
auto_follow (Standard)bewegt sich langsam auf den Cursor zu center_drift_speed wenn sich der Cursor innerhalb der Sprechblase befindetAllgemeine Navigation – die Mitte „entspannt“ sich zwischen den Tastenanschlägen wieder unter dem Cursor
fixedDie Mitte verschiebt sich nie automatischNavigation mit einem bestimmten Bezugspunkt als Ankerpunkt
track_cursorDie Mitte springt bei jedem Ticken zum CursorBewegung 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_scale Mal velocity_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

ParameterStandardBeschreibung
shape{sphere, r=0.05}SDF-Form, die die Totzone definiert
velocity_zone_width0.03 mDicke der Hülle zur Geschwindigkeitsregelung
max_velocity1.0 m/sMaximale Fahrgeschwindigkeit
velocity_ease"linear"Entfernung → Geschwindigkeits-Easing-Kurve
center_mode"auto_follow"Wie das Zentrum den Cursor verfolgt
workspace_boundedfalseBefestigung in der Mitte des physischen Arbeitsbereichs des Geräts

Vollständige Parameterliste

FeldTypStandardBeschreibung
centervec3(0,0,0)Anfangsposition der Blase im Einbauraum
shapeForm{sphere, r=0.05}SDF-Form der Totzone
velocity_zone_widthfloat0.03Breite der Durchflussregelungshülle (m)
max_velocityfloat1.0Maximale Fahrgeschwindigkeit (m/s)
velocity_easeString"linear"Entfernung→Geschwindigkeits-Easing
reset_velocity_on_entrybooltrueDie kumulierte Geschwindigkeit auf Null zurücksetzen, wenn der Cursor erneut in den Geschwindigkeitsbereich gelangt
bump_widthfloat0.003Taktile Erhebung an der Oberfläche (m)
bump_stiffnessfloat500.0Federkonstante der Oberflächenunebenheit
spring_innerfloat4.0Frühling im Bubble Centre
spring_surfacefloat7.0Frühling an der Oberfläche
spring_outerfloat12.0Frühling an der Außengrenze
wall_stiffnessfloat700.0Feder mit harter Wand hinter der Außengrenze
damping_innerfloat0.2Dämpfung in der Mitte
damping_surfacefloat0.7Dämpfung an der Oberfläche
damping_outerfloat5.0Dämpfung an der Außengrenze
rotation_enabledboolfalseWende die Drehung des Arbeitsbereichs auf die Navigationsrichtung an
scale_enabledboolfalseWende den Arbeitsbereichsmaßstab auf die Navigationsgeschwindigkeit an
center_modeenum"auto_follow""auto_follow" / "fixed" / "track_cursor"
center_drift_speedfloat0.03Driftgeschwindigkeit in auto_follow Geschwindigkeit (m/s)
workspace_boundedboolfalseDie Blase in der Mitte des Arbeitsbereichs des Geräts fixieren
workspace_transition_speedfloat1.2Geschwindigkeit des anfänglichen Klemmübergangs
workspace_transition_easeString"quadratic_in_out"Abmilderung des anfänglichen Klemmenübergangs
stop_at_collisionboolfalseNavigation in Kollisionsrichtung blockieren
collision_thresholdfloat0.001Schwellenwert für die äußere Kraft zur Erkennung einer Kollision (N)
collision_inflate_scalefloat2.0Multiplikator für die Breite der Geschwindigkeitszone bei einer Kollision
avatar_boundary_enabledboolfalseAvatar-Begrenzungs-Clamping aktivieren
avatar_boundaryForm{sphere, r=0.1}SDF-Form für die Beschränkung der Avatar-Position

Validierungsregeln

  • velocity_zone_width > 0
  • 0 ≤ bump_width < velocity_zone_width
  • max_velocity > 0
  • spring_inner ≤ spring_surface ≤ spring_outer
  • damping_inner ≤ damping_surface ≤ damping_outer
  • collision_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 VeranstaltungEntlassen, als
navigation-startedDie Navigation ist auf dem Gerät aktiviert
navigation-updatedDie Navigationseinstellungen werden aktualisiert, während die Navigation bereits aktiv ist
navigation-stoppedDie Navigation ist deaktiviert (explizite Deaktivierung, DELETEoder beim Schließen der Sitzung)
invalid-valueEine Navigationskonfiguration wird bei der Validierung abgelehnt

Bekannte Einschränkungen

  • Nicht einheitliche Skalierung + Drehung: wenn beide rotation_enabled und scale_enabled sind 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.