Passer directement au contenu principal

Navigation

Le module de navigation permet de se déplacer dans l'espace de travail de l'application à l'aide du curseurInverse3 . Ce système est parfois appelé « locomotion à contrôle de vitesse » ou « dérive de type manette de jeu ». Au lieu de heurter un mur rigide aux limites de l'espace de travail physique, le curseur pénètre dans une zone de coque souple où la distance par rapport au centre virtuel est convertie en vitesse de défilement de l'ensemble de l'espace de travail. Plus le curseur est poussé loin, plus la scène défile rapidement.

La fonctionnalité principale (et pour l'instant la seule) est la « Bubble Navigation ». La forme des bulles est définie à l'aide deprimitives SDF. Pour en savoir plus sur ce concept, consultez la section «Qu'est-ce que le SDF ? ».


Bubble Navigation — Présentation générale​

La « bulle » virtuelle est positionnée par rapport au point central de l'espace de montage de l'appareil. Le curseur traverse les trois zones concentriques suivantes :

┌──────────────────────────────────────────┐
│ 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 curseurFonctionnement
Zone morte (zone insensible)À 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.
Zones de vitesseEntre la surface et la limite extérieureLa courbe de vitesse en fonction de la distance fait se déplacer l'espace de travail dans la direction du curseur.
Zone des mursà un endroit situé au-delà de la limite extérieureUn ressort rigide repousse le curseur vers l'intérieur, ce qui limite la vitesse de navigation à sa valeur maximale.

Une force tactile de type ressort-amortisseur agit sur les trois zones, ce qui permet de percevoir la surface, la coque de dérive et la paroi extérieure.


Guide de démarrage rapide — Activer la navigation par bulles​

La navigation est un paramètre permanent et unique. 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 (configuration minimale — bulle par défaut de type « boîte aux coins arrondis »)​

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

Arrêt​

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

Autres points de terminaison HTTP​

MéthodePasseUtilisation
GET/{type}/{id}/config/navigation?session=<expr>Paramètres 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êt de la navigation

Liste des formes de bulles​

La « zone morte » (zone insensible) de la bulle est définie par la forme de la fonction de distance signée (SDF). La sensation de navigation varie en fonction de la forme. On utilise un rectangle aux angles arrondis (par défaut) pour une zone d'arrêt confortable, une sphère pour une dérive isotrope, un ellipsoïde lorsque l'on privilégie un axe spécifique, et une capsule pour les passages.

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 à sa profondeur. Elle a été ajustée pour offrir un confort optimal tant surInverse3 que sur MInverse :

{
"shape": {
"primitive": "rounded_box",
"parameters": { "b": { "x": 0.05, "y": 0.02, "z": 0.03 }, "r": 0.01 }
}
}

Balle — Dérive isotropique​

{
"shape": {
"primitive": "sphere",
"parameters": { "r": 0.05 }
}
}

Ellipsoïde — Les axes X et Z sont plus larges que l'axe Y​

À utiliser lorsque l'on souhaite que la dérive horizontale soit perçue comme plus modérée que la dérive verticale :

{
"shape": {
"primitive": "ellipsoid",
"parameters": { "a": { "x": 0.06, "y": 0.03, "z": 0.06 } }
}
}

Capsule — Couloir étroit et allongé​

Deux points d'extrémité a/b et le rayon r Spécifiez :

{
"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 de personnalisation de la taille et de la sensation 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 des zones de vitesse sont mappées via une courbe d'accélération avant d'être converties en vitesse dans l'espace de travail. Choisissez une courbe d'accélération en fonction de la manière dont vous souhaitez que la scène accélère lorsque l'utilisateur appuie vers l'intérieur de la coque.

velocity_easeImpressionContexte d'utilisation
linearune pente constanteC'est une option prévisible et qui convient parfaitement comme choix standard.
quadratic_inLe démarrage est progressif, puis l'accélération est rapide.Précision au niveau de la surface, vitesse élevée sur les longs trajets
cubic_inUne montée en puissance très progressiveTrès précis, accélération progressive lors des longs déplacements
sine_outUne montée en puissance fluide et rapide, qui plafonne vers l'extérieurTrès réactif, il atteint son plafond en douceur
quadratic_outAccélération rapide au démarrage, confort même sur de longues distancesRéglages précis et rapides, conduite agréable
{ "velocity_ease": "quadratic_in", "max_velocity": 1.5 }

Fonctionnement du centre​

Le centre de la bulle est constitué de structures imbriquées center La configuration s'effectue via un objet. Cet objet comporte quatre champs — position,relative,follow,speed — et, auparavant, center,center_enabled,center_mode,center_drift_speed Il s'agit d'une alternative à la mise en page « plate ».

{
"center": {
"position": { "x": 0.0, "y": 0.0, "z": 0.0 },
"relative": true,
"follow": false,
"speed": 0.02
}
}

Position de référence centrale​

position et relative permet de contrôler la position initiale du centre lors de l'activation :

relativeposition signification
true(par défaut)position は Décalage par rapport au curseur . Au départ, le cœur de l'activité était cursor + position . La valeur par défaut est (0, 0, 0) Dans ce cas, la bulle apparaît exactement à l'emplacement du curseur.
falseposition は Point absolu dans l'espace d'application En effet, comme les données sont converties dans l'espace de montage lors de la saisie, puis reconverties dans l'espace de l'application lors de l'affichage, les valeurs aller et retour coïncident.

Évolution future du centre​

Une fois la bulle activée, le comportement à chaque tick est le suivant : follow et speed est contrôlé par :

followspeedFonctionnementRéglage équivalent à celui utilisé auparavant
false(par défaut)IgnorerLe centre reste à sa position initiale — centre fixe.center_mode: "fixed"
true> 0Tant que le curseur se trouve à l'intérieur, le centre est speed Le curseur dérive vers la position indiquée en m/s.center_mode: "auto_follow"(center_drift_speed (à utiliser)
true0.0Le centre s'aligne sur le curseur à chaque tick — on a l'impression de se téléporter.center_mode: "track_cursor"
La valeur par défaut a été modifiée dans la version 3.5

Le comportement par défaut du centre est actuellement fixe(follow = false). Dans les versions précédentes, il dérivait par défaut vers le curseur (auto_follow). Pour revenir à l'ancien comportement de dérive : center.follow = true configurer, puiscenter.speed par rapport à l'ancien center_drift_speed Veuillez ajuster en fonction de cette valeur.

follow = true Lorsque, dans cet état, le curseur dépasse la limite extérieure,speed Quel que soit la valeur de ce paramètre, le centre suit le curseur. Cela permet à la bulle de rester autour du curseur et d'empêcher celui-ci de s'échapper.


Réponse en cas de conflit​

La bulle, c'est,collision_detection.force_threshold réagit à une force exercée par le curseur provenant de l'extérieur et dépassant :

  • Les limitations de vitesse sont temporairement dilatation fait (au maximum collision_detection.inflate_ratio fois velocity_zone_width (jusqu'à). Cela permet à l'utilisateur de disposer d'une marge de manœuvre suffisante pour éviter les obstacles.
  • collision_detection.enabled mais true(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 contre un mur rigide.

Dans la détection des collisions, afin d'éviter les fluctuations à proximité du seuil, hystérésis Utilisez : Une fois que les collisions sont activées,|ext_force| が積 collision_detection.force_threshold × collision_detection.exit_ratio restera en vigueur jusqu'à ce que ce seuil soit dépassé. exit_ratio Si l'on réduit cette valeur, l'amplitude de l'hystérésis augmente (ce qui rend l'état de collision plus durable),1.0 En sélectionnant cette option, vous désactivez l'hystérésis et pouvez utiliser 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​

Paramètres fréquemment ajustés​

ParamètresPar défautExplication
shape{rounded_box, r=0.01, b=(0.05,0.02,0.03)}Géométrie SDF définissant la zone morte
velocity_zone_width0.03 mÉpaisseur de la coque de régulation de débit
max_velocity0.5 m/sVitesse maximale de navigation
velocity_ease"quadratic_in"Courbe d'accélération de la distance à la vitesse
center.followfalseLe centre suit-il le curseur ?
center.speed0.02 m/sfollow = true vitesse de dérive à ce moment-là

Liste complète des paramètres​

ChampTypevaleur par défautExplication
center.positionvec3(0, 0, 0)Centre initial — relative = true dans ce cas, le décalage par rapport au curseur,false Dans ce cas, les coordonnées absolues de l'espace de l'application
center.relativebooltruetrue: position Il s'agit du décalage par rapport au curseur.false: en coordonnées absolues de l'espace de l'application, elles sont converties en coordonnées de l'espace de montage au niveau des limites
center.followboolfalsefalse: Le centre reste fixé à sa position initiale.true: Le centre suit le curseur
center.speedfloat0.02follow = true Vitesse de suivi (m/s) dans ce cas.0.0 Dans ce cas, le curseur s'aligne sur la position à chaque tick.
shapeforme{rounded_box, r=0.01, b=(0.05,0.02,0.03)}Zone morte SDF - Forme
velocity_zone_widthfloat0.03Largeur de la coque de contrôle de vitesse (m)
max_velocityfloat0.5Vitesse maximale de navigation (m/s)
velocity_easechaîne de caractères"quadratic_in"Transition progressive de la distance à la vitesse
reset_velocity_on_entrybooltrueLorsque le curseur entre à nouveau dans la zone de vitesse, la vitesse cumulée est remise à zéro.
bump_widthfloat0.005Reliefs tactiles en surface (m)
bump_stiffnessfloat200.0Constante élastique des bosses de surface
spring_innerfloat0.0Ressort à bulle centrale
spring_surfacefloat10.0Ressorts de surface
spring_outerfloat15.0Ressort de délimitation latérale
wall_stiffnessfloat700.0Ressort pour paroi rigide situé au-delà de la limite extérieure
damping_innerfloat0.1Amortissement central
damping_surfacefloat4.0Amortissement de surface
damping_outerfloat7.0Amortissement de la limite extérieure
rotation_enabledboolfalseApplique la rotation de l'espace de travail à la direction de navigation
scale_enabledboolfalseAppliquer l'échelle de l'espace de travail à 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 déclencher une collision
collision_detection.inflate_ratiofloat2.0Coefficient relatif à la largeur de la zone de vitesse au moment de la collision (doit être supérieur ou égal à 1,0)
collision_detection.exit_ratiofloat0.7Rapport d'hystérésis.|ext_force| < force_threshold × exit_ratio et maintient l'état de collision jusqu'à ce que… La plage est de (0, 1]。1.0 pour désactiver l'hystérésis
Champs masqués dans la version 3.5

Deux groupes de fonctionnalitésont été exclus du schéma JSON de la version 3.5, leur implémentation ayant été repensée pour la version 3.6 :

  • Pince de délimitation d'avatar: avatar_boundary_enabled,avatar_boundary,avatar_boundary_hysteresis chaque champ.
  • Délimitation de l'espace de travail: workspace_bounded,workspace_transition_speed,workspace_transition_ease chaque champ.

Le code de traitement des ticks continue d'être compilé et s'exécute en utilisant les valeurs par défaut, mais le client ne peut ni lire ni écrire ces champs via HTTP ou WebSocket. Dans la version 3.6, les limites d'avatar sont définies au niveau supérieur, au même niveau hiérarchique que les objets « bubble » dotés d'une transformation de position complète. bounds Il est prévu qu'elle soit rétablie. La délimitation de l'espace de travail devrait être rétablie dès que l'étude sur le jitter central sera 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 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 mais (0, 1] dans les limites de
  • center.speed ≥ 0

Un paramètre non valide a été spécifié POST ou bien configure.navigation a été rejetée,invalid-value Un événement sera généré. Les paramètres précédents resteront valides.


Événement​

Nom de l'événementLe moment de l'inflammation
navigation-startedLorsque la navigation est activée sur l'appareil
navigation-updatedLorsque la navigation est déjà activée et que les paramètres sont mis à jour
navigation-stoppedLorsque la navigation est désactivée (désactivation explicite,DELETEou à la fin de la session)
invalid-valueLorsque les paramètres de navigation sont rejetés à 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 refonte pour la version 3.6. Veuillez vous reporter aux remarquesfigurant dans la référence des paramètresci-dessus.
  • Échelle non uniforme + rotation: rotation_enabled et scale_enabled Si les deux sont activés, la direction de la vitesse sera légèrement imprécise. La rotation ne s'applique pas aux axes d'échelle.
  • Mise à l'échelle en fonction de l'appareil: la taille des bulles (rayon, largeur de zone) n'est pas mise à l'échelle en fonction du facteur d'échelle physique de l'appareil. Étant donné queMInverse et Inverse3 utilisent les mêmes dimensions absolues, l'expérience utilisateur peut varier d'un appareil à l'autre.