Cartes 600, 610 et 620 closes (back-office XR, ressource 360, appairage tablette), 250 et 320 retirées du planifié, 015 et 330 à jour ; STATUS, roadmap, test-plan, todo-features et plans VR / frontière immersif alignés ; kanban.html regénéré. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011VxSQeGQYUvPmSEoGdnidA
33 lines
6.4 KiB
Markdown
33 lines
6.4 KiB
Markdown
---
|
|
title: Meta Quest — app Unity + Meta XR SDK
|
|
area: doc
|
|
horizon: v2
|
|
tags: XR
|
|
flag: warn | V2 · POC écrit en entier, rien n'a jamais tourné
|
|
src: v2/vr-quest-unity-plan.md §2 (lots XR-4, XR-5), §4, §5 · roadmap.md — section XR
|
|
---
|
|
<p><strong>Stack tranchée le 31/08</strong> : Unity 6 LTS + OpenXR + Meta XR feature group. Le contenu se récupère par <code>GET /api/configuration/{id}/export</code> — un seul appel qui renvoie configuration, sections et ressources, donc aucun DTO C# à réécrire endpoint par endpoint. <strong>Unity n'est pas une nécessité technique</strong> : le mode kiosk vient de la gestion d'appareil, pas du moteur. Unity gagne sur l'exploitation sans surveillance — cache offline multi-Go, décodage 8K, et un build <em>figé</em> là où le navigateur du casque s'auto-mettrait à jour et pourrait casser la borne un mardi matin. <strong>Retenu : WebXR pour la maquette, Unity pour la borne</strong>, à rouvrir si l'usage devient « casque 5 min avec un agent à côté ».</p>
|
|
|
|
<p>✅ <strong>Le POC est écrit en entier — E0 à E10, entre le 11 et le 12/09.</strong> Unity 6000.0.83f1, projet URP dans <code>vr-app/</code>, APK sideloadé sur un Quest 2 (Horizon OS v207). Mesuré sur casque : un décor glTF de 50 Mo charge en 1,4 s et tient 72 FPS, GPU au maximum.</p>
|
|
|
|
<table>
|
|
<tr><th>Item</th><th>Ce qui est écrit</th></tr>
|
|
<tr><td><strong>E2-E3</strong></td><td>Appairage par code PIN (<code>PairingService</code>) et lecture de l'export. ⚠️ Un <strong>404 sur <code>POST /api/device</code></strong> ne veut pas dire « introuvable » : il n'y a pas d'<code>ApplicationInstance</code> VR sur l'instance.</td></tr>
|
|
<tr><td><strong>E4</strong></td><td><strong>Cache d'abord</strong> : l'app démarre sur le disque, se rafraîchit en fond, et l'échec du rafraîchissement ne se voit pas. Écriture atomique — une borne se débranche le soir. C'est l'argument n°1 d'Unity contre le web.</td></tr>
|
|
<tr><td><strong>E5</strong></td><td>Menu flottant en arc à 2,2 m, qui <strong>ne suit pas la tête</strong>. <strong>Trois moyens de viser</strong> : manette (gâchette), main (pincement), tête (1,2 s, contre le « Midas touch »). ⚠️ <strong>« À la tête », pas « aux yeux »</strong> — le Quest 2 n'a pas d'eye tracking. ⚠️ La dépendance <code>E5 → E1</code> du plan <strong>était fausse</strong> : <code>OVRInput</code> et <code>OVRHand</code> viennent du Core SDK, donc <strong>E1 sort du chemin critique</strong>.</td></tr>
|
|
<tr><td><strong>E6</strong></td><td>Image et vidéo 360° en skybox. Le <strong>retour au menu ne reste pas planté dans le décor</strong> : 4 s, puis il s'efface et revient quand on baisse les yeux — toute la valeur d'une 360 est d'y être. ⚠️ Deux pièges <strong>invisibles dans l'éditeur</strong> : <code>Skybox/Panoramic</code> doit être dans <em>Always Included Shaders</em> (sinon ciel magenta sur le casque seul), et une équirectangulaire décodée pèse <strong>134 Mo</strong> — compressée en ASTC et libérée à la sortie, sinon l'app meurt après quelques 360.</td></tr>
|
|
<tr><td><strong>E8</strong></td><td>Slider, Map, Parcours et Event, dans une même vue paginée. ⚠️ <strong>Deux écarts assumés</strong> : la Map est une <strong>liste de POI</strong>, pas la maquette 3D promise (elle demande <code>SectionModel3D</code>) ; le Parcours est rendu comme une Map, pour la même raison.</td></tr>
|
|
<tr><td><strong>E9</strong></td><td>Télémétrie « tire et oublie ». ⚠️ Route <code>/api/stats/event</code>, et <code>appType</code> y part en <strong>chaîne parsée par nom</strong> : une faute de frappe retombe sur Mobile <em>sans erreur</em>.</td></tr>
|
|
<tr><td><strong>E10</strong></td><td>Fin de visite à la repose du casque ou après 90 s, menu <strong>recentré devant le visiteur suivant</strong>, nouvelle session de stats. ⚠️ Le verrouillage de l'app sur le casque n'est pas du code : c'est le mode appareil de Meta.</td></tr>
|
|
</table>
|
|
|
|
<p>⚠️ <strong>Rien de E2 à E10 n'a jamais tourné</strong> — ni contre un vrai serveur, ni sur le casque. Le code compile, c'est tout ce qu'on sait. <strong>Plan de test §25</strong>, 9 blocs, écrit pour ça ; son §25.7 (déclarer une 360 dans le manager) se joue <strong>sans casque</strong>.</p>
|
|
|
|
<p>⚠️ <strong>Le risque est produit, pas technique, et il est intact.</strong> Le CMS est 2D : un Article sur un panneau flottant est <em>moins</em> bon qu'une tablette. La valeur du canal vient du contenu 360°, que peu de clients possèdent. <strong>Go/no-go conditionné à un client pilote disposant déjà de vidéos 360°</strong> — rien de ce qui a été codé ne répond à cette question-là.</p>
|
|
|
|
<p>🟡 <strong>XR-5, la supervision de flotte : l'essentiel est écrit</strong> (12/09). Un <strong>battement HTTP</strong> toutes les 3 min remplit enfin les colonnes batterie / version / dernier vu de l'onglet XR, qui affichaient « — » faute d'alimentation — <code>Update</code> n'écrivait ni <code>AppVersion</code> ni <code>LastSeen</code>. Pas de MQTT : à 1-3 casques il coûterait dix fois plus de code pour remonter trois chiffres ; il redeviendra utile pour <strong>pousser</strong> vers le casque, pas pour remonter. <strong>Reste</strong> : le client MQTT le jour où l'on voudra recharger une configuration à distance, et une alerte quand un casque ne donne plus signe.</p>
|
|
|
|
<p>🟡 <strong>E7, la maquette 3D, est écrit aussi</strong> (12/09). <code>SectionModel3D</code> est <strong>un vrai type de section</strong> — une maquette n'a ni fond cartographique, ni zoom, ni coordonnées terrestres — mais il réutilise le <code>GeoPoint</code>, qui portait déjà deux rattachements : les points gardent titre, description, audio et multilingue. ✅ <strong>L'« éditeur de placement 3D », annoncé comme le seul morceau non trivial du lot, n'était pas à écrire</strong> : <code>vr-app/viewer</code> sait déjà le faire et <strong>son protocole <code>postMessage</code> existait déjà</strong>, pensé pour ce cas. Le manager le monte en iframe, comme il le fait déjà trois fois ailleurs. Côté casque, rien de dessiné non plus : on construit un manifeste et on le passe au moteur de la piste S. ⚠️ Le viewer n'a jamais tourné, et doit être servi sous le même domaine que le manager.</p>
|
|
|
|
<p><strong>Reste au lot</strong> : <code>E11</code> (distribution : Horizon Store ou canal privé, à revérifier avant toute offre). ⚠️ <strong>MDM rétrogradé le 31/08</strong> : inutile à 1-3 casques, sideload + mode appareil suffisent.</p>
|