Réalité Augmentée, Virtuelle, Mixte

L’objectif pédagogique du cours est de comprendre et de mettre en oeuvre une application de réalité virtuelle et augmentée intégrant plusieurs compétences clés : détection robuste en vision par ordinateur d’un marqueur rectangulaire (feuille A4), estimation de la pose 3D du marqueur en temps réel, et superposition en 3D d’un objet virtuel en cohérence avec ce marqueur. Le travail demandé vise à développer des savoir-faire pratiques en calibration de caméra, traitement d’image, algorithmie de suivi et rendu 3D via OpenGL, tout en sensibilisant à la gestion des ressources, à la structuration modulaire du code, et à l’optimisation des performances pour un usage temps réel. Il s’inscrit dans une démarche pédagogique favorisant l’autonomie, l’expérimentation et la validation sur des données réelles et variées (image fixe, séquences vidéo, flux caméra direct). L’aspect réalité mixte concerne la prise en compte de l’adhésion de l’utilisateur à l’environnement développé. Il s’agira de faire jouer l’utilisation à un jeu de labyrinthe à l’aide du dispositif. Nous nous attacherons tout particulièrement à évaluer l’appréhension de l’utilisateur par la jouabilité.

Illustration de la partie 2D -> 3D du travail demandé.

Environnement de travail

Le langage de développement est C++. Pour la partie détection de points d’intérêts, calibrage de caméra vous pourrez utiliser OpenCV et pour la partie affichage 2D/3D OpenGL.

Grandes étapes

Ci-dessous une proposition d’architecture de l’application. Il s’agit uniquement d’une proposition pour illustrer certains points essentiels au bon fonctionnement du système.

Architecture du système
Figure 1. Architecture du système

Quelques données pour travailler

Réalité Augmentée (RA)

L'objectif pédagogique du cours est de permettre aux apprenants de comprendre et de mettre en œuvre une application de réalité augmentée intégrant plusieurs compétences clés : détection robuste en vision par ordinateur d'un marqueur rectangulaire (feuille A4), estimation de la pose 3D du marqueur en temps réel, et superposition en 3D d'un objet virtuel en cohérence avec ce marqueur. Le travail demandé vise à développer des savoir-faire pratiques en calibration de caméra, traitement d’image, algorithmie de suivi et rendu 3D via OpenGL, tout en sensibilisant à la gestion des ressources, à la structuration modulaire du code, et à l’optimisation des performances pour un usage temps réel. Il s’inscrit dans une démarche pédagogique favorisant l’autonomie, l’expérimentation et la validation sur des données réelles et variées (image fixe, séquences vidéo, flux caméra direct). L’évaluation de ce travail sera guidée par la grille suivante :

1. Architecture et organisation du code

Critère

Insuffisant (1)

Satisfaisant (2)

Bon (3)

Excellent (4)

Structure modulaire

Code monolithique sans organisation

Quelques fonctions, organisation basique

Structures de données dédiées, fonctions bien organisées

Architecture claire avec (namespaces, structures cohérentes …)

Documentation

Aucune documentation

Commentaires sporadiques

Commentaires sur fonctions principales

Documentation complète avec descriptions détaillées

Gestion des ressources

Fuites mémoire, pas de nettoyage

Nettoyage partiel

Gestion correcte des ressources OpenGL/OpenCV

Nettoyage systématique avec fonctions dédiées

2. Vision par ordinateur (OpenCV)

Critère

Insuffisant (1)

Satisfaisant (2)

Bon (3)

Excellent (4)

Détection de marqueur

Détection basique non fonctionnelle

Détection simple sans robustesse

Détection avec seuillage adaptatif

Détection robuste avec ROI adaptative et validation temporelle

Calibration caméra

Pas de calibration

Calibration manuelle basique

Chargement paramètres depuis fichier

Gestion complète matrice intrinsèque et coefficients distorsion

Estimation de pose

Pas d'estimation 3D

Utilisation de la fonction solvePnP basique sans validation

Estimation avec points triés correctement

Estimation robuste avec validation cohérence inter-frames

Traitement d'image

Opérations élémentaires

Conversion couleur et seuillage

Pipeline complet avec filtrage

Pipeline optimisé avec adaptation dynamique des paramètres

3. Intégration AR et suivi

Critère

Insuffisant (1)

Satisfaisant (2)

Bon (3)

Excellent (4)

Robustesse suivi

Perte fréquente du marqueur

Suivi instable avec sauts

Suivi stable en conditions normales

Validation temporelle avec seuil de cohérence, gestion de l’éclairage

Superposition 3D

Alignement incorrect

Alignement approximatif

Bonne superposition

Superposition précise avec perspective correcte et repères visuels

Performance temps réel

< 15 fps, latence importante

-20 fps, latence visible

-25 fps, latence acceptable

≥ 25 fps stable avec pipeline optimisé

Enregistrement vidéo

Pas d'enregistrement

Capture basique avec artéfacts

Enregistrement fonctionnel

Capture via la fonction glReadPixels avec conversion et redimensionnement automatique

4. Qualité technique

Critère

Insuffisant (1)

Satisfaisant (2)

Bon (3)

Excellent (4)

Gestion d'erreurs

Pas de gestion, crashs fréquents

Try-catch basique

Gestion avec messages explicites

Validation systématique avec exceptions typées et messages détaillés

Configuration

Valeurs en dur dans le code

Quelques constantes

Namespace Config dédié

Configuration complète centralisée et documentée

Complexité visuelle

Objet 3D simple

Cube + axes

Cube + axes + marqueurs

Rendu multiple avec cercles aux coins, codes couleur cohérents, etc…

Adaptabilité

Code non modifiable

Paramètres modifiables manuellement

Paramètres centralisés

Architecture extensible pour nouveaux marqueurs/objets 3D

5. Algorithmes et techniques avancées

Critère

Insuffisant (1)

Satisfaisant (2)

Bon (3)

Excellent (4)

Tri de points

Ordre incorrect ou aléatoire

Tri basique par coordonnées

Algorithme avec séparation haut/bas

Tri robuste garantissant correspondance coins physiques/virtuels

Transformation coordonnées

Conversion incorrecte

Conversion partielle

Matrices complètes OpenCV -> OpenGL

Pipeline complet avec Rodrigues, transposition et conversion types

Optimisation pipeline

Calculs redondants à chaque frame

Quelques optimisations

Pipeline structuré

Réutilisation textures, mise à jour conditionnelle, buffering efficace

6. Tests et validation sur données réelles

Critère

Insuffisant (1)

Satisfaisant (2)

Bon (3)

Excellent (4)

Image statique fournie

Ne fonctionne pas sur l'image test

Détection partielle avec erreurs

Détection fonctionnelle avec quelques imprécisions

Détection et superposition 3D parfaitement alignées

Séquence vidéo fournie

Ne fonctionne pas sur la vidéo test

Suivi instable, nombreuses pertes

Suivi fonctionnel avec pertes occasionnelles

Suivi robuste sans perte sur toute la séquence

Vidéo acquise par l'élève

Pas de vidéo personnelle testée

Ne fonctionne que dans des conditions idéales

Fonctionne dans des conditions variées

Fonctionne avec différents éclairages, angles et distances

Flux caméra temps réel

Pas d'implémentation caméra en direct

Fonctionne mais avec latence importante

Suivi temps réel fonctionnel

Suivi temps réel fluide et robuste avec adaptation automatique

Système de Notation

Échelle d'évaluation :
• Insuffisant (1 point) : Compétences de base non maîtrisées
• Satisfaisant (2 points) : Compétences de base acquises
• Bon (3 points) : Compétences intermédiaires maîtrisées
• Excellent (4 points) : Compétences avancées maîtrisées

Barème indicatif :
• 23-39 points : Niveau débutant - Compétences à développer
• 40-59 points : Niveau intermédiaire - Bases solides
• 60-79 points : Niveau avancé - Bonne maîtrise
• 80-88 points : Niveau expert - Excellente maîtrise
Note :

Réalité Virtuelle (RV)

L'objectif pédagogique du cours est de permettre aux apprenants de comprendre et de mettre en œuvre une application de réalité virtuelle. Le travail demandé vient en continuité du cours de réalité augmentée en :

L’apprenant sera capable de concevoir et d’assembler une architecture logicielle cohérente qui réutilise un code AR existant et y ajoute le labyrinthe, la sphère texturée, l’ombre et la gestion des deux modes d’affichage. Il pourra créer une mise en scène 3D complète autour du marqueur (organisation du labyrinthe, placement de la lumière, choix du fond virtuel) en tenant compte à la fois des contraintes techniques et de la lisibilité pour l’utilisateur.

1. Architecture et organisation du code

Critère

Insuffisant (1)

Satisfaisant (2)

Bon (3)

Excellent (4)

Structure modulaire

Code monolithique sans organisation

Quelques fonctions, organisation basique

Structures de données dédiées, fonctions bien organisées

Architecture claire (namespaces, structures cohérentes)

Documentation

Aucune documentation

Commentaires sporadiques

Commentaires sur fonctions principales

Documentation complète avec descriptions détaillées

Gestion des ressources

Fuites mémoire, pas de nettoyage

Nettoyage partiel

Gestion correcte des ressources OpenGL/OpenCV

Nettoyage systématique avec fonctions dédiées

Intégrité du code hérité RA

Le prototype RA est cassé

Le prototype RA fonctionne mais modifié

Le prototype RA conservé avec modifications minimales

Prototype RA complètement préservé, évolution clean vers VR sans régression

2. Géométrie et Construction du Labyrinthe

Critère

Insuffisant (1)

Satisfaisant (2)

Bon (3)

Excellent (4)

Positionnement relatif au marqueur

Murs mal placés, non alignés

Murs grossièrement positionnés

Murs bien positionnés autour du marqueur

Disposition précise avec marges cohérentes, structure géométrique robuste

Dynamique de suivi

Labyrinthe figé, ne suit pas le marqueur

Suivi imprécis ou avec décalage

Suivi correct du marqueur

Suivi fluide et précis, adaptation automatique de la matrice de transformation

3. Sphère Texturée et Matériaux

Critère

Insuffisant (1)

Satisfaisant (2)

Bon (3)

Excellent (4)

Génération de la sphère

Absente

Sphère basique sans qualité visuelle

Sphère avec UV mapping correct

Sphère optimisée avec paramétrage UV précis

Texturage

Pas de texture

Texture appliquée (UV incorrectes)

Texture correcte

Texture de haute qualité (mipmapping, filtrage …)

Propriétés matériau

Pas de matériau défini

Couleur basique uniquement

Diffuse + specular

Diffuse + specular + ambient + shininess paramétrables

4. Ombres et Ombrage

Critère

Insuffisant (1)

Satisfaisant (2)

Bon (3)

Excellent (4)

Ombre simple

Pas d’ombre

Ombre basique (projection orthogonale)

Ombre au sol avec géométrie correcte

Ombre avec perspective adaptée

Performance ombre

Ralentissement significatif

Léger ralentissement

Impact négligeable (< 5% fps)

Aucun impact ressenti

5. Éclairage

Critère

Insuffisant (1)

Satisfaisant (2)

Bon (3)

Excellent (4)

Modèle d’éclairage

Pas d’éclairage, flat color

Éclairage diffus basique (Lambertien)

Phong ou Blinn-Phong complet

PBR (Physically Based Rendering) ou Phong avancé

Shaders spécialisés

Shaders génériques ou absents

seul shader pour tout

Shaders séparés pour labyrinth et sphère

Shaders optimisés par type de géométrie

6. Gestion des Modes AR/VR

Critère

Insuffisant (1)

Satisfaisant (2)

Bon (3)

Excellent (4)

Mode Augmenté (AR)

Absent ou non fonctionnel

Affichage vidéo + 3D avec décalage

Superposition correcte vidéo et 3D

Superposition précise avec gestion profondeur, blending adapté

Mode Virtuel (VR)

Absent ou non implémentable

Basculement basique, fond blanc

Basculement vers fond virtuel fonctionnel

Fond virtuel (skybox, couleur, texture) avec transition fluide

Basculement AR ↔︎ VR

Non implémenté

Basculement manuel fragile

Basculement stable via touche

Basculement instantané et robuste, gestion des ressources propre

7. Rendu 3D et Performance

Critère

Insuffisant (1)

Satisfaisant (2)

Bon (3)

Excellent (4)

Qualité visuelle globale

Aliasing visible, textures floues

Qualité acceptable en standard

Bonne qualité visuelle, peu d’artefacts

Rendu lisse, sans aliasing notable, cohérence visuelle

Performance temps réel

< 15 fps instable

-20 fps avec variations

-25 fps stable

≥ 25 fps constant avec headroom (< 80% charge)

Système de Notation

Échelle d'évaluation :
• Insuffisant (1 point) : Compétences de base non maîtrisées
• Satisfaisant (2 points) : Compétences de base acquises
• Bon (3 points) : Compétences intermédiaires maîtrisées
• Excellent (4 points) : Compétences avancées maîtrisées

Barème indicatif :
• 20-33 points : Niveau débutant - Compétences à développer
• 34-46 points : Niveau intermédiaire - Bases solides
• 47-59 points : Niveau avancé - Bonne maîtrise
• 60-72 points : Niveau expert - Excellente maîtrise


L’expérience utilisateur sera prise en compte pour la note finale.

Réalité Mixte (RM)

L’objectif pédagogique du cours est de permettre aux apprenants de concevoir une expérience de réalité mixte interactive, où des objets virtuels coexistent et interagissent avec un plan réel tracké en temps réel. Ils devront implémenter une bille dont le mouvement dépend directement de l’inclinaison du plan.
Pour intégrer convenablement la communication homme-machine, Il s’agira également de mettre en œuvre une physique de jeu robuste : collisions bille–murs, rebonds, stabilité numérique et jouabilité en conditions réelles. Les apprenants développeront une génération procédurale de labyrinthes à complexité contrôlée, avec un départ et une arrivée garantissant une progression cohérente. Enfin, ils mettront en place une boucle de jeu (démarrer, valider la sortie, passer au niveau suivant) et, en option, des paramètres ajustables (vitesse, restitution des rebonds) pour expérimenter l’équilibrage.

1. Architecture et organisation du code

Critère

Insuffisant (1)

Satisfaisant (2)

Bon (3)

Excellent (4)

Structure modulaire

Code monolithique sans organisation

Quelques fonctions, organisation basique

Structures de données dédiées, fonctions bien organisées

Architecture claire avec « namespaces », structures cohérentes …

Documentation

Aucune documentation

Commentaires sporadiques

Commentaires sur fonctions principales

Documentation « Doxygen » complète avec descriptions détaillées

Gestion des ressources

Fuites mémoire, pas de nettoyage

Nettoyage partiel

Gestion correcte des ressources OpenGL/OpenCV

Nettoyage systématique avec fonctions dédiées

2. Physique bille et plan

Le mouvement attendu peut être modélisé en projetant la gravité sur le plan incliné et en intégrant la dynamique à chaque frame.
https://www.physicsclassroom.com/class/vectors/Lesson-3/Inclined-Planes

Critère

Insuffisant (1)

Satisfaisant (2)

Bon (3)

Excellent (4)

Mouvement selon inclinaison

Mouvement absent ou incohérent

Mouvement présent mais peu fidèle (sens/échelle discutables)

Mouvement cohérent (direction, échelle), stable.

Mouvement réaliste avec paramétrage (gain, friction), stabilité exemplaire

Conversion pose → inclinaison

Ne tient pas compte de l’orientation trackée.

Prend en compte une partie des axes, erreurs fréquentes

Exploite correctement l’orientation du plan pour piloter la bille

Mapping robuste (axes, repères), indépendant des conventions caméra/monde

Intégration temporelle

Instable (explosions, oscillations)

Stable mais dépend fortement du FPS

Stable avec dtdt explicite et limites raisonnables

Stable et robuste (clamp dtdt, semi-implicite, comportement identique selon FPS)

Dissipation (friction)

Pas de friction, bille “glisse” indéfiniment

Friction ad-hoc, résultats peu contrôlables

Friction cohérente, paramétrable

Pas de friction, bille “glisse” indéfiniment

Stabilité avec tracking bruité

La bille devient inutilisable (sauts)

Filtrage minimal, “jitter” visible

Filtrage/atténuation efficace (lissage pose ou accélération)

Compensation avancée (filtrage temporel, anti-sauts), très jouable en conditions réelles

3. Collisions et rebonds

Critère

Insuffisant (1)

Satisfaisant (2)

Bon (3)

Excellent (4)

Détection sphère–murs

Aucune ou très incomplète

Détection partielle, collisions ratées

Détection fiable sur l’ensemble des murs

Détection robuste (coins, couloirs étroits), sans “tunneling” notable

Réponse au contact

Bille traverse ou colle aux murs

Rebond présent mais instable

Rebond stable avec restitution correcte

Rebond stable + gestion frottement tangentielle, restitution paramétrable

Confinement dans le labyrinthe

Sort de la zone/monde.

Confinement approximatif

Confinement correct et constant.

Confinement impeccable, y compris lors de tracking partiel/latence

Gestion des cas limites

Comportements erratiques aux angles

Coin/angles parfois problématiques.

Angles gérés correctement

Gestion avancée (résolution itérative, correction pénétration), très robuste

. Génération automatique du labyrinthe

Les algorithmes "classiques" de génération (ex. DFS/backtracking, Prim) permettent de générer des labyrinthes connectés, souvent "parfaits" (un seul chemin entre deux cellules), ce qui facilite la maîtrise de la difficulté.
https://dumbgenius.github.io/experiments/mazegen/

Critère

Insuffisant (1)

Satisfaisant (2)

Bon (3)

Excellent (4)

Génération procédurale

Labyrinthe figé (manuel) ou non fonctionnel

Génération simple mais peu contrôlée

Génération fonctionnelle avec paramètres de taille

Génération maîtrisée (taille + complexité) et répétable (seed)

Maîtrise de la complexité

Impossible d’ajuster la difficulté

Ajustement grossier (taille seulement)

Ajustement via plusieurs paramètres (taille, densité, couloirs)

Ajustement fin + progression par niveaux (courbe de difficulté)

Départ & arrivée (validité)

Départ/arrivée absents ou non atteignables

Parfois atteignables

Toujours atteignables, règles claires

Validation automatique (chemin garanti), placement pertinent et équilibré

Génération géométrie 3D

Murs mal générés/artefacts

Géométrie minimale mais cohérente

Géométrie correcte (murs, sol, bords)

Géométrie optimisée + cohérence visuelle (UV, normales), adaptée au jeu

5. Gameplay et interface

Critère

Insuffisant (1)

Satisfaisant (2)

Bon (3)

Excellent (4)

Boucle de jeu (états)

Pas de logique de jeu

Démarrage/fin partiels

États clairs (menu/démarrage, jeu, victoire)

Gestion complète (pause, restart, niveau suivant), transitions robustes

Condition de victoire

Non définie.

Définie mais peu fiable

Détection fiable de l’arrivée

Détection robuste + feedback clair (zone, effet, son/texte)

Passage au niveau suivant

Non implémenté

Implémenté de manière fragile.

Implémenté et stable

Progression fluide + difficulté qui augmente de façon maîtrisée

UI / HUD

Absent

UI minimale (texte brut)

UI claire (niveau, instructions, état)

UI soignée + options (réglages) + retour utilisateur (messages/indicateurs)

Paramètres optionnels

Non disponible

paramètre modifiable en dur

Paramètres modifiables (vitesse, rebond…)

Paramètres modifiables + sauvegarde/presets + limites cohérentes

4. Tests

Critère

Insuffisant (1)

Satisfaisant (2)

Bon (3)

Excellent (4)

Intégration MR (tracking)

Le monde 3D ne suit plus le marqueur

Suit partiellement, dérive notable

Suit correctement, stable

Très stable (filtrage, perte temporaire gérée), jouable en conditions réelles

Performance temps réel

Très lent / instable

Jouable mais chutes fréquentes

Fluide la plupart du temps

Fluide et constant, marge de performance

Robustesse (perte tracking)

Crash ou comportement incohérent

Se dégrade fortement

Dégradation acceptable, reprise correcte

Reprise propre (freeze, reset contrôlé), expérience utilisateur solide

Tests sur données

Aucun protocole de test

Test sur un seul cas

Test sur image/vidéo/flux caméra

Test complet + cas difficiles (éclairage, angles, occlusion partielle)

Système de Notation

Échelle d'évaluation :
• Insuffisant (1 point) : Compétences de base non maîtrisées
• Satisfaisant (2 points) : Compétences de base acquises
• Bon (3 points) : Compétences intermédiaires maîtrisées
• Excellent (4 points) : Compétences avancées maîtrisées

Barème indicatif :
• 20-50 points : Niveau débutant - Compétences à développer
• 50-69 points : Niveau intermédiaire - Bases solides
• 70-84 points : Niveau avancé - Bonne maîtrise
• 85-100 points : Niveau expert - Excellente maîtrise


L’expérience utilisateur sera prise en compte pour la note finale.