Navigation
Le module Navigation permet au Inverse3 de déplacer l'espace de travail de l'application — ce que l'on appelle parfois « locomotion à contrôle de vitesse » ou « dérive de type manette de jeu ». Au lieu de heurter un mur rigide au bord de l'espace de travail physique, le curseur pénètre dans une enveloppe souple où sa distance par rapport à un centre virtuel est convertie en une vitesse qui fait glisser l'ensemble de l'espace de travail. Plus le curseur avance, plus la scène défile rapidement.
Le principal (et pour l'instant unique) mode de navigation 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 savoir plus sur ce concept.
Navigation par bulles — concept
Une bulle virtuelle est centrée sur un point situé dans l'espace de montage de l'appareil. Le curseur passe par 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 │
└──────────────────────────────────────────┘
| Zone | Position du curseur | Comportement |
|---|---|---|
| Zone morte | À l'intérieur de la bulle | Pas de navigation. Atténuation de la lumière. Vous pouvez manipuler librement la scène. |
| Zone de vitesse | Entre la surface et la limite extérieure | La courbe « Distance → vitesse » déplace l'espace de travail dans la direction du curseur. |
| Zone murale | Au-delà de la limite extérieure | Un ressort rigide repousse le curseur vers l'intérieur et la vitesse de déplacement atteint son maximum. |
Une force haptique générée par un ressort-amortisseur est appliquée sur les trois zones : vous sentez la surface, la coque de glissement et la paroi extérieure.
Guide de démarrage rapide — Activer la navigation par bulles
La navigation est une configuration permanente et unique : une fois envoyée, elle reste active jusqu'à ce que vous l'arrêtiez explicitement, que vous redémarriez le service ou que vous fermiez la session.
Démarrer (version minimale — bulle sphérique avec taille par défaut)
- 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êter
- WebSocket
- HTTP
{
"inverse3": [
{
"device_id": "04C3",
"configure": {
"navigation": { "mode": "disabled" }
}
}
]
}
curl -X DELETE "http://localhost:10001/inverse3/04C3/config/navigation?session=:0"
Autres routes HTTP
| Méthode | Chemin | Objectif |
|---|---|---|
GET | /{type}/{id}/config/navigation?session=<expr> | Configuration et état actuels de la navigation |
POST | /{type}/{id}/config/navigation?session=<expr> | Lancer ou mettre à jour la navigation |
DELETE | /{type}/{id}/config/navigation?session=<expr> | Arrêter la navigation |
Catalogue des formes de bulles
La zone morte de la bulle est définie par une forme de fonction de distance signée (SDF). Chaque forme offre une expérience de navigation différente : une sphère pour une dérive isotrope, un ellipsoïde ou un cube pour privilégier certains axes, une capsule pour les couloirs.
Sphère (par défaut)
{
"shape": {
"primitive": "sphere",
"parameters": { "r": 0.05 }
}
}
Ellipsoïde — plus large dans les axes X et Z que dans l'axe Y
À utiliser lorsque le glissement horizontal doit sembler plus souple que le glissement vertical :
{
"shape": {
"primitive": "ellipsoid",
"parameters": { "a": { "x": 0.06, "y": 0.03, "z": 0.06 } }
}
}
Boîte arrondie — zone morte rectangulaire aux angles arrondis
{
"shape": {
"primitive": "rounded_box",
"parameters": { "b": { "x": 0.04, "y": 0.02, "z": 0.04 }, "r": 0.008 }
}
}
Capsule — couloir allongé
Deux points d'arrivée a/b plus 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 dimensions personnalisées et 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",
"workspace_bounded": true
}
}
}
}
]
}
Courbe de vitesse
La distance de la zone de vitesse est convertie à l'aide d'une courbe d'accélération avant d'être transformée 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 à mesure que l'utilisateur s'enfonce davantage dans la coque.
velocity_ease | Ressentir | Quand l'utiliser |
|---|---|---|
linear | Rampe constante | Prévisible, un bon choix par défaut |
quadratic_in | Un démarrage lent, puis une accélération | Précis près de la surface, rapide sur de longues distances |
cubic_in | Un démarrage très lent | Très précis, course longue, accélération progressive |
sine_out | Démarrage rapide et en douceur, plateau vers l'extérieur | Réactif, majuscules en douceur |
quadratic_out | Rapide au démarrage, confortable sur les longues distances | Accélération vive, conduite confortable |
{ "velocity_ease": "quadratic_in", "max_velocity": 1.5 }
Modes centraux
Le centre de la bulle peut suivre le curseur, s'aligner sur celui-ci ou rester fixe dans l'espace de montage .
center_mode | Comportement | Cas d'utilisation |
|---|---|---|
auto_follow (par défaut) | Se dirige lentement vers le curseur à center_drift_speed lorsque le curseur se trouve à l'intérieur de la bulle | Navigation générale : le curseur « revient » au centre entre deux pressions |
fixed | Le centre ne se déplace jamais automatiquement | Navigation par point de repère autour d'un point de référence spécifique |
track_cursor | Le centre s'aligne sur le curseur à chaque pas | Déplacement de type « téléportation » : le curseur se trouve toujours au centre de la bulle |
{ "center_mode": "fixed" }
Dans tous les modes : si le curseur dépasse la limite extérieure, le centre suit le curseur pour maintenir la bulle autour de lui et l'empêcher de s'échapper.
Délimitation de l'espace de travail
La plupart des appareils ont une portée physique limitée. Lorsque workspace_bounded est défini,
le centre de la bulle reste à l'intérieur de l'espace de travail physique de l'appareil, de sorte que
la navigation qui en résulte n'entraîne pas le curseur hors de son volume accessible.
{ "workspace_bounded": true }
Si le centre initial se trouve en dehors de l'espace de travail, le module le ramène progressivement
à l'intérieur au fil du temps (workspace_transition_speed / workspace_transition_ease)
au lieu d'un mouvement brusque — ce qui évite une secousse tactile au démarrage.
Limites de l'avatar
Quand avatar_boundary_enabled est défini, le résultat final position de l'avatar dans le monde
(espace de travail + curseur) est confiné à l'intérieur d'une forme SDF arbitraire. Utile pour
confiné l'utilisateur à l'intérieur d'une pièce, d'un couloir, d'un cockpit de véhicule, etc., sans
avoir à créer de scripts de confinement axe par axe.
{
"avatar_boundary_enabled": true,
"avatar_boundary": {
"primitive": "box",
"parameters": { "b": { "x": 5.0, "y": 3.0, "z": 5.0 } }
}
}
Les avatar_boundary La forme accepte les mêmes primitives que la forme « bulle »
(sphere, ellipsoid, rounded_box, capsule, box, ...).
Réaction en cas de collision
La bulle réagit aux forces externes exercées par le curseur qui dépassent collision_threshold:
- La zone de vitesse temporaire gonfle (jusqu'à
collision_inflate_scalefoisvelocity_zone_width) afin de laisser à l'utilisateur davantage de marge de manœuvre pour contourner l'obstacle. - Avec
stop_at_collision, le centre de la bulle refuse de se déplacer dans la direction de la force de collision, empêchant ainsi l'utilisateur de faire glisser l' espace de travail contre un mur solide.
{ "stop_at_collision": true, "collision_threshold": 0.5, "collision_inflate_scale": 2.0 }
Référence des paramètres
Les plus fréquemment réglés
| Paramètres | Par défaut | Description |
|---|---|---|
shape | {sphere, r=0.05} | SDF définissant la zone morte |
velocity_zone_width | 0.03 m | Épaisseur de la coque de régulation de débit |
max_velocity | 1.0 m/s | Vitesse maximale de navigation |
velocity_ease | "linear" | Courbe d'accélération de la vitesse en fonction de la distance |
center_mode | "auto_follow" | Comment le centre suit le curseur |
workspace_bounded | false | Fixer le centre à l'espace de travail physique de l'appareil |
Liste complète des paramètres
| Champ d'application | Type | Par défaut | Description |
|---|---|---|---|
center | vec3 | (0,0,0) | Centre initial de la bulle dans l'espace de montage |
shape | forme | {sphere, r=0.05} | Forme SDF de la zone morte |
velocity_zone_width | float | 0.03 | Largeur de la coque de régulation de débit (m) |
max_velocity | float | 1.0 | Vitesse maximale de navigation (m/s) |
velocity_ease | chaîne de caractères | "linear" | Accélération progressive en fonction de la distance et de la vitesse |
reset_velocity_on_entry | bool | true | Remettre à zéro la vitesse cumulée lorsque le curseur repasse dans la zone de vitesse |
bump_width | float | 0.003 | Relief tactile à la surface (m) |
bump_stiffness | float | 500.0 | Constante de rappel de la surface |
spring_inner | float | 4.0 | Le printemps au centre de la bulle |
spring_surface | float | 7.0 | Le printemps à la surface |
spring_outer | float | 12.0 | Le printemps aux confins |
wall_stiffness | float | 700.0 | Ressort à paroi rigide dépassant la limite extérieure |
damping_inner | float | 0.2 | Amortissement au centre |
damping_surface | float | 0.7 | Amortissement en surface |
damping_outer | float | 5.0 | Amortissement à la limite extérieure |
rotation_enabled | bool | false | Appliquer 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 |
center_mode | énumération | "auto_follow" | "auto_follow" / "fixed" / "track_cursor" |
center_drift_speed | float | 0.03 | Vitesse de dérive en auto_follow vitesse moyenne (m/s) |
workspace_bounded | bool | false | Fixer le centre de la bulle dans l'espace de travail de l'appareil |
workspace_transition_speed | float | 1.2 | Vitesse de la transition initiale de la pince |
workspace_transition_ease | chaîne de caractères | "quadratic_in_out" | Adoucissement de la transition initiale de la pince |
stop_at_collision | bool | false | Bloquer la navigation dans la direction de la collision |
collision_threshold | float | 0.001 | Seuil de force externe pour détecter une collision (N) |
collision_inflate_scale | float | 2.0 | Facteur multiplicateur de la largeur de la zone de vitesse lors d'une collision |
avatar_boundary_enabled | bool | false | Activer le verrouillage des limites de l'avatar |
avatar_boundary | forme | {sphere, r=0.1} | Forme SDF pour la contrainte de position de l'avatar |
Règles de validation
velocity_zone_width > 00 ≤ bump_width < velocity_zone_widthmax_velocity > 0spring_inner ≤ spring_surface ≤ spring_outerdamping_inner ≤ damping_surface ≤ damping_outercollision_threshold > 0,collision_inflate_scale ≥ 1.0- Toutes les valeurs de vitesse sont non négatives
A POST ou configure.navigation avec des paramètres non valides est rejetée et une
invalid-value l'événement est déclenché ; la configuration précédente reste active.
Evénements
| Nom de l'événement | Licencié lorsque |
|---|---|
navigation-started | La navigation est activée sur l'appareil |
navigation-updated | La configuration de la navigation est mise à jour alors qu'elle est déjà active |
navigation-stopped | La navigation est désactivée (désactivation explicite, DELETE, ou à la fin de la session) |
invalid-value | Une configuration de navigation est rejetée lors de la validation |
Limites connues
- Échelle non uniforme + rotation: lorsque les deux
rotation_enabledetscale_enabledlorsqu'elles sont activées, la direction de la vitesse est légèrement imprécise — la rotation n'est pas appliquée aux axes de l'échelle. - Transition liée à l'espace de travail: la transition progressive avec retour à la position initiale ne s'effectue qu'au moment de l'initialisation. Si le centre de la bulle sort de l'espace de travail pendant l'utilisation normale, le retour à la position initiale s'effectue instantanément, sans animation progressive.
- Mise à l'échelle par appareil: les dimensions des bulles (rayon, largeur de la zone) ne sont pas mises à l'échelle en fonction du facteur d'échelle physique de l'appareil — Minverse Inverse3 les mêmes dimensions absolues, ce qui peut donner une impression différente sur chaque appareil.