Navigation
Le module de navigation permet de déplacer le curseur Inverse3 dans l’ espace de travail (workspace) de l’application. Ce phénomène est également appelé « locomotion à contrôle de vitesse » ( rate-control locomotion ) ou « dérive de type manette de jeu » (gamepad-like drift). Au lieu de heurter un mur rigide aux limites de l’espace de travail physique, le curseur pénètre dans une zone dite « soft shell » (coque souple) où la distance par rapport au centre virtuel est convertie en vitesse de déplacement dans l’ensemble de l’espace de travail. Plus vous poussez le curseur loin, plus la scène défile rapidement.
Le mode de fonctionnement par défaut (et pour l'instant le seul) est la navigation par bulles. La forme des bulles est définie à l'aide de primitives SDF; pour en savoir plus sur ce concept, veuillez consulter la section « Qu'est-ce que le SDF ?».
Navigation par bulles — Concept
Une bullevirtuelle est fixée au centre de l'espace de montage de l'appareil. Le curseur parcourt 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 | Mouvement |
|---|---|---|
| Zone morte | À l'intérieur de la bulle | Il n'y a pas de navigation. Un léger amortissement est appliqué. Vous pouvez manipuler librement la scène. |
| Plage de vitesse | Entre la surface et le contour | L'espace de travail se déplace dans la direction du curseur, en suivant la courbe distance → vitesse. |
| Zone murale | Au-delà des limites extérieures | Un ressort puissant repousse le curseur vers l'intérieur, et la vitesse de navigation atteint son maximum. |
Une force haptique de type ressort-amortisseurest appliquée sur l'ensemble des trois zones, ce qui permet de percevoir la surface, la coque de dérive et la paroi extérieure.
Mise en route rapide — Activation de la navigation par bulles
La navigation est un paramètre ponctuel persistant. Une fois transmise, elle reste active jusqu’à ce qu’elle soit explicitement désactivée, que le service soit redémarré ou que la session soit fermée.
Démarrage (configuration minimale — bulles rectangulaires arrondies par défaut)
- 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"}'
Arrêt
- WebSocket
- HTTP
{
"inverse3": [
{
"device_id": "04C3",
"configure": {
"navigation": { "mode": "disabled" }
}
}
]
}
curl -X DELETE "http://localhost:10001/inverse3/04C3/config/navigation?session=:0"
Autres chemins HTTP
| méthode | Chemin d'accès | Utilisation |
|---|---|---|
GET | /{type}/{id}/config/navigation?session=<expr> | Paramètres et état actuels du système de navigation |
POST | /{type}/{id}/config/navigation?session=<expr> | Lancer ou mettre à jour le système de navigation |
DELETE | /{type}/{id}/config/navigation?session=<expr> | Arrêter la navigation |
Liste des formes de bulles
La « zone morte » d’une bulle est définie sous la forme d’une fonction de distance signée (signed-distance-function, SDF). La forme choisie influe sur la sensation de navigation. On utilise un rectangle arrondi (valeur par défaut) pour les zones de repos confortables, une sphère pour la dérive isotrope, un ellipsoïde pour privilégier un axe spécifique, et une capsule pour les passages.
Carré arrondi (par défaut)
La « zone morte » par défaut est un volume légèrement plus haut que la profondeur et plutôt aplati ; elle a été ajustée pour offrir un confort optimal tant sur Inverse3 que sur MInverse :
{
"shape": {
"primitive": "rounded_box",
"parameters": { "b": { "x": 0.05, "y": 0.02, "z": 0.03 }, "r": 0.01 }
}
}
Gu — Dérive isotropique
{
"shape": {
"primitive": "sphere",
"parameters": { "r": 0.05 }
}
}
Elipsoïde — Les axes X et Z sont plus larges que l'axe Y
On l'utilise lorsque la dérive horizontale doit sembler moins prononcée que la dérive verticale :
{
"shape": {
"primitive": "ellipsoid",
"parameters": { "a": { "x": 0.06, "y": 0.03, "z": 0.06 } }
}
}
Capsule — Couloir allongé
les deux extrémités a/bet le rayon rSpécifie :
{
"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 illustrant l'application d'une taille personnalisée et d'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
Les distances dans la zone de vitesse sont d'abord mappées à l'aide d'une courbe d'accélération (easing), puis converties en vitesse dans l'espace de travail. Choisissez l'accélération qui correspond à la manière dont vous souhaitez que la scène s'accélère lorsque l'utilisateur fait glisser plus profondément vers l'intérieur de la coque.
velocity_ease | impression | Quand l'utiliser ? |
|---|---|---|
linear | augmentation régulière | Des valeurs par défaut prévisibles et sans risque |
quadratic_in | Un démarrage en douceur, une accélération rapide | Précis près de la surface et rapide sur de longues distances |
cubic_in | Un démarrage très lent | Très précis, avec une accélération progressive lors des déplacements sur de longues distances |
sine_out | Démarrage en douceur et rapide, puis ralentissement progressif à l'approche de la périphérie | La réponse est rapide et la limite supérieure s'applique progressivement. |
quadratic_out | Accélération rapide au démarrage, confort sur les longs trajets | Réglage précis et rapide, conduite confortable |
{ "velocity_ease": "quadratic_in", "max_velocity": 1.5 }
Mouvement central
Le centre de la bulle est constitué de quatre zones (position, relative, follow, speed) formant une imbrication center On le configure via un objet. Cela revient à center, center_enabled, center_mode, center_drift_speedElle remplace l'ancienne structure plane qui était composée de…
{
"center": {
"position": { "x": 0.0, "y": 0.0, "z": 0.0 },
"relative": true,
"follow": false,
"speed": 0.02
}
}
Position de fixation du centre
positionet relativepermet de contrôler la position centrale initiale au moment de l'activation :
relative | positionSignification de |
|---|---|
true (valeur par défaut) | position은 Décalage par rapport au curseur. Au départ, l'accent était mis sur cursor + positionC'est la valeur par défaut. (0, 0, 0)La bulle est alors créée exactement à cet endroit. |
false | position은 Le point absolu dans l'espace des applicationsEn effet, lors de l'entrée, les données sont converties dans l'espace de montage, puis reconverties dans l'espace de l'application lors de la sortie ; ainsi, les valeurs restent identiques même après cette conversion aller-retour. |
La manière dont le centre se déplace par la suite
Une fois la bulle activée, followWa speedcontrôle le comportement à chaque tick :
follow | speed | Mouvement | Paramètres équivalents précédents |
|---|---|---|---|
false (valeur par défaut) | Ignoré | Le centre reste à sa position initiale — centre fixe. | center_mode: "fixed" |
true | > 0 | Tant que le curseur se trouve à l'intérieur, le centre speed Il dérive vers le curseur à une vitesse de m/s. | center_mode: "auto_follow" (center_drift_speed (Utilisation) |
true | 0.0 | À chaque clic, le centre s'agrandit et vous vous déplacez immédiatement à cet endroit — on a l'impression de se téléporter. | center_mode: "track_cursor" |
La valeur par défaut de l'action principale est désormais fixe(follow = false). Dans les versions précédentes, la dérive se faisait par défaut vers le curseur (auto_follow) a été effectué. Pour rétablir le comportement de dérive précédent, center.follow = truerégler sur, center.speeddéplacer vers center_drift_speed Veuillez ajuster en fonction de la valeur.
follow = trueet lorsque le curseur dépasse les limites extérieures, speedQuel que soit le cas, le centre suit le curseur, ce qui permet de maintenir la bulle autour de celui-ci et d'éviter qu'il ne s'en éloigne.
Réponse en cas de collision
Une bulle, c'est collision_detection.force_thresholdréagit à une force exercée par un curseur externe supérieure à :
- La plage de vitesse a été temporairement dilatationfait (maximum
velocity_zone_widthdecollision_detection.inflate_ratio(jusqu'au ventre). Cela permet à l'utilisateur de disposer d'un espace de manœuvre plus important autour des obstacles. collision_detection.enabledatrueSi cette option est sélectionnée (par défaut), le centre de la bulle ne dérive pas dans la direction de la force de collision. Cela empêche l'utilisateur de faire glisser l'espace de travail vers une paroi fixe.
La détection des collisions sert à éviter les clignotements autour du seuil, hystérésisutilise :
Une fois la collision activée, |ext_force|Il reste actif jusqu’à ce que la valeur tombe en dessous du produit suivant.
collision_detection.force_threshold × collision_detection.exit_ratio.
exit_ratioSi l'on réduit cette valeur, la plage d'hystérésis s'élargit (les collisions durent plus longtemps), 1.0Si vous sélectionnez cette option, l'hystérésis est désactivée et un seuil unique est utilisé.
{
"collision_detection": {
"enabled": true,
"force_threshold": 0.5,
"inflate_ratio": 2.0,
"exit_ratio": 0.7
}
}
Référence des paramètres
Les éléments que l'on modifie le plus souvent
| Paramètres | Valeur par défaut | Description |
|---|---|---|
shape | {rounded_box, r=0.01, b=(0.05,0.02,0.03)} | Format SDF définissant une « zone morte » |
velocity_zone_width | 0.03 m | Épaisseur de la couche de contrôle de vitesse (rate-control) |
max_velocity | 0.5 m/s | Vitesse maximale de navigation |
velocity_ease | "quadratic_in" | Courbe de lissage distance → vitesse |
center.follow | false | Si le centre suit le curseur |
center.speed | 0.02 m/s | follow = trueVitesse de dérive lors de la conduite |
Liste complète des paramètres
| Champ | Type | Valeur par défaut | Description |
|---|---|---|---|
center.position | vec3 | (0, 0, 0) | Les débuts — relative = truelorsqu'on utilise le curseur, le décalage par rapport au point de référence, falseLorsqu'il s'agit des coordonnées absolues de l'espace de l'application |
center.relative | bool | true | true: positionIl s'agit du décalage par rapport au curseur. false: Il s'agit des coordonnées absolues de l'espace de l'application ; elles sont converties de l'espace limite 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 | follow = trueVitesse de dérive (m/s) au moment où… 0.0Dans ce cas, le curseur s'aligne immédiatement à chaque mise à jour. |
shape | forme | {rounded_box, r=0.01, b=(0.05,0.02,0.03)} | Forme SDF de la zone morte |
velocity_zone_width | float | 0.03 | Largeur de la zone de modération de la vitesse (m) |
max_velocity | float | 0.5 | Vitesse maximale de navigation (m/s) |
velocity_ease | chaîne de caractères | "quadratic_in" | Distance → Vitesse (lissage) |
reset_velocity_on_entry | bool | true | Lorsque le curseur revient dans la zone de vitesse, la vitesse cumulée est remise à 0. |
bump_width | float | 0.005 | Reliefs tactiles en surface (m) |
bump_stiffness | float | 200.0 | Constante élastique des bosses de surface |
spring_inner | float | 0.0 | Ressort centré sur une bulle |
spring_surface | float | 10.0 | Les ressorts de surface |
spring_outer | float | 15.0 | Les ressorts des bords extérieurs |
wall_stiffness | float | 700.0 | Ressorts à paroi rigide dépassant les limites extérieures |
damping_inner | float | 0.1 | Amortissement central |
damping_surface | float | 4.0 | Amortissement de surface |
damping_outer | float | 7.0 | Amortissement des limites périphériques |
rotation_enabled | bool | false | Applique la rotation de l'espace de travail au sens de la navigation. |
scale_enabled | bool | false | L'échelle de l'espace de travail s'applique à la vitesse de navigation. |
collision_detection.enabled | bool | true | Bloque la navigation dans la direction de la collision |
collision_detection.force_threshold | float | 1.0 | Intensité de la force extérieure (N) nécessaire pour entrer en collision |
collision_detection.inflate_ratio | float | 2.0 | Facteur de multiplication appliqué à la largeur de la plage de vitesse lors d'une collision (doit être ≥ 1,0) |
collision_detection.exit_ratio | float | 0.7 | Taux d'hystérésis — |ext_force| < force_threshold × exit_ratioIl reste en état de collision jusqu’à ce que… Portée (0, 1]; 1.0Dans ce cas, l'hystérésis est désactivée. |
Ces deux groupes de fonctionnalités sont exclus du schéma JSON de la version 3.5, leur implémentation étant en cours de refonte pour la version 3.6 :
- Limitation des limites de l'avatar:
avatar_boundary_enabled,avatar_boundary,avatar_boundary_hysteresisChamp. - Délimitation de l'espace de travail:
workspace_bounded,workspace_transition_speed,workspace_transition_easeChamp.
Le code « tick » est toujours compilé et exécuté par défaut, mais le client ne peut ni lire ni écrire dans ce champ via HTTP ou WebSocket. Dans la version 3.6, la limite de l'avatar est un élément de niveau supérieur, au même rang que l'objet « bubble ». bounds Il sera à nouveau disponible sous forme d'élément et comportera une transformation de placement (placement transform) complète. Les limites de l'espace de travail seront à nouveau disponibles une fois l'analyse du jitter central (centre-jitter) terminée.
Règles de vérification
velocity_zone_width > 00 ≤ bump_width < velocity_zone_widthmax_velocity > 0bump_stiffness ≥ 0spring_inner ≥ 0Et puisspring_inner ≤ spring_surface ≤ spring_outerwall_stiffness ≥ 0damping_inner ≥ 0Et puisdamping_inner ≤ damping_surface ≤ damping_outercollision_detection.force_threshold > 0collision_detection.inflate_ratio ≥ 1.0collision_detection.exit_ratioest(0, 1]Il doit se trouver dans cette plagecenter.speed ≥ 0
Contenant des paramètres incorrects POST ou bien configure.navigation La demande est rejetée, et invalid-value Un événement se produit. La configuration précédente reste active.
Événement
| Nom de l'événement | Moment de survenue |
|---|---|
navigation-started | Lorsque la navigation est activée sur l'appareil |
navigation-updated | Lorsque la configuration de la navigation est mise à jour alors qu'elle est déjà active |
navigation-stopped | Lorsque la navigation est interrompue (désactivation explicite, DELETE, ou à la fin de la session) |
invalid-value | Lorsque la configuration de la navigation est rejetée à la suite d'une validation |
Limitations connues
- 3.5 : Limites de l'espace de travail masqué et limites de l'avatar: ces deux groupes de fonctionnalités ne figurent pas dans le schéma JSON, car ils sont en cours de réorganisation pour la version 3.6. Veuillez consulter la remarque ci-dessus, sous la section « Référence des paramètres ».
- Échelle non uniforme + rotation:
rotation_enabledWascale_enabledSi toutes ces options sont activées, la direction de la vitesse devient légèrement imprécise. La rotation ne s'applique pas aux axes de l'échelle. - Mise à l'échelle en fonction de l'appareil: la taille des bulles (rayon, largeur de la zone) n'est pas ajustée en fonction du facteur d'échelle physique de l'appareil. MInverse et Inverse3 utilisant la même taille absolue, leur rendu peut varier d'un appareil à l'autre.