La structure du programme :
Il s'organise en 4 parties distinctes:
- Decor.h, Decor.cpp : La définition de la scène où évoluent les objets (ours, balles).
- character.h, character.cpp : La définition des "acteurs" de la scène.
- Tex.cpp, tex.h : Définition de fonctionnalités pour le chargement de textures au
format raw.
- Scene.c : La partie principale, où sont définis le comportement des acteurs et de
l'application.
- global.h : Réunit les variables globales communes à chaque partie.
|
Dans ce module sont définis les textures de type paramétré, les textures
importées, les types de lumières de la scène, la définition du sol et des ombres qui s'y projettent.
Textures paramétrées : :
Il s'agit d'un tableau de caractères représentant chacun une valeur de pixel.
static char *carres[] = { |
"vbvbvbvb", | // v:pixel vert |
"bbb.b.bb", | // b:pixel bleu |
"v.bbvbbb", | // .:pixel par défaut |
"bbvbbbvv", | // dans cet example |
"bbvbbbvv", |
"v.bbvbbb", |
"bbb.b.bb", |
"vbvbvbvb", |
}; |
A l'initialisation des textures le tableau est converti en tableau
de pixels et mappé sur le sol grâce à la fonction glTexImage2D(...........).
Il existe 3 types de lissages de textures qui sont GL_NEAREST, GL_LINEAR,
GL_LINEAR_MIPMAPS, dans le sens de la texture la moins lissée à la plus lissée.
 | GL_NEAREST |
 | GL_LINEAR_MIPMAPS |
Textures importées : :
Ces textures appliquées sur le sol sont importées à partir de fichiers
raw situés dans le répertoire 'textures'. Elles sont chargées à l'aide des fonctions définies
dans le module Tex.
Les Lumières : :
La scène comporte 3 lumières(rouge, verte, bleue).
Elles sont toutes du type suivant:
glLightfv(GL_LIGHT1, GL_DIFFUSE, lightColor[1]); |
glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, 0.1); |
glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, 0.05); |
La lumière ambiante est spécifiée sur la première lampe. Les lampes
de la scène ont deux modes de fonctionnement: lumière multidirectionnelle et cone de lumière.
Ces derniers modes ainsi que l'affichage des lampes sont gérés dans le module Scène.
La définition du sol : :
Le sol est un simple rectangle sur lequel sont appliquées les textures
paramétrées ou importées à partir de fichiers *.raw. La taille du quadrillage peut être
spécifiée de la façon suivante:
glBegin(GL_QUAD_STRIP); |
... |
glTexCoord2f((i+1)/(float)(10)*t, j/(float)(10)*t); |
... |
glEnd(); |
où t correspond au nombre de cases présente sur le sol.
Les ombres : :
Pour le calcul des ombres est définie une matrice de projection
à partir de la position des lumières et de l'équation du plan (sol). Le rendu des
ombres est par la suite traité dans le module Scène.
|
Les acteurs de la scène :
Ce module définit sous forme de listes les objets présents dans
la scène (ours + balles).
glNewList(OBJET1, GL_COMPILE); |
... |
// définition de l'apparence, la forme, |
// la position par défaut, |
// la précision du rendu. |
glEndList(); |
Chaque élément est défini de telle façon qu'il n'est pas nécessaire
par la suite d'effectuer des transformations supplémentaires lors de leur appel à
l'initialisation. La gestion des mouvements est faite dans le module Scene en
effectuant les transformations adéquates pour créer le mouvement des acteurs de la scène.
|
La scène :
Deux fonctions dessinent les "personnages" présents dans la scène:
drawbear(...) et drawball(...)
Ces fonctions appellent les différents éléments qui constitue les acteurs
en fonction des paramètres de mouvements spécifiés dans la fonction idle(). A chaque affichage de
la scène, qui s'effectue dans redraw(), les fonctions drawbear(...) et
drawball(...) redessine les acteurs.
La cadence de l'animation est déterminée dans le idle() à partir du temps
écoulé depuis le lancement du programme.
Le chemin des balles est déterminé à partir d'un tableau qui
contient les coordonnées du parcours des balles, un calcul paramétré permet un
jonglage plus ou moins large.
Deux fonctions permettent la gestion de la souris:
mouse(...) et motion(...).
La gestion du clavier est effectuée de plusieurs façons:
Pour les touches "normales":
glutKeyboardFunc(key) et key(char c,....)
Cette fonction détermine les variables globales à modifier en fonction de la touche.
Pour les touches "spéciales": GLUT_KEY_UP, GLUT_F4, ...
glutSpecialFunc(specialKey) et specialKey(int state,...)
Cette fonction fonctionne de la même façon que la précédente.
Pour l'évênement "touche relâchée" (touches spéciales):
glutSpecialUpFunc(specialKeyUp) et specialKey(int state,...)
Permet d'arreter le déplacement lorsque la touche de controle est relachée.
|