using System.Threading.Tasks; using UnityEngine; namespace MyInfoMate.Vr.Scene { /// /// Le test qui valide , 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 aux mêmes coordonnées, 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 sur /// NegateZ et relancer. Trois longueurs différentes, parce qu'un repère /// symétrique ne permet pas de voir une inversion. /// 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().material = new Material(Shader.Find("Universal Render Pipeline/Unlit")) { color = color }; Destroy(marker.GetComponent()); } Debug.Log($"[Calibration] Convention active : {GltfSpace.Axis}. " + "Chaque sphère doit coiffer le bout de la branche de sa couleur."); } } }