Plan

Remarques : 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