Navigation
Le module de navigation permet àl'application de déplacement du curseur Inverse3 de se déplacer dans l'espace de travail — ce que l'on appelle parfois « déplacement à vitesse contrôlée » ou « dérive de type manette de jeu ». Le curseur ne heurte pas de paroi rigide aux bords de l'espace de travail physique, mais pénètre dans une couche souple : la distance entre le curseur et le centre virtuel est convertie en vitesse, ce qui entraîne l'ensemble de l'espace de travail. Plus le curseur est éloigné, plus la scène défile rapidement.
Pour l'instant,la principale(et unique)fonctionnalité est la navigation par bulles. La forme des bulles est définie par des primitives SDF — pour plus d'informations sur ce concept, voir « Qu'est-ce que le SDF ?».
Navigation par bulles — Concept
Une bulle virtuelle est ancréeautour d'un point central de l'espace d'installation 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 |
|---|---|---|
| Zone morte | À l'intérieur de la bulle | Pas de navigation. Amortissement léger. Vous pouvez interagir librement avec la scène. |
| Zone de vitesse | Entre la surface de la bulle et la limite extérieure | La courbe distance→vitesse permet de déplacer la zone de travail dans la direction du curseur. |
| Zone des murs | Au-delà des limites extérieures | Un ressort rigide repousse le curseur vers l'intérieur, ce qui entraîne une saturation de la vitesse de navigation. |
Une force tactile combinant ressort et amortissementest appliquée dans les trois zones : vous pouvez ainsi percevoir la surface, la couche de dérive et la paroi extérieure.
Mise en route rapide — Activation de la navigation par bulles
La navigation est une configuration unique et persistante : il suffit de l'envoyer une seule fois pour qu'elle reste active jusqu'à ce que vous l'arrêtiez explicitement, que vous redémarriez le service ou que vous fermiez la session.
Démarrage (configuration minimale — bulles avec coins arrondis 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 routages HTTP
| Méthode | Chemin d'accès | Utilisation |
|---|---|---|
GET | /{type}/{id}/config/navigation?session=<expr> | Configuration et état actuels de la navigation |
POST | /{type}/{id}/config/navigation?session=<expr> | Lancer ou actualiser la navigation |
DELETE | /{type}/{id}/config/navigation?session=<expr> | Arrêter la navigation |
Répertoire des formes de bulles
La zone morte des bulles est décrite par la forme d'une fonction de distance signée (SDF). Chaque forme offre une sensation de navigation différente : la boîte à coins arrondis (par défaut) convient à une zone d'immobilité rectangulaire confortable, la sphère convient à une dérive isotropique, l'ellipsoïde est utilisée pour une dérive orientée vers certains axes, tandis que la capsule convient aux scènes de type « couloir ».
Boîte aux coins arrondis (par défaut)
La zone morte par défaut est un volume plat dont la hauteur est légèrement supérieure à la profondeur ; une fois réglée, elle offre une prise en main confortable aussi bien sur la Inverse3 que sur la MInverse :
{
"shape": {
"primitive": "rounded_box",
"parameters": { "b": { "x": 0.05, "y": 0.02, "z": 0.03 }, "r": 0.01 }
}
}
Sphère — dérive isotrope
{
"shape": {
"primitive": "sphere",
"parameters": { "r": 0.05 }
}
}
Ellipsoïde — plus large dans les directions X et Z que dans la direction Y
À utiliser lorsque la sensibilité du capteur de mouvement est plus faible dans le sens horizontal que dans le sens vertical :
{
"shape": {
"primitive": "ellipsoid",
"parameters": { "a": { "x": 0.06, "y": 0.03, "z": 0.06 } }
}
}
Le corps de la capsule — un couloir étroit et allongé
entre deux points d'extrémité a/b et le rayon r Définition :
{
"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 incluant des dimensions personnalisées et des sensations 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 d'abord mappée via une courbe d'accélération, puis convertie en vitesse dans la zone de travail. Veuillez sélectionner la fonction d'accélération qui correspond au mode d'accélération souhaité, c'est-à-dire la manière dont la scène doit s'accélérer lorsque l'utilisateur continue à pousser vers l'intérieur de l'enveloppe.
velocity_ease | sensation au toucher | Cas d'utilisation |
|---|---|---|
linear | pente constante | Prévisible, recommandé comme valeur par défaut |
quadratic_in | Le démarrage est lent, mais plus on avance, plus on prend de la vitesse. | Précis lorsqu'il est proche de la surface, rapide sur de longues distances |
cubic_in | Le démarrage est très lent | Très précis, accélération progressive sur les longues distances |
sine_out | Le démarrage est fluide et rapide, puis la vitesse se stabilise à l'approche de la limite extérieure. | Réponse sensible, vitesse régulière jusqu'à la limite maximale |
quadratic_out | Réaction rapide à l'entrée, prise en main agréable sur les longues distances | Une poussée légère pour une conduite confortable |
{ "velocity_ease": "quadratic_in", "max_velocity": 1.5 }
Comportement central
Le centre de la bulle passe par les center Configurer l'objet, qui comporte quatre champs :position,relative,follow,speed—— a remplacé celui qui était assuré par center,center_enabled,center_mode et center_drift_speed une ancienne mise en page « flat » composée de différents éléments.
{
"center": {
"position": { "x": 0.0, "y": 0.0, "z": 0.0 },
"relative": true,
"follow": false,
"speed": 0.02
}
}
Position d'ancrage centrale
position et relative Contrôler la position centrale initiale lors de l'activation :
relative | position signification |
|---|---|
true(par défaut) | position par rapport au curseurdécalage——Le centre initial est cursor + position。Utiliser les valeurs par défaut (0, 0, 0) À ce moment-là, la bulle apparaît justement à l'endroit où se trouve le curseur. |
false | position Il s'agit de l'espace des applicationsPoint absolu——À l'entrée, les données sont converties en espace d'installation, puis reconverties en espace d'application à la sortie ; les valeurs restent donc identiques à l'aller comme au retour. |
Comment le centre va-t-il se déplacer ensuite ?
follow et speed Comportement à chaque cycle de mise à jour, une fois l'activation des bulles contrôlée :
follow | speed | Comportement | Configuration équivalente pour les anciennes versions |
|---|---|---|---|
false(par défaut) | Ignorer | Le centre conserve la position qu'il avait lors de l'initialisation —centre fixe. | center_mode: "fixed" |
true | > 0 | Lorsque le curseur se trouve à l'intérieur de la bulle, le centre est situé à speed dérive vers le curseur à une vitesse de m/s. | center_mode: "auto_follow"(en combinaison avec center_drift_speed) |
true | 0.0 | Le centre s'aligne directement sur le curseur à chaque cycle de mise à jour —une sensation de téléportation. | center_mode: "track_cursor" |
Le comportement par défaut du centre a désormais été modifié pourfixe(follow = false). Dans les premières versions, la dérive du curseur était activée par défaut (auto_follow). Si vous souhaitez rétablir l'ancien comportement de dérive, veuillez configurer center.follow = true, et ajoutera center.speed Ajuster pour qu'il corresponde à l'ancien center_drift_speed Les valeurs correspondent.
Lorsque follow = true De plus, lorsque le curseur dépasse la limite extérieure, peu importe que speed C'est pourquoi le centre suit toujours le curseur, de sorte que la bulle reste constamment autour de celui-ci, ce qui empêche le curseur de s'échapper.
Réponse en cas de collision
Lorsque la force exercée par le curseur externe dépasse collision_detection.force_threshold À ce moment-là, les bulles réagissent :
- Les limitations de vitesse peuvent être temporairesexpansion(jusqu'à
velocity_zone_widthlecollision_detection.inflate_ratiofois), afin que l'utilisateur dispose d'une plus grande marge de manœuvre pour contourner les obstacles. - Lorsque
collision_detection.enabledpourtrue(Valeur par défaut) : le centre de la bulle ne dérive pas dans la direction de la force de collision, ce qui empêche l'utilisateur de faire glisser la zone de travail contre un mur solide.
La détection des collisions utilisehystérésisMécanisme visant à éviter les oscillations à proximité du seuil : une fois déclenchée, la collision reste active jusqu’à ce que |ext_force| baisser jusqu'à collision_detection.force_threshold × collision_detection.exit_ratio inférieur au produit de. Réduire exit_ratio Il est possible d'élargir la plage de rémanence (pour rendre la collision plus visqueuse) ; définissez-la sur 1.0 Il est alors possible de désactiver la hystérésis et d'utiliser uniquement un seuil unique.
{
"collision_detection": {
"enabled": true,
"force_threshold": 0.5,
"inflate_ratio": 2.0,
"exit_ratio": 0.7
}
}
Référence des paramètres
Les paramètres les plus souvent modifiés
| Paramètres | Valeur par défaut | Explication |
|---|---|---|
shape | {rounded_box, r=0.01, b=(0.05,0.02,0.03)} | Définition de la forme SDF de la zone morte |
velocity_zone_width | 0.03 m | L'épaisseur de la couche de contrôle de la vitesse |
max_velocity | 0.5 m/s | Vitesse maximale de navigation |
velocity_ease | "quadratic_in" | Courbe de décélération de la distance en fonction de la vitesse |
center.follow | false | Le centre suit-il le curseur ? |
center.speed | 0.02 m/s | follow = true taux de dérive |
Liste complète des paramètres
| Champ | Type | Valeur par défaut | Description |
|---|---|---|---|
center.position | vec3 | (0, 0, 0) | Point central initial ——relative = true est le décalage par rapport au curseur,false Il s'agit de points de coordonnées absolues dans l'espace de l'application |
center.relative | bool | true | true:position Décalage par rapport au curseur.false: points de coordonnées absolues dans l'espace d'application, convertis en coordonnées de l'espace de montage au niveau des limites |
center.follow | bool | false | false: Le point central reste à sa position initiale.true: Le point central suit le curseur |
center.speed | float | 0.02 | follow = true vitesse de dérive (mètres par seconde) ;0.0 Afficher l'adsorption directe à chaque cycle au niveau du curseur |
shape | forme | {rounded_box, r=0.01, b=(0.05,0.02,0.03)} | Zone morte SDF : forme |
velocity_zone_width | float | 0.03 | Largeur du boîtier de régulation de débit (en mètres) |
max_velocity | float | 0.5 | Vitesse maximale de déplacement (mètres par seconde) |
velocity_ease | chaîne de caractères | "quadratic_in" | Fonction de décélération de la distance à la vitesse |
reset_velocity_on_entry | bool | true | Lorsque le curseur revient dans la zone de vitesse, la vitesse cumulée est remise à zéro. |
bump_width | float | 0.005 | Largeur des reliefs tactiles en surface (en mètres) |
bump_stiffness | float | 200.0 | Constante de ressort des reliefs de surface |
spring_inner | float | 0.0 | Le ressort situé au centre de la bulle |
spring_surface | float | 10.0 | Les ressorts en surface |
spring_outer | float | 15.0 | Le ressort situé à la limite extérieure |
wall_stiffness | float | 700.0 | Ressort à paroi rigide dépassant les limites extérieures |
damping_inner | float | 0.1 | Amortissement au centre |
damping_surface | float | 4.0 | Amortissement en surface |
damping_outer | float | 7.0 | Amortissement aux limites extérieures |
rotation_enabled | bool | false | Appliquer la rotation de l'espace de travail à la direction de navigation |
scale_enabled | bool | false | Appliquer le zoom de l'espace de travail à la vitesse de navigation |
collision_detection.enabled | bool | true | Empêcher la navigation dans la direction de la collision |
collision_detection.force_threshold | float | 1.0 | Intensité de la force extérieure nécessaire pour provoquer une collision (N) |
collision_detection.inflate_ratio | float | 2.0 | Facteur d'amplification de la largeur de la zone de vitesse pendant la collision (doit être ≥ 1,0) |
collision_detection.exit_ratio | float | 0.7 | Taux de retard — Maintien de l'état de collision jusqu'à ce que |ext_force| < force_threshold × exit_ratio。Plage de valeurs (0, 1];1.0 Afficher la désactivation du décalage |
Les deux ensembles de fonctionnalités suivants ont été omis dans le modèle JSON de la version 3.5, et leur implémentation est en cours de refonte pour la version 3.6 :
- Avatar : le clampage des limites: Champ
avatar_boundary_enabled,avatar_boundaryetavatar_boundary_hysteresis。 - Contraintes relatives aux limites de l'espace de travail: Champ
workspace_bounded,workspace_transition_speedetworkspace_transition_ease。
Le code sera tout de même compilé et exécuté avec les valeurs par défaut, mais le client ne pourra ni lire ni écrire ces champs via HTTP ou WebSocket. Dans la version 3.6, les limites de l'avatar seront traitées comme des éléments de niveau supérieur, au même rang que les objets « bulles ». bounds Les champs ont été réintégrés, accompagnés de leurs transformations de position complètes ; les contraintes liées aux limites de l'espace de travail seront réintégrées une fois le problème de tremblement au centre résolu.
Règles de vérification
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_ratioValeurs comprises entre(0, 1]dans ce cadrecenter.speed ≥ 0
Utilisation de paramètres non valides POST ou configure.navigation La requête sera rejetée et déclenchera invalid-value Incident ; la configuration précédente reste en vigueur.
Événement
| Nom de l'événement | Conditions de déclenchement |
|---|---|
navigation-started | La navigation sur l'appareil est activée |
navigation-updated | Lorsque la navigation est activée, sa configuration est mise à jour. |
navigation-stopped | La navigation a été désactivée (désactivation explicite,DELETE (fin de la requête ou de la session) |
invalid-value | La configuration de la navigation n'a pas passé la validation et a donc été rejetée. |
Limites connues
- 3.5 Limites de l'espace de travail et limites de l'avatar masquées: ces deux ensembles de fonctionnalités n'existent pas en mode JSON, car ils sont en cours de refonte pour la version 3.6. Veuillez vous reporter aux explications fournies ci-dessus dans la section « Référence des paramètres ».
- Mise à l'échelle non uniforme + rotation: Lorsque
rotation_enabledetscale_enabledLorsqu'elles sont activées simultanément, la direction de la vitesse présente un léger écart : la rotation n'est pas appliquée à l'axe de mise à l'échelle. - Mise à l'échelle en fonction de la taille de l'appareil: les dimensions des bulles (rayon, largeur de la zone) ne sont pas redimensionnées en fonction du facteur de mise à l'échelle physique de l'appareil —MInverse et Inverse3 utilisent les mêmes dimensions absolues ; leur prise en main peut donc varier.