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 ?