Zum Haupttext springen

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 │
└──────────────────────────────────────────┘
BereichCursorpositionBewegung
Tote ZoneIm Inneren der BlaseEs gibt keine Navigation. Es wird eine leichte Dämpfung angewendet. Die Szene lässt sich frei steuern.
GeschwindigkeitsbereichZwischen der Oberfläche und der AußenkonturDer Arbeitsbereich bewegt sich entsprechend der Kurve „Weg → Geschwindigkeit“ in Richtung des Cursors.
WandbereichJenseits der äußeren GrenzeEine 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)​

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

Stopp​

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

Sonstige HTTP-Pfade​

MethodePfadVerwendungszweck
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_easeGefühlAnwendungszeitpunkt
lineargleichmäßige ZunahmeVorhersehbare und unauffällige Standardwerte
quadratic_inLangsamer Start, schneller VorstoßIn der Nähe der Oberfläche präzise, auf große Entfernungen schnell
cubic_inEin sehr langsamer StartSehr präzise und bei Langstreckenfahrten schrittweise Beschleunigung
sine_outSanfter und schneller Start, der sich in der Nähe der Außenkante abschwächtDie Reaktion erfolgt schnell, und die Obergrenze wird allmählich erreicht.
quadratic_outSchnell beim Anfahren, komfortabel auf langen StreckenSchnelle 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:

relativepositiondie 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.
falseposition은 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:

followspeedBewegungVorherige gleichwertige Einstellung
false (Standardwert)IgnoriertDer Mittelpunkt bleibt an seiner ursprünglichen Position erhalten – fester Mittelpunkt.center_mode: "fixed"
true> 0Solange 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)
true0.0Bei 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"
Änderung der Standardwerte in Version 3.5

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_widthvon collision_detection.inflate_ratio(bis zum Bauch). Dadurch vergrößert sich der Bewegungsspielraum, den der Benutzer um Hindernisse herum hat.
  • collision_detection.enabledga true(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​

ParameterStandardwertBeschreibung
shape{rounded_box, r=0.01, b=(0.05,0.02,0.03)}SDF-Form zur Definition einer „Dead Zone“
velocity_zone_width0.03 mDicke der Schale bei der Geschwindigkeitsregelung (Rate-Control)
max_velocity0.5 m/sMaximale Navigationsgeschwindigkeit
velocity_ease"quadratic_in"Entfernung → Geschwindigkeits-Easing-Kurve
center.followfalseOb der Mittelpunkt dem Cursor folgt
center.speed0.02 m/sfollow = trueDriftgeschwindigkeit beim Fahren

Vollständige Liste der Parameter​

FeldTypStandardwertBeschreibung
center.positionvec3(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.relativebooltruetrue: 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.followboolfalsefalse: Der Mittelpunkt wird an der initialisierten Position fixiert. true: Der Mittelpunkt folgt dem Cursor
center.speedfloat0.02follow = trueDriftgeschwindigkeit (m/s) bei . 0.0Dann wird der Cursor bei jedem Tick sofort angepasst.
shapeForm{rounded_box, r=0.01, b=(0.05,0.02,0.03)}SDF-Form der Totzone
velocity_zone_widthfloat0.03Breite der Geschwindigkeitsbegrenzungszone (m)
max_velocityfloat0.5Maximale Navigationsgeschwindigkeit (m/s)
velocity_easeString"quadratic_in"Entfernung → Geschwindigkeit – Easing
reset_velocity_on_entrybooltrueSobald der Cursor wieder in den Geschwindigkeitsbereich eintritt, wird die kumulierte Geschwindigkeit auf 0 zurückgesetzt.
bump_widthfloat0.005Taktile Erhebungen auf der Oberfläche (m)
bump_stiffnessfloat200.0Federkonstante der Oberflächenbump-Anschlüsse
spring_innerfloat0.0Feder mit Blasenmitte
spring_surfacefloat10.0Federn an der Oberfläche
spring_outerfloat15.0Die Feder an der Außenkante
wall_stiffnessfloat700.0Hard-Wall-Feder, die über die Außenbegrenzung hinausragt
damping_innerfloat0.1Zentraldämpfung
damping_surfacefloat4.0Oberflächendämpfung
damping_outerfloat7.0Dämpfung an den Außenrändern
rotation_enabledboolfalseDie Drehung des Arbeitsbereichs wird auf die Navigationsrichtung angewendet.
scale_enabledboolfalseDie Skalierung des Arbeitsbereichs wird auf die Navigationsgeschwindigkeit angewendet.
collision_detection.enabledbooltrueBlockiert die Navigation in Richtung des Zusammenstoßes
collision_detection.force_thresholdfloat1.0Größe der äußeren Kraft (N) zum Einleiten einer Kollision
collision_detection.inflate_ratiofloat2.0Multiplikationsfaktor, der mit der Breite des Geschwindigkeitsbereichs während der Kollision multipliziert wird (muss ≥ 1,0 sein)
collision_detection.exit_ratiofloat0.7Hysterese-Verhältnis — |ext_force| < force_threshold × exit_ratiobleibt im Kollisionszustand, bis … Bereich (0, 1]; 1.0In diesem Fall wird die Hysterese deaktiviert.
Versteckte Felder in Version 3.5

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_hysteresis Feld.
  • Begrenzung des Arbeitsbereichs: workspace_bounded, workspace_transition_speed, workspace_transition_ease Feld.

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 > 0
  • 0 ≤ bump_width < velocity_zone_width
  • max_velocity > 0
  • bump_stiffness ≥ 0
  • spring_inner ≥ 0 Und spring_inner ≤ spring_surface ≤ spring_outer
  • wall_stiffness ≥ 0
  • damping_inner ≥ 0 Und damping_inner ≤ damping_surface ≤ damping_outer
  • collision_detection.force_threshold > 0
  • collision_detection.inflate_ratio ≥ 1.0
  • collision_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 VeranstaltungZeitpunkt des Auftretens
navigation-startedWenn die Navigation auf dem Gerät aktiviert wird
navigation-updatedWenn die Navigationskonfiguration aktualisiert wird, während sie bereits aktiv ist
navigation-stoppedWenn die Navigation beendet wird (explizite Deaktivierung, DELETE, oder bei Beendigung der Sitzung)
invalid-valueWenn 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_enabledWow scale_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.