Aller au contenu principal

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 │
└──────────────────────────────────────────┘
ZonePosition du curseurComportement
TotzoneÀ l'intérieur de la bullePas de navigation. Amortissement léger. Vous pouvez manipuler librement la scène.
Zone de limitation de vitesseEntre la surface et la limite extérieureLa courbe « Distance → Vitesse » déplace la zone de travail vers le curseur.
WandzoneAu-delà de la frontière extérieureUn 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)​

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

Quitter​

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

Autres routes HTTP​

MéthodeChemin d'accèsObjet
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_easeSentimentQuand l'utiliser ?
linearHausse constantePrévisible, de bonne qualité
quadratic_inDémarrage lent, puis avance plus rapidePrécis près de la surface, rapide sur de longues distances
cubic_inUn démarrage très lentTrès précis, longues courses avec rampe ascendante
sine_outDépart en douceur et rapide, s'aplatit près du bord extérieurRéactif, modérément doux
quadratic_outRapide au démarrage, confortable sur les longues distancesAppui 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 :

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

followspeedComportementÉquivalent actuel
false (Standard)ignoréLe centre reste à l'endroit où il a été initialisé : c'est un centre fixe.center_mode: "fixed"
true> 0Le 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)
true0.0À chaque mesure, le centre se déplace vers le curseur – on a l'impression de se téléporter.center_mode: "track_cursor"
Valeur par défaut modifiée dans la version 3.5

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 de velocity_zone_width), afin que vous disposiez de plus d'espace pour contourner l'obstacle.
  • Si collision_detection.enabled auf true (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ètresStandardDescription
shape{rounded_box, r=0.01, b=(0.05,0.02,0.03)}Formulaire SDF définissant la zone morte
velocity_zone_width0.03 mÉpaisseur de la gaine de commande
max_velocity0.5 m/sVitesse maximale de navigation
velocity_ease"quadratic_in"Courbe de décroissance de la distance en fonction de la vitesse
center.followfalseSi le centre suit le curseur
center.speed0.02 m/sTaux de dérive, si follow = true

Liste complète des paramètres​

FeldTypeStandardDescription
center.positionvec3(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.relativebooltruetrue: 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.followboolfalsefalse: Le centre reste fixé à sa position initiale. true: Le centre suit le curseur
center.speedfloat0.02Vitesse de dérive (m/s) à follow = true; 0.0 s'affiche sur le curseur à chaque tick
shapeforme{rounded_box, r=0.01, b=(0.05,0.02,0.03)}Formulaire SDF relatif à la zone morte
velocity_zone_widthfloat0.03Largeur de la cuve pour la régulation de la vitesse (m)
max_velocityfloat0.5Vitesse maximale de navigation (m/s)
velocity_easechaîne de caractères"quadratic_in"Accélération de la vitesse en fonction de la distance
reset_velocity_on_entrybooltrueRemettre la vitesse cumulée à zéro lorsque le curseur entre à nouveau dans la zone de vitesse
bump_widthfloat0.005Relief tactile à la surface (m)
bump_stiffnessfloat200.0Constante de Feder correspondant à l'élévation de la surface
spring_innerfloat0.0Un ressort au centre de la bulle
spring_surfacefloat10.0Plume à la surface
spring_outerfloat15.0Feder à la frontière extérieure
wall_stiffnessfloat700.0La paroi dure au-delà de la frontière extérieure
damping_innerfloat0.1Amortissement au point central
damping_surfacefloat4.0Amortissement en surface
damping_outerfloat7.0Atténuation à la frontière extérieure
rotation_enabledboolfalseAppliquer la rotation de l'espace de travail à la direction de navigation
scale_enabledboolfalseAppliquer la mise à l'échelle de l'espace de travail à la vitesse de navigation
collision_detection.enabledbooltrueBloquer la navigation dans le sens de la collision
collision_detection.force_thresholdfloat1.0Valeur de la force externe à partir de laquelle une collision se produit (N)
collision_detection.inflate_ratiofloat2.0Multiplicateur de la largeur de la zone de vitesse lors d'une collision (doit être ≥ 1,0)
collision_detection.exit_ratiofloat0.7Rapport 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
Felder masqué dans la version 3.5

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_boundary et avatar_boundary_hysteresis.
  • Délimitation de l'espace de travail: les champs workspace_bounded, workspace_transition_speed et workspace_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 > 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 dans (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énementDéclenché lorsque
navigation-startedLa navigation est activée sur un appareil
navigation-updatedLa configuration de la navigation est en cours de mise à jour alors qu'elle est déjà active
navigation-stoppedLa navigation est interrompue (désactivation explicite, DELETE ou à la fin de la séance)
invalid-valueUne 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_enabled et scale_enabled Lorsque 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.