Skip to main content
Version : 3.5.x

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 │
└──────────────────────────────────────────┘
ZonePosition du curseurComportement
Zone morteÀ l'intérieur de la bullePas de navigation. Atténuation de la lumière. Vous pouvez manipuler librement la scène.
Zone de vitesseEntre la surface et la limite extérieureLa courbe « Distance → vitesse » déplace l'espace de travail dans la direction du curseur.
Zone muraleAu-delà de la limite extérieureUn 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)

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

Arrêter

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

Autres routes HTTP

MéthodeCheminObjectif
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_easeRessentirQuand l'utiliser
linearRampe constantePrévisible, un bon choix par défaut
quadratic_inUn démarrage lent, puis une accélérationPrécis près de la surface, rapide sur de longues distances
cubic_inUn démarrage très lentTrès précis, course longue, accélération progressive
sine_outDémarrage rapide et en douceur, plateau vers l'extérieurRéactif, majuscules en douceur
quadratic_outRapide au démarrage, confortable sur les longues distancesAccé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_modeComportementCas 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 bulleNavigation générale : le curseur « revient » au centre entre deux pressions
fixedLe centre ne se déplace jamais automatiquementNavigation par point de repère autour d'un point de référence spécifique
track_cursorLe centre s'aligne sur le curseur à chaque pasDé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_scale fois velocity_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ètresPar défautDescription
shape{sphere, r=0.05}SDF définissant la zone morte
velocity_zone_width0.03 mÉpaisseur de la coque de régulation de débit
max_velocity1.0 m/sVitesse 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_boundedfalseFixer le centre à l'espace de travail physique de l'appareil

Liste complète des paramètres

Champ d'applicationTypePar défautDescription
centervec3(0,0,0)Centre initial de la bulle dans l'espace de montage
shapeforme{sphere, r=0.05}Forme SDF de la zone morte
velocity_zone_widthfloat0.03Largeur de la coque de régulation de débit (m)
max_velocityfloat1.0Vitesse maximale de navigation (m/s)
velocity_easechaîne de caractères"linear"Accélération progressive en fonction de la distance et de la vitesse
reset_velocity_on_entrybooltrueRemettre à zéro la vitesse cumulée lorsque le curseur repasse dans la zone de vitesse
bump_widthfloat0.003Relief tactile à la surface (m)
bump_stiffnessfloat500.0Constante de rappel de la surface
spring_innerfloat4.0Le printemps au centre de la bulle
spring_surfacefloat7.0Le printemps à la surface
spring_outerfloat12.0Le printemps aux confins
wall_stiffnessfloat700.0Ressort à paroi rigide dépassant la limite extérieure
damping_innerfloat0.2Amortissement au centre
damping_surfacefloat0.7Amortissement en surface
damping_outerfloat5.0Amortissement à la limite extérieure
rotation_enabledboolfalseAppliquer la rotation de l'espace de travail à la direction de navigation
scale_enabledboolfalseAppliquer l'échelle de l'espace de travail à la vitesse de navigation
center_modeénumération"auto_follow""auto_follow" / "fixed" / "track_cursor"
center_drift_speedfloat0.03Vitesse de dérive en auto_follow vitesse moyenne (m/s)
workspace_boundedboolfalseFixer le centre de la bulle dans l'espace de travail de l'appareil
workspace_transition_speedfloat1.2Vitesse de la transition initiale de la pince
workspace_transition_easechaîne de caractères"quadratic_in_out"Adoucissement de la transition initiale de la pince
stop_at_collisionboolfalseBloquer la navigation dans la direction de la collision
collision_thresholdfloat0.001Seuil de force externe pour détecter une collision (N)
collision_inflate_scalefloat2.0Facteur multiplicateur de la largeur de la zone de vitesse lors d'une collision
avatar_boundary_enabledboolfalseActiver le verrouillage des limites de l'avatar
avatar_boundaryforme{sphere, r=0.1}Forme SDF pour la contrainte de position de l'avatar

Règles de validation

  • velocity_zone_width > 0
  • 0 ≤ bump_width < velocity_zone_width
  • max_velocity > 0
  • spring_inner ≤ spring_surface ≤ spring_outer
  • damping_inner ≤ damping_surface ≤ damping_outer
  • collision_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énementLicencié lorsque
navigation-startedLa navigation est activée sur l'appareil
navigation-updatedLa configuration de la navigation est mise à jour alors qu'elle est déjà active
navigation-stoppedLa navigation est désactivée (désactivation explicite, DELETE, ou à la fin de la session)
invalid-valueUne configuration de navigation est rejetée lors de la validation

Limites connues

  • Échelle non uniforme + rotation: lorsque les deux rotation_enabled et scale_enabled lorsqu'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.