Premier commit du cinquième front. Trois parties : - `unity/MyInfoMateVR/` : le projet Unity (6000.0.83f1, URP, Meta XR SDK 205), un APK unique pour tous les clients. Menu flottant à sélection au regard, appairage, chargement de scène GLB, POI, cache de contenu, télémétrie. - `unity-overlay/` : les mêmes scripts à recopier sur un projet Unity neuf, avec les pièges rencontrés consignés dans son README. - `viewer/` : viewer et éditeur de scène web autonome (Vite, TypeScript, three.js), partagé avec les autres fronts. - `docs/` : état des lieux, setup Unity, décisions d'architecture et plan d'exécution en 9 étapes. La scène est décrite par un `scene.json` poussé par `adb push` : l'app le préfère à celui embarqué dans l'APK. Les binaires (GLB, textures de l'échantillon Sponza, DLL Meta XR) passent par Git LFS dès ce premier commit — les y faire entrer après coup demanderait de réécrire l'historique. Les artefacts régénérés par l'éditeur et par CMake (`Library/`, `.utmp/`, Burst debug) sont ignorés. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
58 lines
2.5 KiB
C#
58 lines
2.5 KiB
C#
using System.Threading.Tasks;
|
|
using UnityEngine;
|
|
|
|
namespace MyInfoMate.Vr.Scene
|
|
{
|
|
/// <summary>
|
|
/// Le test qui valide <see cref="GltfSpace"/>, et le critère de validation n°2 de
|
|
/// l'étape S1.
|
|
///
|
|
/// Charge calibration.glb — trois branches de longueurs différentes, rouge sur +X,
|
|
/// verte sur +Y, bleue sur +Z, exprimées en coordonnées glTF — puis place trois
|
|
/// sphères <b>aux mêmes coordonnées</b>, en passant par la conversion du manifeste.
|
|
///
|
|
/// Chaque sphère doit coiffer le bout de sa branche. Si l'une part du côté opposé,
|
|
/// la conversion est en miroir : basculer <see cref="GltfSpace.Axis"/> sur
|
|
/// <c>NegateZ</c> et relancer. Trois longueurs différentes, parce qu'un repère
|
|
/// symétrique ne permet pas de voir une inversion.
|
|
/// </summary>
|
|
public class CalibrationCheck : MonoBehaviour
|
|
{
|
|
static readonly (float[] position, Color color)[] Markers =
|
|
{
|
|
(new[] { 1.00f, 0f, 0f }, new Color(0.85f, 0.15f, 0.15f)),
|
|
(new[] { 0f, 0.60f, 0f }, new Color(0.15f, 0.75f, 0.20f)),
|
|
(new[] { 0f, 0f, 0.30f }, new Color(0.15f, 0.35f, 0.90f)),
|
|
};
|
|
|
|
public async Task RunAsync(Transform parent)
|
|
{
|
|
var model = await GltfLoader.LoadAsync(
|
|
GltfLoader.StreamingAssetsUrl("calibration.glb"), parent, "Calibration");
|
|
|
|
if (model == null)
|
|
{
|
|
Debug.LogError("[Calibration] calibration.glb introuvable dans StreamingAssets");
|
|
return;
|
|
}
|
|
|
|
foreach (var (position, color) in Markers)
|
|
{
|
|
var marker = GameObject.CreatePrimitive(PrimitiveType.Sphere);
|
|
marker.name = "Marker";
|
|
marker.transform.SetParent(parent, false);
|
|
marker.transform.localPosition = GltfSpace.Position(position);
|
|
marker.transform.localScale = Vector3.one * 0.09f;
|
|
// CreatePrimitive pose le matériau du pipeline historique : magenta sous
|
|
// URP, et dessiné sans décalage d'oeil, donc dédoublé en stéréo.
|
|
marker.GetComponent<Renderer>().material =
|
|
new Material(Shader.Find("Universal Render Pipeline/Unlit")) { color = color };
|
|
Destroy(marker.GetComponent<Collider>());
|
|
}
|
|
|
|
Debug.Log($"[Calibration] Convention active : {GltfSpace.Axis}. " +
|
|
"Chaque sphère doit coiffer le bout de la branche de sa couleur.");
|
|
}
|
|
}
|
|
}
|