Navigation
Mit dem Navigationsmodul können Sie den Arbeitsbereich der Anwendung mit dem Cursor unterInverse3 verschieben. Dies wird manchmal auch als „rate-control locomotion“ oder „gamepad-like drift“ bezeichnet. Anstatt am Rand des physischen Arbeitsbereichs auf eine harte Wand zu stoßen, gelangt der Cursor in einen Bereich mit einer weichen Hülle, in dem die Entfernung vom virtuellen Zentrum in die Geschwindigkeit umgewandelt wird, mit der der gesamte Arbeitsbereich verschoben wird. Je weiter Sie den Cursor nach außen schieben, desto schneller scrollt die Szene.
Die wichtigste (und derzeit einzige) Funktion ist die „Bubble Navigation “. Die Form der Blasen wird mithilfe vonSDF-Primitiven definiert. Informationen zum Konzept finden Sie unter „Was ist SDF? “.
Bubble Navigation – Überblick
Die virtuelle Blase wird relativ zum Mittelpunkt des Einbindungsverzeichnisses des Geräts positioniert. Der Cursor durchläuft die folgenden 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 │
└──────────────────────────────────────────┘
| Zone | Cursorposition | Betrieb |
|---|---|---|
| Tote Zone (unempfindlicher Bereich) | Im Inneren der Blase | Es findet keine Navigation statt. Es wird eine leichte Dämpfung angewendet. Sie können die Szene frei steuern. |
| Geschwindigkeitszone | Zwischen der Oberfläche und der äußeren Grenze | Anhand der Kurve von der Entfernung zur Geschwindigkeit verschiebt sich der Arbeitsbereich in Richtung des Cursors. |
| Wandzone | eine Position jenseits der äußeren Grenze | Eine harte Feder drückt den Cursor nach innen zurück, wodurch die Navigationsgeschwindigkeit an der Obergrenze ausgereizt wird. |
In allen drei Zonen wirken feder- und dämpferartige taktile Kräfte, sodass Sie die Oberfläche, die Drift-Schale und die Außenwand wahrnehmen können.
Schnellstart – „Bubble Navigation“ aktivieren
Die Navigation ist eine dauerhafte, einmalige Einstellung. Sobald sie gesendet wurde, bleibt sie so lange aktiv, bis sie ausdrücklich beendet wird, der Dienst neu gestartet wird oder die Sitzung geschlossen wird.
Start (Mindestkonfiguration – Standard-Bubble mit abgerundeten Ecken)
- 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-Endpunkte
| Methode | Pass | 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 |
Übersicht über die Blasenformen
Die „Dead Zone“ (unempfindliche Zone) der Blase wird durch die Form der vorzeichenbehafteten Abstandsfunktion (SDF) definiert. Je nach Form unterscheidet sich das Navigationsgefühl. Für eine angenehme rechteckige Ruhezone wird ein Kasten mit abgerundeten Ecken (Standard) verwendet, für isotropes Driften eine Kugel, für die Bevorzugung bestimmter Achsen ein Ellipsoid und für Durchgänge eine Kapsel.
Box mit abgerundeten Ecken (Standard)
Die Standard-Tote Zone ist ein flacher Raum, der in der Höhe etwas größer ist als in der Tiefe. Sie ist so angepasst, dass sie sich sowohl bei „Inverse3 “ als auch bei „ MInverse “ angenehm anfühlt:
{
"shape": {
"primitive": "rounded_box",
"parameters": { "b": { "x": 0.05, "y": 0.02, "z": 0.03 }, "r": 0.01 }
}
}
Kugel – isotropes Driften
{
"shape": {
"primitive": "sphere",
"parameters": { "r": 0.05 }
}
}
Ellipsoid – Die X- und Z-Achse sind breiter als die Y-Achse
Dies wird verwendet, wenn die horizontale Drift als weniger stark empfunden werden soll als die vertikale:
{
"shape": {
"primitive": "ellipsoid",
"parameters": { "a": { "x": 0.06, "y": 0.03, "z": 0.06 } }
}
}
Kapsel – schmaler Gang
2 Endpunkte a/b und Radius r Geben Sie Folgendes an:
{
"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 für die individuelle Anpassung von Größe 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 Entfernungen in den Geschwindigkeitszonen werden über eine Beschleunigungskurve abgebildet, bevor sie in die Geschwindigkeit des Arbeitsbereichs umgewandelt werden. Wählen Sie die Beschleunigung entsprechend der gewünschten Beschleunigung der Szene aus, wenn der Benutzer in die Tiefe der Hülle drückt.
velocity_ease | Eindruck | Anwendungsbereiche |
|---|---|---|
linear | eine bestimmte Steigung | Es ist leicht vorhersehbar und eignet sich als Standardoption. |
quadratic_in | Der Anlauf ist sanft, der anschließende Vorstoß ist schnell. | Präzision im Oberflächenbereich, hohe Geschwindigkeit bei langen Verfahrwegen |
cubic_in | Ein sehr langsamer Anlauf | Sehr präzise, bei langen Bewegungen wird allmählich beschleunigt |
sine_out | Sanfter und schneller Anlauf, im äußeren Bereich kommt es zum Stillstand | Hohe Ansprechbarkeit, erreicht die Obergrenze sanft |
quadratic_out | Schnell beim Anfahren und komfortabel auch auf langen Strecken | Schnelle Feineinstellung, komfortables Fahren |
{ "velocity_ease": "quadratic_in", "max_velocity": 1.5 }
Funktionsweise des Zentrums
Das Zentrum der Blase war verschachtelt. center Die Einstellung erfolgt über ein Objekt. Dieses Objekt verfügt über vier Felder — position、relative、follow、speed — besitzt und zuvor center、center_enabled、center_mode、center_drift_speed Es handelt sich um eine Alternative zu einem flachen Layout.
{
"center": {
"position": { "x": 0.0, "y": 0.0, "z": 0.0 },
"relative": true,
"follow": false,
"speed": 0.02
}
}
Mittelpunkt
position und relative steuert die Anfangsposition des Zentrums bei der Aktivierung:
relative | position die Bedeutung von |
|---|---|
true(Standard) | position は Versatz vom Cursor . Der Schwerpunkt lag anfangs auf cursor + position wird. Die Standard- (0, 0, 0) In diesem Fall wird die Blase genau an der Cursorposition erzeugt. |
false | position は Absoluter Punkt im Anwendungsraum . Da der Wert bei der Eingabe in den Mount-Bereich konvertiert und bei der Ausgabe wieder in den Anwendungsbereich zurückgewandelt wird, stimmen die Werte bei Hin- und Rückweg überein. |
Die weiteren Entwicklungen des Zentrums
Nachdem die Blase aktiviert wurde, verhält sich das System bei jedem Tick wie folgt: follow und speed wird gesteuert durch:
follow | speed | Betrieb | Bisherige entsprechende Einstellung |
|---|---|---|---|
false(Standard) | Ignorieren | Der Mittelpunkt bleibt an seiner initialisierten Position – ein 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 auf den Cursor zu. | center_mode: "auto_follow"(center_drift_speed (verwenden) |
true | 0.0 | Der Mittelpunkt rastet bei jedem Klick am Cursor ein – das fühlt sich an wie Teleportieren. | center_mode: "track_cursor" |
Das Standardverhalten der Zentrierung ist derzeit Fixieren(follow = false) In früheren Versionen driftete der Cursor standardmäßig in Richtung des Cursors (auto_follow). Um wieder zum alten Drift-Verhalten zurückzukehren, center.follow = true einstellen undcenter.speed im Vergleich zu dem früheren center_drift_speed Bitte passen Sie den Wert entsprechend an.
follow = true Wenn der Cursor in diesem Zustand die äußere Begrenzung überschreitet,speed Unabhängig vom Wert folgt der Mittelpunkt dem Cursor. Dadurch bleibt die Blase in der Nähe des Cursors und verhindert, dass der Cursor nach außen entweicht.
Reaktion im Konfliktfall
Die Blase ist,collision_detection.force_threshold reagiert auf Cursorkräfte von außen, die diesen Wert überschreiten:
- Die Geschwindigkeitsbegrenzung gilt vorübergehend Ausdehnung macht (maximal
collision_detection.inflate_ratiodoppelt sovelocity_zone_width(bis). Dadurch erhalten die Nutzer genügend Zeit, um Hindernissen auszuweichen. collision_detection.enabledabertrue(Standard) In diesem Fall wird verhindert, dass sich der Mittelpunkt der Blase in Richtung der Kollisionskraft verschiebt. Dadurch wird verhindert, dass der Benutzer den Arbeitsbereich gegen eine feste Wand zieht.
Bei der Kollisionserkennung gilt es, Flackern im Bereich des Schwellenwerts zu vermeiden, Hysterese Verwendung:
Sobald die Kollisionserkennung aktiviert ist,|ext_force| が積 collision_detection.force_threshold × collision_detection.exit_ratio bleibt so lange gültig, bis dieser Wert unterschritten wird.
exit_ratio Wird dieser Wert verringert, vergrößert sich die Hysterese (wodurch der Kollisionszustand leichter aufrechterhalten wird),1.0 Wenn Sie diese Einstellung wählen, wird die Hysterese deaktiviert und es kann ein einziger Schwellenwert verwendet werden.
{
"collision_detection": {
"enabled": true,
"force_threshold": 0.5,
"inflate_ratio": 2.0,
"exit_ratio": 0.7
}
}
Parameterreferenz
Häufig angepasste Parameter
| Parameter | Standard | Erläuterung |
|---|---|---|
shape | {rounded_box, r=0.01, b=(0.05,0.02,0.03)} | SDF-Geometrie zur Definition der Totzone |
velocity_zone_width | 0.03 m | Dicke der Rat-Control-Schale |
max_velocity | 0.5 m/s | Maximale Geschwindigkeit der Navigation |
velocity_ease | "quadratic_in" | Easing-Kurve von der Entfernung zur Geschwindigkeit |
center.follow | false | Ob die Mitte dem Cursor folgt |
center.speed | 0.02 m/s | follow = true Driftgeschwindigkeit bei |
Vollständige Parameterliste
| Feld | Typ | Standardwert | Erläuterung |
|---|---|---|---|
center.position | vec3 | (0, 0, 0) | Anfangsphase — relative = true in diesem Fall der Versatz vom Cursor,false In diesem Fall die absoluten Koordinaten im App-Raum |
center.relative | bool | true | true: position ist der Versatz vom Cursor aus.false: In absoluten Koordinaten des App-Bereichs, an den Grenzen in den Mount-Bereich umgewandelt |
center.follow | bool | false | false: Der Mittelpunkt bleibt an der initialisierten Position fixiert.true: Der Mittelpunkt folgt dem Cursor. |
center.speed | float | 0.02 | follow = true Verfolgungsgeschwindigkeit (m/s) in diesem Fall.0.0 In diesem Fall wird bei jedem Tick an die Cursorposition angezogen. |
shape | Form | {rounded_box, r=0.01, b=(0.05,0.02,0.03)} | Tote Zone SDF-Form |
velocity_zone_width | float | 0.03 | Breite der Geschwindigkeitsbegrenzungsschale (m) |
max_velocity | float | 0.5 | Maximale Geschwindigkeit der Navigation (m/s) |
velocity_ease | String | "quadratic_in" | Easing von der Entfernung zur Geschwindigkeit |
reset_velocity_on_entry | bool | true | Wenn der Cursor erneut in die Geschwindigkeitszone eintritt, wird die kumulierte Geschwindigkeit auf Null gesetzt. |
bump_width | float | 0.005 | Taktile Erhebungen auf der Oberfläche (m) |
bump_stiffness | float | 200.0 | Federkonstante der Oberflächenbump |
spring_inner | float | 0.0 | Feder mit Blasenmitte |
spring_surface | float | 10.0 | Oberflächenfeder |
spring_outer | float | 15.0 | Feder an der Außenkante |
wall_stiffness | float | 700.0 | Feder für die harte Wand jenseits der äußeren Begrenzung |
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ßenkanten |
rotation_enabled | bool | false | Die Drehung des Arbeitsbereichs wird in Navigationsrichtung angewendet. |
scale_enabled | bool | false | Die Skalierung des Arbeitsbereichs wird auf die Navigationsgeschwindigkeit angewendet. |
collision_detection.enabled | bool | true | Blockiert die Navigation in Kollisionsrichtung |
collision_detection.force_threshold | float | 1.0 | Größe der äußeren Kraft (N) zum Auslösen einer Kollision |
collision_detection.inflate_ratio | float | 2.0 | Multiplikator für die Breite der Geschwindigkeitszone zum Zeitpunkt des Zusammenstoßes (muss mindestens 1,0 betragen) |
collision_detection.exit_ratio | float | 0.7 | Hystereseverhältnis.|ext_force| < force_threshold × exit_ratio behält den Kollisionszustand bei, bis … Der Bereich beträgt (0, 1]。1.0 um die Hysterese zu deaktivieren |
Zwei Funktionsgruppenwurden aus dem JSON-Schema von Version 3.5 entfernt, während ihre Implementierung für Version 3.6 neu gestaltet wurde:
- Avatar-Grenzen-Klemme:
avatar_boundary_enabled、avatar_boundary、avatar_boundary_hysteresisdie einzelnen Felder. - Begrenzung des Arbeitsbereichs:
workspace_bounded、workspace_transition_speed、workspace_transition_easedie einzelnen Felder.
Der Code für die Tick-Verarbeitung wird weiterhin kompiliert und unter Verwendung der Standardwerte ausgeführt, jedoch kann der Client diese Felder nicht über HTTP oder WebSocket lesen oder schreiben. In Version 3.6 befindet sich die Avatar-Grenze auf derselben Hierarchieebene wie das Bubble-Objekt mit vollständiger Positionierungstransformation, und zwar auf oberster Ebene. bounds soll wieder eingeführt werden. Die Begrenzung des Arbeitsbereichs soll wieder eingeführt werden, sobald die Untersuchung des zentralen 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_ratioaber(0, 1]innerhalb des Bereichscenter.speed ≥ 0
Es wurde ein ungültiger Parameter angegeben. POST oder configure.navigation wurde abgelehnt, undinvalid-value Es wird ein Ereignis ausgelöst. Die bisherigen Einstellungen bleiben weiterhin gültig.
Veranstaltung
| Veranstaltungsname | Zeitpunkt der Entzündung |
|---|---|
navigation-started | Wenn die Navigation auf dem Gerät aktiviert ist |
navigation-updated | Wenn die Navigation bereits aktiviert ist und die Einstellungen aktualisiert werden |
navigation-stopped | Wenn die Navigation deaktiviert wurde (ausdrückliche Deaktivierung,DELETEoder das Beenden der Sitzung) |
invalid-value | Wenn die Navigationseinstellungen bei der Überprüfung abgelehnt wurden |
Bekannte Einschränkungen
- 3.5 Ausgeblendete Arbeitsbereichsbegrenzungen und Avatar-Grenzen: Beide Funktionsgruppen sind nicht im JSON-Schema enthalten, da sie für Version 3.6 neu gestaltet werden. Bitte beachten Sie die Anmerkungenin deroben genanntenParameterreferenz.
- Uneinheitliche Skalierung + Drehung:
rotation_enabledundscale_enabledWenn beide Optionen aktiviert sind, ist die Geschwindigkeitsrichtung leicht ungenau. Die Drehung wird nicht auf die Skalenachse angewendet. - Geräteabhängige Größenskalierung: Die Größe der Blasen (Radius, Zonenbreite) wird nicht anhand des physikalischen Skalierungsfaktors des jeweiligen Geräts skaliert. Da „MInverse “ und „ Inverse3 “ dieselben absoluten Größen verwenden, kann sich das Erscheinungsbild je nach Gerät unterscheiden.