Plan
Remarques :
-
Le squelette de ce TP est long car il contient
beaucoup de fonctions utilitaires (qui existent peut-être
ailleurs mais que je n'ai pas trouvé).
-
Squelette : o_ex_plan.c.
-
L'objet plan est le plan Z=0 fait pour être vu par dessus.
-
L'objet plan contient de nombreux booléen qui permettent
de décider ce qui est affiché. Par défaut rien.
-
La fonction d'affichage de l'objet plan est en partie
écrite pour vous simplifier la vie.
Vous devez compléter les fonctions vides.
La suite de ce texte donne quelques indications
pour certaines des fonctions.
Il est important que vous essayez de comprendre
la fonction "affiche" pour voir à quoi correspondent
les fonctions que vous devez réaliser.
Affichage du plan
Faite l'affichage du plan dans la fonction affiche_plan.
Le plan est infini et doit être correctement orienté.
De plus il doit être ``correctement'' éclairé si l'on
suppose que l'utilisateur travaille près de l'origine.
Projection orthogonale
Faire la projection de la scène complète sur le plan
sans modifier un seul attribut graphique.
Vous n'avez besoin que de fonctions Open GL classiques
que vous avez déjà utilisé ainsi que de la fonction
affiche_modele(o, urgent) pour demander
à réafficher tout le modèle.
Transformation du plan appliquée aux projections
Avec la méthode précédente, si l'on applique une transformation
à l'objet plan, celui-ci se déplace avec la projection orthogonale.
Ceci peut être utile dans quelques rares cas, mais la plupart
du temps, on ne souhaite pas se comportement.
Comment l'éviter ? Si T est la transformation courante du plan
et P la projection orthogonale, vous avez mis votre repère courant
à T.P.
Or ceci n'est pas bon, en effet, les objets qui vont être
tracé après vont aussi subir la transformation du plan.
Donc vous devez calculer T.P.T-1.
C'est un peu le même problème que de faire une rotation
autour d'un axe quelconque alors que vous n'avez
que la rotation d'axe Z
Pour faire cela vous avez besoin (dans le désordre) de
glGetDoublev avec GL_MODELVIEW_MATRIX
inversion4x4
glMultMatrixd
Découpage positif
La projection orthogonale s'applique aux objets qui sont des
deux cotés du plan, il peut être intéressant de ne projeter
que ceux du coté positif. Pour cela on ajoute
un plan de découpage (glClipPlane, GL_CLIP_PLANE0, glEnable)
La difficulté est que le découpage s'effectue dans l'expace de
modélisation, or, lors de la projection on vient d'applatir
l'espace, il n'est donc plus possible de le découper.
L'astuce est donc de transformer :
MATRICE_PROJECTION=P
MATRICE_MODELISATION=M
en
MATRICE_PROJECTION=P*M
MATRICE_MODELISATION=Identité
On a besoin de glMatrixMode pour indiquer sur
quel matrice on veut travailler.
Projection en noir
Utilisez glBlendFunc et glEnable
pour que tout soit dessiné en noir avant l'affichage
du modèle projeté.
Ombres portées
La fonction affiche_projection reçoit en paramètre
les coordonnées de la source lumineuse.
Utilisez-les pour calculer la matrice de perspective
associée à la lampe pour qu'elle projète les objets
sur le plan.
Je vous conseille de créer la matrice perspective unitaire
vous même, puis de la positionner correctement.
D'autre part, il faut ajouter un deuxième plan de découpage
pour que les objets derrière la lampe ne fassent pas d'ombre.
Ombre assombrissant le plan
On ne peut pas faire cette action simplement
sauf en utilisant des extensions Open GL.
La méthode compliqué consiste à afficher le plan de sa couleur normale,
puis les ombres, pui afficher a nouveau le plan avec cette
fois une couleur transparente pour teinter les ombres....
Thierry EXCOFFIER
Last modified: Wed Aug 30 15:05:58 CEST 2000