M2PRO - Images
Année 2009-2010

TP2 - Gestion de Scènes



Partie 1 : visibilité d'un objet

    Q1. écrivez une fonction permettant de déterminer qu'un point est visible (par la caméra, connaissant les transformations... ).
   
        int point_visible( const VEC3 p, const MAT44 M );

    rappel : un point (projette) ph( xh, yh, zh, wh ) est visible si : -wh < xh < wh et -wh < yh < wh et -wh < zh < wh.


    Q2. écrivez une fonction permettant de déterminer qu'une boite englobante est visible (par la caméra).

    int aabox_visible( const AABOX box, const MAT44 M );

    rappel : il est plus simple de vérifier qu'une boite est "non visible" : tous ses sommets sont à l'extérieur du même plan du volume de vision, ce qui s'exprime :
    tous ses sommets vérifient la même inégalité : xh < -wh, xh < wh, yh < -wh, yh > wh, et zh < -wh, zh > wh.

Partie 2 : visibilité hiérarchique

    Q1. une scène est composée de plusieurs objets placés et orientés dans un repère commun. un objet est composé d'un maillage, d'une boite englobante et d'une transformation (passage repère local, repère de la scène).
    écrivez l'ensemble de fonctions permettant d'insérer un objet à sa place dans la scène.

    void scene_inserer( SCENE *scene, const OBJET *objet, const MAT44 M );
    void scene_deplacer( SCENE *scene, const OBJET *objet, const VEC3 direction );
    void scene_orienter( SCENE *scene, const OBJET *objet, const VEC3 axe, const float angle );

    remarque : commencez par un simple tableau dynamique pour stocker les objets et leurs transformations.


    Q2. écrivez la fonction d'affichage de la scene. vérifiez la visibilité de chaque objet avant de l'afficher en testant la visibilité de sa boite englobante.

    void scene_afficher( SCENE *scene, const MAT44 view, const MAT44 projection );


    Q3. remplacez le simple tableau par une structure hiérarchique qui permet de tester efficacement la visibilité de zones complètes de la scène sans parcourir les objets associés.

    étape 1 : choisir une structure de données hiérarchique : un octree, par exemple.
    l'objectif de la hiérarchie est de grouper les objets proches et de construire une boite englobante de cette zone de la scène (pour faire un test de visibilité hiérarchique).

    algorithme de construction :
        le plus simple est d'insérer les objets dans le noeud qui contient le centre de la boite englobante de l'objet.
        les objets ne sont stockés que dans les feuilles de l'octree. l'algorithme d'insertion est récursif et s'arrete lorsqu'il y a moins de 8 (ou 10) objets dans une feuille.
        lorsqu'il y a trop d'objets dans une feuille, il suffit de créer les 8 fils et de répartir les objets entre eux.
        à chaque fois qu'un objet est inséré dans une feuille, il faut recalculer la boite englobante de la feuille et de tout ses noeuds parents.

    étape 2 : test de visibilité hiérarchique.
    chaque noeud de l'octree doit connaitre la boite englobante de tous les objets insérés dans son sous-arbre.
    il suffit donc de tester récursivement la visibilité des noeuds de l'octree, le parcours en profondeur s'interompt lorsque sa boite englobante n'est pas visible.


    Q4. ordre d'affichage.
    afin d'exploiter au mieux le z-buffer, il est nécessaire d'afficher les objets en s'éloignant de la caméra.
    modifiez la fonction d'affichage de la scène.


Partie 3 : visibilité statique

    La strucutre hiérarchique de la partie 2 est efficace, mais elle recalcule constamment la visibilité de tous les objets, y compris celle des objets qui ne bougent pas. comment rendre le test sur les objets statiques plus efficace ?