Zum Hauptinhalt springen

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 │
└──────────────────────────────────────────┘
ZoneCursorpositionVerhalten
Tote ZoneInnerhalb der BlaseKeine Navigation. Leichte Dämpfung. Sie können die Szene frei bearbeiten.
GeschwindigkeitszoneZwischen der Oberfläche und der AußengrenzeDie Kurve „Entfernung → Geschwindigkeit“ verschiebt den Arbeitsbereich in Richtung des Cursors.
WandbereichJenseits der AußengrenzeEine 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)​

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

Beenden​

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

Weitere HTTP-Routen​

MethodeCheminRolle
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_easeSensationWann sollte man es verwenden?
linearKonstante SteigungVorhersehbar, gute Standardauswahl
quadratic_inLangsamer Start, schnellerer SchubPräzise in der Nähe der Oberfläche, lange, schnelle Fahrt
cubic_inSehr langsamer StartSehr präzise, auf langen Strecken nimmt die Geschwindigkeit zu
sine_outSchneller und flüssiger Start, Trittplatte nahe der AußenseiteReaktionsfreudig, gleitet sanft aus
quadratic_outSchnell beim Anfahren, komfortabel auf langen StreckenEin 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:

relativeSemantik 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.
falseposition 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:

followspeedVerhaltenVorherige Entsprechung
false (Standard)ignoriertDer Mittelpunkt bleibt an seiner ursprünglichen Position – fester Mittelpunkt.center_mode: "fixed"
true> 0Der Mittelpunkt bewegt sich mit der Geschwindigkeit speed (m/s), solange sich der Cursor darin befindet.center_mode: "auto_follow" (mit center_drift_speed)
true0.0Der Mittelpunkt wird bei jedem Zyklus auf den Cursor ausgerichtet – Teleportationseffekt.center_mode: "track_cursor"
In Version 3.5 geänderter Standardwert

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_ratio Mal velocity_zone_width), um dem Nutzer mehr Spielraum zu geben, das Hindernis zu umfahren.
  • Wenn collision_detection.enabled ist wert true (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​

ParameterStandardwertBeschreibung
shape{rounded_box, r=0.01, b=(0.05,0.02,0.03)}SDF-Form, die die Totzone definiert
velocity_zone_width0.03 mDicke der Kontrollhülle bei Geschwindigkeit
max_velocity0.5 m/sHöchstgeschwindigkeit
velocity_ease"quadratic_in"Übergangskurve von der Entfernung zur Geschwindigkeit
center.followfalseGeben Sie an, ob der Mittelpunkt dem Cursor folgt
center.speed0.02 m/sDriftgeschwindigkeit, wenn follow = true

Vollständige Liste der Parameter​

ChampTypStandardwertBeschreibung
center.positionvec3(0, 0, 0)Zentrierung – Versatz gegenüber dem Cursor, wenn relative = true, absoluter Punkt im Abbildungsraum, wenn false
center.relativebooltruetrue : position ist ein Versatz gegenüber dem Cursor. false : absoluter Punkt des Abbildungsraums, der an der Grenze in einen Montage-Raum umgewandelt wird
center.followboolfalsefalse : Der Mittelpunkt bleibt an seiner Ausgangsposition. true : Die Mitte folgt dem Cursor
center.speedfloat0.02Driftgeschwindigkeit (m/s), wenn follow = true ; 0.0 Zentriere das Zentrum bei jedem Zyklus auf den Cursor
shapeForm{rounded_box, r=0.01, b=(0.05,0.02,0.03)}SDF-Form der toten Zone
velocity_zone_widthfloat0.03Dicke der Kontrollhülle bei Geschwindigkeit (m)
max_velocityfloat0.5Maximale Fahrgeschwindigkeit (m/s)
velocity_easeString"quadratic_in"Übergang von der Entfernung zur Geschwindigkeit
reset_velocity_on_entrybooltrueSetzt die kumulierte Geschwindigkeit zurück, sobald der Cursor wieder in den Geschwindigkeitsbereich gelangt
bump_widthfloat0.005Oberflächen-Tastnoppen (m)
bump_stiffnessfloat200.0Steifigkeitskonstante der Feder von der Erhebung bis zur Oberfläche
spring_innerfloat0.0Feder im Zentrum der Blase
spring_surfacefloat10.0An die Oberfläche zurückkehren
spring_outerfloat15.0Zuständigkeit an der Außengrenze
wall_stiffnessfloat700.0Steifigkeit der starren Wandfeder jenseits der Außengrenze
damping_innerfloat0.1Abschreibung in der Mitte
damping_surfacefloat4.0Flächenbezogene Abschreibung
damping_outerfloat7.0Abschreibung an der Außengrenze
rotation_enabledboolfalseWende die Drehung des Arbeitsbereichs auf die Navigationsrichtung an
scale_enabledboolfalseWende den Maßstab des Arbeitsbereichs auf die Navigationsgeschwindigkeit an
collision_detection.enabledbooltrueBlockieren Sie die Fahrt in Richtung des Unfalls
collision_detection.force_thresholdfloat1.0Stärke der für eine Kollision erforderlichen äußeren Kraft (N)
collision_detection.inflate_ratiofloat2.0Multiplikator für die Breite der Geschwindigkeitszone bei einer Kollision (muss ≥ 1,0 sein)
collision_detection.exit_ratiofloat0.7Hystereseverhältnis – bleibt in der Kollision, solange |ext_force| < force_threshold × exit_ratio. Strand (0, 1] ; 1.0 deaktiviert die Hysterese
Versteckte Felder in Version 3.5

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_boundary et avatar_boundary_hysteresis.
  • Abgrenzung des Arbeitsbereichs : die Felder workspace_bounded, workspace_transition_speed et workspace_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 > 0
  • 0 ≤ bump_width < velocity_zone_width
  • max_velocity > 0
  • bump_stiffness ≥ 0
  • spring_inner ≥ 0 et spring_inner ≤ spring_surface ≤ spring_outer
  • wall_stiffness ≥ 0
  • damping_inner ≥ 0 et damping_inner ≤ damping_surface ≤ damping_outer
  • collision_detection.force_threshold > 0
  • collision_detection.inflate_ratio ≥ 1.0
  • collision_detection.exit_ratio dans (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 VeranstaltungWird ausgelöst, wenn
navigation-startedAuf einem Gerät ist die Navigation aktiviert
navigation-updatedDie Navigationseinstellungen werden aktualisiert, obwohl sie bereits aktiv sind.
navigation-stoppedDie Navigation ist deaktiviert (ausdrückliche Deaktivierung, DELETE (oder Abmeldung)
invalid-valueEine 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_enabled et scale_enabled Sind 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.