Navigation
Le module « Navigation » permet au curseur d’un Inverse3 de se déplacer dans l’espace de travail de l’application – ce que l’on appelle parfois la « locomotion à contrôle de vitesse » ou le « drift de type manette de jeu ». Au lieu de heurter un mur rigide lorsqu’il atteint le bord de la zone de travail physique, le curseur pénètre dans une enveloppe souple dans laquelle sa distance par rapport à un centre virtuel est convertie en une vitesse à laquelle l’ensemble de la zone de travail se déplace. Plus le curseur est enfoncé, plus la scène défile rapidement.
Le comportement principal (et pour l'instant le seul) est la navigation par bulles. La forme de la bulle est définie à l'aide d'une primitive SDF – voir « Qu'est-ce qu'un SDF ? » pour en comprendre le concept.
Navigation par bulles – Concept
Une bulle virtuelle est ancrée autour d'un point central dans la salle de montage de l'appareil. Le curseur traverse trois zones concentriques :
┌──────────────────────────────────────────┐
│ WALL ZONE │ cursor beyond outer shell
│ ┌────────────────────────────────────┐ │
│ │ VELOCITY ZONE │ │ soft shell → scene moves
│ │ ┌──────────────────────────────┐ │ │
│ │ │ DEAD ZONE (inside) │ │ │ no scene movement
│ │ │ │ │ │
│ │ │ ● centre │ │ │
│ │ │ │ │ │
│ │ └──────────────────────────────┘ │ │
│ │ bubble surface │ │
│ └────────────────────────────────────┘ │
│ outer boundary │
└──────────────────────────────────────────┘
| Zone | Position du curseur | Comportement |
|---|---|---|
| Totzone | À l'intérieur de la bulle | Pas de navigation. Amortissement léger. Vous pouvez manipuler librement la scène. |
| Zone de limitation de vitesse | Entre la surface et la limite extérieure | La courbe « Distance → Vitesse » déplace la zone de travail vers le curseur. |
| Wandzone | Au-delà de la frontière extérieure | Un ressort rigide repousse le curseur dans la bulle, ce qui limite la vitesse de navigation. |
Dans chacune des trois zones, une force haptique de type « ressort-amortisseur » est à l'œuvre : vous percevez la surface, la coque de dérive et la paroi extérieure.
Démarrage rapide – Activer la navigation par bulles
La navigation est une configuration unique et permanente : une fois envoyée, elle reste active jusqu'à ce que vous la désactiviez explicitement, que vous redémarriez le service ou que vous fermiez la session.
Début (minimaliste – bloc standard aux angles arrondis)
- 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"}'
Quitter
- WebSocket
- HTTP
{
"inverse3": [
{
"device_id": "04C3",
"configure": {
"navigation": { "mode": "disabled" }
}
}
]
}
curl -X DELETE "http://localhost:10001/inverse3/04C3/config/navigation?session=:0"
Autres routes HTTP
| Méthode | Chemin d'accès | Objet |
|---|---|---|
GET | /{type}/{id}/config/navigation?session=<expr> | Configuration actuelle du système de navigation + état |
POST | /{type}/{id}/config/navigation?session=<expr> | Lancer ou actualiser la navigation |
DELETE | /{type}/{id}/config/navigation?session=<expr> | Quitter la navigation |
Catalogue des moules à bulles
La zone morte de la bulle est décrite par une forme utilisant une fonction de distance signée (Signed Distance Function, SDF). Différentes formes donnent lieu à des sensations de navigation différentes : un parallélépipède rectangle arrondi (la forme par défaut) pour une zone de repos rectangulaire confortable, une sphère pour une dérive isotrope, un ellipsoïde pour privilégier certains axes, et une capsule pour les couloirs.
Paralélépipède à faces arrondies (standard)
La « zone morte » standard est un volume plat dont la hauteur est légèrement supérieure à la profondeur – conçue pour offrir un toucher agréable aussi bien avec Inverse3 qu'avec MInverse :
{
"shape": {
"primitive": "rounded_box",
"parameters": { "b": { "x": 0.05, "y": 0.02, "z": 0.03 }, "r": 0.01 }
}
}
Kugel – dérives isotropes
{
"shape": {
"primitive": "sphere",
"parameters": { "r": 0.05 }
}
}
Ellipsoïde – plus large dans les axes X et Z que dans l'axe Y
Utilisez cette forme si vous souhaitez que la dérive horizontale soit plus souple que la dérive verticale :
{
"shape": {
"primitive": "ellipsoid",
"parameters": { "a": { "x": 0.06, "y": 0.03, "z": 0.06 } }
}
}
Kapsel – couloir allongé
Deux points d'arrivée a/b ainsi qu'un rayon 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
}
}
}
Exemple complet avec une taille personnalisée et un effet de mouvement :
{
"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"
}
}
}
}
]
}
Courbe de vitesse
La distance dans la zone de vitesse est soumise à une courbe d'accélération avant d'être convertie en vitesse de la zone de travail. Choisissez l'accélération qui correspond à la manière dont la scène doit s'accélérer lorsque l'utilisateur appuie davantage sur l'enveloppe.
velocity_ease | Sentiment | Quand l'utiliser ? |
|---|---|---|
linear | Hausse constante | Prévisible, de bonne qualité |
quadratic_in | Démarrage lent, puis avance plus rapide | Précis près de la surface, rapide sur de longues distances |
cubic_in | Un démarrage très lent | Très précis, longues courses avec rampe ascendante |
sine_out | Départ en douceur et rapide, s'aplatit près du bord extérieur | Réactif, modérément doux |
quadratic_out | Rapide au démarrage, confortable sur les longues distances | Appui rapide, glissement fluide |
{ "velocity_ease": "quadratic_in", "max_velocity": 1.5 }
Comportement du centre
Le centre de la bulle est déterminé à l'aide d'une structure imbriquée center-Objet configuré avec quatre champs – position, relative, follow, speed – ; il remplace l'ancienne mise en page plate de 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
}
}
À l'endroit où le centre est ancré
position et relative déterminent la position initiale du centre lors de l'activation :
relative | Signification de position |
|---|---|
true (Standard) | position est un Décalage par rapport au curseur – le centre initial est cursor + position. Avec la valeur par défaut (0, 0, 0) la bulle apparaît exactement à l'endroit où se trouve le curseur. |
false | position est un point absolu dans l'espace de définition – il est converti à l'entrée de la salle de montage, puis reconverti à la sortie pour revenir à l'unité de la salle d'application, de sorte que les valeurs correspondent lors de la conversion aller et retour. |
Comment le centre de gravité se déplace ensuite
follow et speed contrôlent le comportement à chaque cycle dès que la bulle est active :
follow | speed | Comportement | Équivalent actuel |
|---|---|---|---|
false (Standard) | ignoré | Le centre reste à l'endroit où il a été initialisé : c'est un centre fixe. | center_mode: "fixed" |
true | > 0 | Le centre de gravité dérive avec speed m/s dans la direction du curseur, tant que celui-ci se trouve à l'intérieur. | center_mode: "auto_follow" (avec center_drift_speed) |
true | 0.0 | À chaque mesure, le centre se déplace vers le curseur – on a l'impression de se téléporter. | center_mode: "track_cursor" |
Le comportement par défaut du centre est désormais fest (follow = false). Dans les versions antérieures, le centre avait tendance, par défaut, à se déplacer vers le curseur (auto_follow). Mettez center.follow = true, afin de rétablir l'ancien comportement de dérive, et réglez center.speed à l'ancienne valeur de center_drift_speed an.
Si follow = true si le curseur dépasse la limite extérieure, le centre suit le curseur indépendamment de speed, afin que la bulle continue de l'envelopper et que le curseur ne puisse pas s'échapper.
Comportement en cas de collision
La bulle réagit aux forces externes exercées par le curseur, qui collision_detection.force_threshold dépasser :
- La zone de limitation de vitesse s'étend temporairement indisponible (jusqu'au
collision_detection.inflate_ratio-Matières develocity_zone_width), afin que vous disposiez de plus d'espace pour contourner l'obstacle. - Si
collision_detection.enabledauftrue(valeur par défaut), le centre de la bulle ne dérive pas dans la direction de la force de collision, ce qui vous empêche de faire glisser la zone de travail contre une paroi rigide.
La détection des collisions utilise Hystérésis, afin d'éviter tout « scintillement » autour du seuil : dès qu'une collision est active, elle le reste jusqu'à ce que |ext_force| sous le produit collision_detection.force_threshold × collision_detection.exit_ratio tombe. Abaissez exit_ratio, afin d'élargir la bande d'hystérésis (collisions plus adhérentes) ; réglez la valeur sur 1.0, afin de désactiver l'hystérésis et de n'utiliser qu'un seul seuil.
{
"collision_detection": {
"enabled": true,
"force_threshold": 0.5,
"inflate_ratio": 2.0,
"exit_ratio": 0.7
}
}
Référence des paramètres
Les plus fréquemment modifiés
| Paramètres | Standard | Description |
|---|---|---|
shape | {rounded_box, r=0.01, b=(0.05,0.02,0.03)} | Formulaire SDF définissant la zone morte |
velocity_zone_width | 0.03 m | Épaisseur de la gaine de commande |
max_velocity | 0.5 m/s | Vitesse maximale de navigation |
velocity_ease | "quadratic_in" | Courbe de décroissance de la distance en fonction de la vitesse |
center.follow | false | Si le centre suit le curseur |
center.speed | 0.02 m/s | Taux de dérive, si follow = true |
Liste complète des paramètres
| Feld | Type | Standard | Description |
|---|---|---|---|
center.position | vec3 | (0, 0, 0) | Centre initial — Décalage du curseur lors de relative = true, le nec plus ultra dans l'univers des applications chez false |
center.relative | bool | true | true: position correspond à un décalage par rapport au curseur. false: point absolu dans l'espace de l'application, qui est converti à la frontière vers l'espace de montage |
center.follow | bool | false | false: Le centre reste fixé à sa position initiale. true: Le centre suit le curseur |
center.speed | float | 0.02 | Vitesse de dérive (m/s) à follow = true; 0.0 s'affiche sur le curseur à chaque tick |
shape | forme | {rounded_box, r=0.01, b=(0.05,0.02,0.03)} | Formulaire SDF relatif à la zone morte |
velocity_zone_width | float | 0.03 | Largeur de la cuve pour la régulation de la vitesse (m) |
max_velocity | float | 0.5 | Vitesse maximale de navigation (m/s) |
velocity_ease | chaîne de caractères | "quadratic_in" | Accélération de la vitesse en fonction de la distance |
reset_velocity_on_entry | bool | true | Remettre la vitesse cumulée à zéro lorsque le curseur entre à nouveau dans la zone de vitesse |
bump_width | float | 0.005 | Relief tactile à la surface (m) |
bump_stiffness | float | 200.0 | Constante de Feder correspondant à l'élévation de la surface |
spring_inner | float | 0.0 | Un ressort au centre de la bulle |
spring_surface | float | 10.0 | Plume à la surface |
spring_outer | float | 15.0 | Feder à la frontière extérieure |
wall_stiffness | float | 700.0 | La paroi dure au-delà de la frontière extérieure |
damping_inner | float | 0.1 | Amortissement au point central |
damping_surface | float | 4.0 | Amortissement en surface |
damping_outer | float | 7.0 | Atténuation à la frontière extérieure |
rotation_enabled | bool | false | Appliquer la rotation de l'espace de travail à la direction de navigation |
scale_enabled | bool | false | Appliquer la mise à l'échelle de l'espace de travail à la vitesse de navigation |
collision_detection.enabled | bool | true | Bloquer la navigation dans le sens de la collision |
collision_detection.force_threshold | float | 1.0 | Valeur de la force externe à partir de laquelle une collision se produit (N) |
collision_detection.inflate_ratio | float | 2.0 | Multiplicateur de la largeur de la zone de vitesse lors d'une collision (doit être ≥ 1,0) |
collision_detection.exit_ratio | float | 0.7 | Rapport d'hystérésis — rester à l'état de collision jusqu'à ce que |ext_force| < force_threshold × exit_ratio doré. Zone (0, 1]; 1.0 désactive l'hystérésis |
Deux groupes de fonctions ne figurent pas dans le schéma JSON de la version 3.5, tandis que leurs implémentations sont en cours de révision pour la version 3.6 :
- Blocage à la frontière de l'Avatar: les champs
avatar_boundary_enabled,avatar_boundaryetavatar_boundary_hysteresis. - Délimitation de l'espace de travail: les champs
workspace_bounded,workspace_transition_speedetworkspace_transition_ease.
Le code Tick continue d'être compilé et exécuté avec les valeurs par défaut, mais les clients ne peuvent ni lire ni écrire ces champs, que ce soit via HTTP ou WebSocket. Dans la version 3.6, la limite d'avatar revient en tant qu'élément de même niveau et de niveau supérieur bounds à côté de l'objet « bulle », avec une transformation de position complète ; la limite de l'espace de travail réapparaît dès que l'analyse du tremblement du centre est terminée.
Règles de validation
velocity_zone_width > 00 ≤ bump_width < velocity_zone_widthmax_velocity > 0bump_stiffness ≥ 0spring_inner ≥ 0etspring_inner ≤ spring_surface ≤ spring_outerwall_stiffness ≥ 0damping_inner ≥ 0etdamping_inner ≤ damping_surface ≤ damping_outercollision_detection.force_threshold > 0collision_detection.inflate_ratio ≥ 1.0collision_detection.exit_ratiodans(0, 1]center.speed ≥ 0
Ein POST ou configure.navigation en cas de paramètres non valides, la requête est rejetée et un
invalid-value- L'événement est déclenché ; la configuration précédente reste active.
Événements
| Nom de l'événement | Déclenché lorsque |
|---|---|
navigation-started | La navigation est activée sur un appareil |
navigation-updated | La configuration de la navigation est en cours de mise à jour alors qu'elle est déjà active |
navigation-stopped | La navigation est interrompue (désactivation explicite, DELETE ou à la fin de la séance) |
invalid-value | Une configuration de navigation est rejetée lors de la validation |
Limitations connues
- Limites de l'espace de travail et limites de l'avatar masquées dans la version 3.5: ces deux groupes de fonctions sont absents du schéma JSON, car ils sont en cours de révision pour la version 3.6. Voir la remarque ci-dessus dans la section « Référence des paramètres ».
- Mise à l'échelle et rotation irrégulières: si
rotation_enabledetscale_enabledLorsque ces deux options sont activées, la direction de la vitesse est légèrement imprécise : la rotation n'est pas appliquée aux axes de mise à l'échelle. - Mise à l'échelle par appareil: les dimensions des bulles (rayon, largeur de zone) ne sont pas adaptées en fonction du facteur d'échelle physique de l'appareil — MInverse et Inverse3 utilisent les mêmes dimensions absolues, qui peuvent donner une impression différente selon les appareils.