Aller au contenu principal

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 │
└──────────────────────────────────────────┘
ZonePosition du curseurComportement
Zone morteÀ l'intérieur de la bullePas de navigation. Amortissement léger. Vous pouvez interagir librement avec la scène.
Zone de vitesseEntre la surface de la bulle et la limite extérieureLa courbe distance→vitesse permet de déplacer la zone de travail dans la direction du curseur.
Zone des mursAu-delà des limites extérieuresUn 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)​

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

Arrêt​

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

Autres routages HTTP​

MéthodeChemin d'accèsUtilisation
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_easesensation au toucherCas d'utilisation
linearpente constantePrévisible, recommandé comme valeur par défaut
quadratic_inLe 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_inLe démarrage est très lentTrès précis, accélération progressive sur les longues distances
sine_outLe 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_outRéaction rapide à l'entrée, prise en main agréable sur les longues distancesUne 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 :

relativeposition 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.
falseposition 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 :

followspeedComportementConfiguration équivalente pour les anciennes versions
false(par défaut)IgnorerLe centre conserve la position qu'il avait lors de l'initialisation —centre fixe.center_mode: "fixed"
true> 0Lorsque 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)
true0.0Le centre s'aligne directement sur le curseur à chaque cycle de mise à jour —une sensation de téléportation.center_mode: "track_cursor"
Dans la version 3.5, les valeurs par défaut ont été modifiées

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_width le collision_detection.inflate_ratio fois), afin que l'utilisateur dispose d'une plus grande marge de manœuvre pour contourner les obstacles.
  • Lorsque collision_detection.enabled pour true(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ètresValeur par défautExplication
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_width0.03 mL'épaisseur de la couche de contrôle de la vitesse
max_velocity0.5 m/sVitesse maximale de navigation
velocity_ease"quadratic_in"Courbe de décélération de la distance en fonction de la vitesse
center.followfalseLe centre suit-il le curseur ?
center.speed0.02 m/sfollow = true taux de dérive

Liste complète des paramètres​

ChampTypeValeur par défautDescription
center.positionvec3(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.relativebooltruetrue: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.followboolfalsefalse: Le point central reste à sa position initiale.true: Le point central suit le curseur
center.speedfloat0.02follow = true vitesse de dérive (mètres par seconde) ;0.0 Afficher l'adsorption directe à chaque cycle au niveau du curseur
shapeforme{rounded_box, r=0.01, b=(0.05,0.02,0.03)}Zone morte SDF : forme
velocity_zone_widthfloat0.03Largeur du boîtier de régulation de débit (en mètres)
max_velocityfloat0.5Vitesse maximale de déplacement (mètres par seconde)
velocity_easechaîne de caractères"quadratic_in"Fonction de décélération de la distance à la vitesse
reset_velocity_on_entrybooltrueLorsque le curseur revient dans la zone de vitesse, la vitesse cumulée est remise à zéro.
bump_widthfloat0.005Largeur des reliefs tactiles en surface (en mètres)
bump_stiffnessfloat200.0Constante de ressort des reliefs de surface
spring_innerfloat0.0Le ressort situé au centre de la bulle
spring_surfacefloat10.0Les ressorts en surface
spring_outerfloat15.0Le ressort situé à la limite extérieure
wall_stiffnessfloat700.0Ressort à paroi rigide dépassant les limites extérieures
damping_innerfloat0.1Amortissement au centre
damping_surfacefloat4.0Amortissement en surface
damping_outerfloat7.0Amortissement aux limites extérieures
rotation_enabledboolfalseAppliquer la rotation de l'espace de travail à la direction de navigation
scale_enabledboolfalseAppliquer le zoom de l'espace de travail à la vitesse de navigation
collision_detection.enabledbooltrueEmpêcher la navigation dans la direction de la collision
collision_detection.force_thresholdfloat1.0Intensité de la force extérieure nécessaire pour provoquer une collision (N)
collision_detection.inflate_ratiofloat2.0Facteur d'amplification de la largeur de la zone de vitesse pendant la collision (doit être ≥ 1,0)
collision_detection.exit_ratiofloat0.7Taux 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
3.5 Champs masqués

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_boundary et avatar_boundary_hysteresis。
  • Contraintes relatives aux limites de l'espace de travail: Champ workspace_bounded,workspace_transition_speed et workspace_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 > 0
  • 0 ≤ bump_width < velocity_zone_width
  • max_velocity > 0
  • bump_stiffness ≥ 0
  • spring_inner ≥ 0 et spring_inner ≤ spring_surface ≤ spring_outer
  • wall_stiffness ≥ 0
  • damping_inner ≥ 0 et damping_inner ≤ damping_surface ≤ damping_outer
  • collision_detection.force_threshold > 0
  • collision_detection.inflate_ratio ≥ 1.0
  • collision_detection.exit_ratio Valeurs comprises entre (0, 1] dans ce cadre
  • center.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énementConditions de déclenchement
navigation-startedLa navigation sur l'appareil est activée
navigation-updatedLorsque la navigation est activée, sa configuration est mise à jour.
navigation-stoppedLa navigation a été désactivée (désactivation explicite,DELETE (fin de la requête ou de la session)
invalid-valueLa 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_enabled et scale_enabled Lorsqu'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.