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 │
└──────────────────────────────────────────┘
| Zone | Position du curseur | Fonctionnement |
|---|---|---|
| Zone morte (zone insensible) | À l'intérieur de la bulle | Il n'y a pas de navigation. Un léger amortissement est appliqué. Vous pouvez manipuler librement la scène. |
| Zones de vitesse | Entre la surface et la limite extérieure | La 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érieure | Un 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 »)
- 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 points de terminaison HTTP
| Méthode | Passe | Utilisation |
|---|---|---|
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_ease | Impression | Contexte d'utilisation |
|---|---|---|
linear | une pente constante | C'est une option prévisible et qui convient parfaitement comme choix standard. |
quadratic_in | Le 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_in | Une montée en puissance très progressive | Très précis, accélération progressive lors des longs déplacements |
sine_out | Une montée en puissance fluide et rapide, qui plafonne vers l'extérieur | Très réactif, il atteint son plafond en douceur |
quadratic_out | Accélération rapide au démarrage, confort même sur de longues distances | Ré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 :
relative | position 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. |
false | position は 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 :
follow | speed | Fonctionnement | Réglage équivalent à celui utilisé auparavant |
|---|---|---|---|
false(par défaut) | Ignorer | Le centre reste à sa position initiale — centre fixe. | center_mode: "fixed" |
true | > 0 | Tant 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) |
true | 0.0 | Le centre s'aligne sur le curseur à chaque tick — on a l'impression de se téléporter. | center_mode: "track_cursor" |
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_ratiofoisvelocity_zone_width(jusqu'à). Cela permet à l'utilisateur de disposer d'une marge de manœuvre suffisante pour éviter les obstacles. collision_detection.enabledmaistrue(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ètres | Par défaut | Explication |
|---|---|---|
shape | {rounded_box, r=0.01, b=(0.05,0.02,0.03)} | Géométrie SDF définissant la zone morte |
velocity_zone_width | 0.03 m | Épaisseur de la coque de régulation de débit |
max_velocity | 0.5 m/s | Vitesse maximale de navigation |
velocity_ease | "quadratic_in" | Courbe d'accélération de la distance à la vitesse |
center.follow | false | Le centre suit-il le curseur ? |
center.speed | 0.02 m/s | follow = true vitesse de dérive à ce moment-là |
Liste complète des paramètres
| Champ | Type | valeur par défaut | Explication |
|---|---|---|---|
center.position | vec3 | (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.relative | bool | true | true: 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.follow | bool | false | false: Le centre reste fixé à sa position initiale.true: Le centre suit le curseur |
center.speed | float | 0.02 | follow = true Vitesse de suivi (m/s) dans ce cas.0.0 Dans ce cas, le curseur s'aligne sur la position à chaque tick. |
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 de la coque de contrôle de vitesse (m) |
max_velocity | float | 0.5 | Vitesse maximale de navigation (m/s) |
velocity_ease | chaîne de caractères | "quadratic_in" | Transition progressive de la distance à la vitesse |
reset_velocity_on_entry | bool | true | Lorsque le curseur entre à nouveau dans la zone de vitesse, la vitesse cumulée est remise à zéro. |
bump_width | float | 0.005 | Reliefs tactiles en surface (m) |
bump_stiffness | float | 200.0 | Constante élastique des bosses de surface |
spring_inner | float | 0.0 | Ressort à bulle centrale |
spring_surface | float | 10.0 | Ressorts de surface |
spring_outer | float | 15.0 | Ressort de délimitation latérale |
wall_stiffness | float | 700.0 | Ressort pour paroi rigide situé au-delà de la limite extérieure |
damping_inner | float | 0.1 | Amortissement central |
damping_surface | float | 4.0 | Amortissement de surface |
damping_outer | float | 7.0 | Amortissement de la limite extérieure |
rotation_enabled | bool | false | Applique la rotation de l'espace de travail à la direction de navigation |
scale_enabled | bool | false | Appliquer l'échelle de l'espace de travail à la vitesse de navigation |
collision_detection.enabled | bool | true | Bloque la navigation dans la direction de la collision |
collision_detection.force_threshold | float | 1.0 | Intensité de la force extérieure (N) nécessaire pour déclencher une collision |
collision_detection.inflate_ratio | float | 2.0 | Coefficient relatif à la largeur de la zone de vitesse au moment de la collision (doit être supérieur ou égal à 1,0) |
collision_detection.exit_ratio | float | 0.7 | Rapport 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 |
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_hysteresischaque champ. - Délimitation de l'espace de travail:
workspace_bounded,workspace_transition_speed,workspace_transition_easechaque 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 > 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_ratiomais(0, 1]dans les limites decenter.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énement | Le moment de l'inflammation |
|---|---|
navigation-started | Lorsque la navigation est activée sur l'appareil |
navigation-updated | Lorsque la navigation est déjà activée et que les paramètres sont mis à jour |
navigation-stopped | Lorsque la navigation est désactivée (désactivation explicite,DELETEou à la fin de la session) |
invalid-value | Lorsque 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_enabledetscale_enabledSi 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.