Aller directement au corps du texte

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 │
└──────────────────────────────────────────┘
ZonePosition du curseurMouvement
Zone morteÀ l'intérieur de la bulleIl n'y a pas de navigation. Un léger amortissement est appliqué. Vous pouvez manipuler librement la scène.
Plage de vitesseEntre la surface et le contourL'espace de travail se déplace dans la direction du curseur, en suivant la courbe distance → vitesse.
Zone muraleAu-delà des limites extérieuresUn 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)​

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

Arrêt​

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

Autres chemins HTTP​

méthodeChemin d'accèsUtilisation
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_easeimpressionQuand l'utiliser ?
linearaugmentation régulièreDes valeurs par défaut prévisibles et sans risque
quadratic_inUn démarrage en douceur, une accélération rapidePrécis près de la surface et rapide sur de longues distances
cubic_inUn démarrage très lentTrès précis, avec une accélération progressive lors des déplacements sur de longues distances
sine_outDémarrage en douceur et rapide, puis ralentissement progressif à l'approche de la périphérieLa réponse est rapide et la limite supérieure s'applique progressivement.
quadratic_outAccélération rapide au démarrage, confort sur les longs trajetsRé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 :

relativepositionSignification 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.
falseposition은 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 :

followspeedMouvementParamètres équivalents précédents
false (valeur par défaut)IgnoréLe centre reste à sa position initiale — centre fixe.center_mode: "fixed"
true> 0Tant 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)
true0.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"
Modification des valeurs par défaut dans la version 3.5

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_widthde collision_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.enableda trueSi 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ètresValeur par défautDescription
shape{rounded_box, r=0.01, b=(0.05,0.02,0.03)}Format SDF définissant une « zone morte »
velocity_zone_width0.03 mÉpaisseur de la couche de contrôle de vitesse (rate-control)
max_velocity0.5 m/sVitesse maximale de navigation
velocity_ease"quadratic_in"Courbe de lissage distance → vitesse
center.followfalseSi le centre suit le curseur
center.speed0.02 m/sfollow = trueVitesse de dérive lors de la conduite

Liste complète des paramètres​

ChampTypeValeur par défautDescription
center.positionvec3(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.relativebooltruetrue: 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.followboolfalsefalse: Le centre reste fixé à sa position initiale. true: Le centre suit le curseur
center.speedfloat0.02follow = trueVitesse de dérive (m/s) au moment où… 0.0Dans ce cas, le curseur s'aligne immédiatement à chaque mise à jour.
shapeforme{rounded_box, r=0.01, b=(0.05,0.02,0.03)}Forme SDF de la zone morte
velocity_zone_widthfloat0.03Largeur de la zone de modération de la vitesse (m)
max_velocityfloat0.5Vitesse maximale de navigation (m/s)
velocity_easechaîne de caractères"quadratic_in"Distance → Vitesse (lissage)
reset_velocity_on_entrybooltrueLorsque le curseur revient dans la zone de vitesse, la vitesse cumulée est remise à 0.
bump_widthfloat0.005Reliefs tactiles en surface (m)
bump_stiffnessfloat200.0Constante élastique des bosses de surface
spring_innerfloat0.0Ressort centré sur une bulle
spring_surfacefloat10.0Les ressorts de surface
spring_outerfloat15.0Les ressorts des bords extérieurs
wall_stiffnessfloat700.0Ressorts à paroi rigide dépassant les limites extérieures
damping_innerfloat0.1Amortissement central
damping_surfacefloat4.0Amortissement de surface
damping_outerfloat7.0Amortissement des limites périphériques
rotation_enabledboolfalseApplique la rotation de l'espace de travail au sens de la navigation.
scale_enabledboolfalseL'échelle de l'espace de travail s'applique à la vitesse de navigation.
collision_detection.enabledbooltrueBloque la navigation dans la direction de la collision
collision_detection.force_thresholdfloat1.0Intensité de la force extérieure (N) nécessaire pour entrer en collision
collision_detection.inflate_ratiofloat2.0Facteur de multiplication appliqué à la largeur de la plage de vitesse lors d'une collision (doit être ≥ 1,0)
collision_detection.exit_ratiofloat0.7Taux 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.
Champs masqués dans la version 3.5

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_hysteresis Champ.
  • Délimitation de l'espace de travail: workspace_bounded, workspace_transition_speed, workspace_transition_ease Champ.

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 > 0
  • 0 ≤ bump_width < velocity_zone_width
  • max_velocity > 0
  • bump_stiffness ≥ 0
  • spring_inner ≥ 0 Et puis spring_inner ≤ spring_surface ≤ spring_outer
  • wall_stiffness ≥ 0
  • damping_inner ≥ 0 Et puis damping_inner ≤ damping_surface ≤ damping_outer
  • collision_detection.force_threshold > 0
  • collision_detection.inflate_ratio ≥ 1.0
  • collision_detection.exit_ratioest (0, 1] Il doit se trouver dans cette plage
  • center.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énementMoment de survenue
navigation-startedLorsque la navigation est activée sur l'appareil
navigation-updatedLorsque la configuration de la navigation est mise à jour alors qu'elle est déjà active
navigation-stoppedLorsque la navigation est interrompue (désactivation explicite, DELETE, ou à la fin de la session)
invalid-valueLorsque 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_enabledWa scale_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.