Présenté à Richard
Égli
Université de Sherbrooke
Faculté des Sciences, Département Math-Info
IFT528 - Synthèse d'images
Session automne 2001
Table des matières
- Introduction
- Textures
- Collage des textures sur les objets
- Langage de definition de scène
- Autres ajouts et modifications à
N3D
- Images Démonstratives
- Améliorations possibles (extensions
envisageables)
- Références et inspirations
utilisées
1. Introduction
Notre projet consiste principalement à implémentation d'un
arbre de textures 2D et 3D. Nous avons défini plusieurs textures
pouvant être combinés ensemble. De plus, nous avons
intégré la perturbation du vecteur normal aux textures 2D.
Cela a rendu possible la création d'une texture tuile. Enfin,
nous avons aussi fait la transparence.
1.1 Compilation du projet
1.1.1 Linux
Nous avons en grande partie utilisé Linux comme environnement
de développement tout en restant compatible avec Windows. Pour
compiler notre projet sous Linux, il faut avoir certaines composantes d'installées
et bien configurées.
- GNU GCC (testé avec 2.96 ou 3.0)
- Lib OpenGL (Mesa3D)
- gmake
Pour compiler le projet, il suffit de faire
make ou
gmake
dans le répertoire source du projet. Un fichier Makefile
est inclus. Normalement, une installation par défault (avec
packages de développement) de Redhat 6.2, 7.x premet une compilation
sans problèmes.
1.1.2 Microsoft Visual C++ (Windows)
Nous avons aussi fait les adaptations nécessaires pour compiler sous
windows.
- Visual C++ (5.0 et 6.0)
- Borland C++ (5.02)
1.2 Arborescence des fichiers du projet
- projet
- doc (contient la documentation du projet,
une version électronique du rapport remis en classe)
- galerie (contient des images générés
démonstratives des propriété implantées dans notre
projet)
- scenes (contient les fichiers sources (.scn et .vsn)
nécessaire à la génération des images dans la
galerie et le rapport)
- src (contient les sources du moteur
n3d et les modifications nécessaires au bon fonctionnement de notre
projet)
- working (contient les fichiers des scènes originales
du moteur n3d (tp1 et tp2) et certaines scènes de tests pour notre
projet)
2. Textures
2.1 Implémentation des textures
Une texture 2D est une fonction qui associe un ou des attributs
non-géométique à un point
u,
v données.
En général, les textures sont définies pour
des valeurs de u et v entre 0 et 1 inclusivement. Les textures
3D sont définient de façon similaire en 3 dimensions.
Chaque type de texture est représenté par une classe
dérivée d'une classe abstraite
Texture (textures.h/.cpp).
Un type de texture doit implémenter une ou plusieurs méthodes
virtuelles. comme par exemple,
appliquer2D() et/ou
appliquer3D()
.
Bref exemple:
class MaTexture : public Texture{
public:
...
void appliquer2D(Attributs& attr, const reel& u,
const reel& v){
if ( u < v )
attr.diffus(Couleur(0.7, 0, 0));
else
attr.diffus(Couleur(0, 0.7, 0));
}
};
|
Cela aurait pour effet de créer quelque chose comme:
Méthodes surdéfinissables de la classe Texture:
Méthode
|
Description et cas
|
appliquer(Attributs&, const reel&,
const reel&, const point&)
|
Cette méthode est utilisé dans
un cas très spécial : lorsque la texture est à la
fois 2D et 3D. Ce cas particulier se produit lors du mélande
de textures 2D et 3D.
Exemple: Quadrillé avec cases en bois et marbre
.
Par défault, appliquer() appelle appliquer2D() et appliquer3D().
Dans certains cas, il est nécessaire de sur-définir la métode
appliquer.
|
appliquer2D(Attributs& a, const
reel& u, const reel& v)
|
Cette méthode reçoit un point
2D dans l'espace de texture (sous forme de u et v)
qui représente l'endoit exact où sera appliquer la texture.
Un texture doit modifier les attributs non-géométique
a pour prendre effet.
|
appliquer3D(Attributs& a, const
point& p)
|
Cette métode reçoit un point
3D p . La méthode doit modifier les attributs
a pour prendre effet.
|
perturbeVN(const vecteur& u, const
vecteur&v, const reel&x, const reel&y, vecteur&n)
|
Cette méthode doit être redéfinie
lorsque la texture perturbe le vecteur normal. Cette dernière
reçoit les vecteur u et v. Ces vecteurs représentent
un plan 2D tangent au point où il aura perturbation du vecteur
normal. De plus, perturbeVN reçoit x et y qui
représente un point dans l'espace de texture (même chose
que u et v dans appliquer2D()). Enfin, le vecteur n est
le vecteur normal à perturber. Initialement, le vecteur
n reçu est le vecteur normal calculé par un objet atomique.
|
2.2 Attributs non-géométiques
Pour le tracé de rayons, les textures sont
appliquées au moment du calcul d'intersection, dans la fonction
Objet_Inter (inter.cpp). Les textures sont une sorte
de surdéfinition des attributs non-géométiques.
Par exemple, on pourrait définir un cube ayant un coefficient
diffus (CD), un coefficient spéculaire (CS), un
coeffiecient de réflexion parfaire (CR), et un coefficient
de transmission diffuse (TD). Sur une face en particulier,
on pourrait décider de changer le niveau de réflexion parfaite
(CR). Tout cela était déjà implanté
dans le noyau graphique original du cours (N3D). Nous avons conservé
une approche similaire pour les textures. Dans le présent exemple,
notre texture modifie seulement les attributs CD et CS. CR et TD
resterons inchangés.
2.3 Textures de bases.
Nous avons définit plusieurs textures de bases:
Uniforme
Syntaxe : UNI {coefficiant R G B} FTX
La texture Uniforme est une texture qui modifie les attributs
non-géométiques de façon uniforme quelque soit les
valeurs de u et v sur l'espace de texture. Autrement dit,
la texture uniforme a exactement le même effet que la spécification
d'attributs non-géométique à un objet. Cet texture
est destinée à être utilisée dans des textures
prenant d'autres textures en paramètres, comme un quadrillé
2D.
Exemple: UNI CD 0.7 0.0 0.0 CS 0.7 0.0 0.0
FTX
Cela définit une suface rouge.
Quadrillé
Syntaxe : QUAD texture1 texture2 [GU gu
GV gv] [DEPHASAGE de] FTX
La texture quadrillé définit un damier de 1/gu case(s)
de large par 1/gv case(s) de haut sur l'espace de texture (0,0)-(1,1).
Par défault les valeurs de gu et gv sont de 0.125, ce qui donne
un échiquier (8x8). Les paramètres texture1 et texture2
sont les textures à appliquer pour chaque type de case. À
l'application d'un quadrillé, chaque case est un espace complèt
pour les sous textures texture1 et texture2.
Exemple #1: définition d'un quadrillé 4x4 rouge
et bleu alterné.
QUAD UNI CD 0.8 0 0 FTX UNI CD 0 0
0.8 FTX GU 0.25 GV 0.25 FTX
Résultat:
Fichier scène : rapport_quad00.scn
Exemple: définition d'un quadrillé 4x4 contenant
des sous-quadrillé 3x3.
QUAD
QUAD UNI CD 0.8 0 0 FTX UNI CD 0.4 0.8 0 FTX
GU 0.3333 GV 0.3333 FTX
QUAD UNI CD 0 0 0.8 FTX UNI CD 0.2 0.6 0.3
FTX GU 0.3333 GV 0.3333 FTX
GU 0.25 GV 0.25
FTX
Résultat:
Fichier scène : rapport_quad01.scn
Exemple : définition d'un quadrillé 4x4 avec 0.5
de déphasage.
QUAD
UNI CD 0.8 0 0 FTX UNI CD 0 0 0.8 FTX
GU 0.25 GV 0.25 DEPHASAGE 0.5
FTX
Fichier scène : rapport_quad02.scn
Tuile
Syntaxe : TUILE DMORTIER dmortier DPENTE
dpente NIV3D niveffet3D texturecentre attributsmortier FTX
La texture tuile donne un effet de tuile. dmortier spécifie
la demi largeur du mortier entourant la tuile. dpente est la largeur
pendant laquelle la tuile. Sur la monté de la tuile, il
y a perturbation du vecteur normal pour donner un effet de changement de
géométrie.
Exemples:
TUILE DMORTIER
0.02 DPENTE 0.01 NIV3D 0.4
UNI CD 0.44 0.5 0.56 CS 0.44 0.5 0.56
FTX
CD 0.74 0.74 0.74 CS 0.74 0.74 0.74
FTX
Fichier scène : rapport_tuile00.scn
|
|
QUAD
TUILE DMORTIER 0.02 DPENTE 0.01 NIV3D 0.4
UNI CD 0.44 0.5 0.56 CS 0.44 0.5 0.56
FTX
CD 0.74 0.74 0.74 CS 0.74 0.74 0.74
FTX
TUILE DMORTIER 0.02 DPENTE 0.01 NIV3D 0.4
UNI CD 0.68 0.84 0.90 CS 0.68 0.84 0.90
FTX
CD 0.74 0.74 0.74 CS 0.74 0.74 0.74
FTX
GU 0.25 GV 0.25
FTX
Fichier scène : rapport_tuile01.scn
|
|
QUAD
TUILE DMORTIER 0.02 DPENTE 0.01 NIV3D 0.4
UNI CD 0.44 0.5 0.56 CS 0.44 0.5 0.56
FTX
CD 0.74 0.74 0.74 CS 0.74 0.74 0.74
FTX
TUILE DMORTIER 0.02 DPENTE 0.01 NIV3D 0.4
UNI CD 0.68 0.84 0.90 CS 0.68 0.84 0.90
FTX
CD 0.74 0.74 0.74 CS 0.74 0.74 0.74
FTX
GU 0.25 GV 0.25
FTX
Fichier scène : rapport_tuile01.scn
|
|
MultiTexture
Syntaxe : MULT texture1 texture2 ... texturen
FTX
MultiTexture est une texture permettant d'appliquer
plusieurs textures sur une même surface. Dans le cas où
plusieurs textures modifient les mêmes attributs géométrique,
l'ordre d'application est important. Les textures sont appliquées
dans le même ordre dont elles sont passées en paramètre.
Exemple:
Définition d'un pentagone rouge par dessus
un quadrillé 8x8.
TX MULT
QUAD UNI CD 0
0.6 0 FTX UNI CD 0 0 0.6 FTX FTX
DECOUPAGE UNI
CD 0.9 0 0 FTX UNI FTX NBCOTE 5 RAYON 0.35 FTX
FTX
Fichier scène : rapport_mult00.scn
Texture Découpage
Syntaxe : DECOUPAGE texture_interieur
texture_extérieur NBCOTE nb RAYON r FTX
La texture découpage permet de diviser l'espace de texture
en 2 zones par un polygone régulier à nb coté ayant
un rayon de r. La zone intérieur utilise la texture texture_intérieur
tandis que le reste utilise texture_extérieur. Si le nombre
de côté est plus petit que 3, la forme de découpage
est un cercle.
Exemple:
(Voir Multi-Texture pour un exemple de pentagone)
Autre Exemple:
Définir un grillage troué par dessus
un polygone vert.
TX QUAD
DECOUPAGE UNI CT 1 1 1
CD 0 0 0 FTX UNI CD 0.8 0.2 0.2 FTX NBCOTE 0 RAYON 0.4 FTX
DECOUPAGE UNI CT
1 1 1 CD 0 0 0 FTX UNI CD 0.8 0.2 0.2 FTX NBCOTE 0 RAYON 0.4
FTX
DEPHASAGE 0.5
FTX
Fichier scène : rapport_decoupage.scn
Image
Syntaxe :
IMAGE fichier.ppm attributs
FTX
La texture image prend un fichier PPM en
paramètre et les attributs sur lequels l'image sera appliqué.
Seules les formats P5 (256 niveaux de gris) et P6 (24bits/pixel) des
fichiers .PPM sont supportés.
Exemple:
Le logo de l'Université de Sherbrooke
sur un polygone.
IMAGE udeslogo.ppm CD 1 1 1 FTX
Fichier scène : rapport_image.scn
Bois
Syntaxe : BOIS FONCE couleur1 couleur2
RAYON grosseurcercle TURB turb FTX
La texture de bois est un groupe d'anneaux concentrés un par
dessus l'autre autour d'un axe coupant l'axe des Z avec un angle de 15 degrés.
Pour appliquer la texture de bois en un point, nous calculons sa distance
(rayon) avec cette axe et nous le perturbons avec une fonction
turbulence multiplié avec turb. Ensuite, on
divisons la distance perturbé avec grosseurcercle. Enfin,
selon un modulo, nous déterminons quel type de couleur il faut appliquer.
Exemple:
BOIS FONCE 0.54 0.27 0.0742
PALE 0.59 0.40 0.20 RAYON 0.12 TURB 0.3 FTX
Fichier scène : rapport_bois00.scn
Marbre
Syntaxe : MARBRE CD1
couleurdominante CD2 couleurtache FREQ freq TURB turb FREQTURB ft FTX
La texture marbre est une texture 3D imitant le marbre.
Cette texture est faite de la façon suivante:
t = sin( x + turb * turbulence(ft*x, ft*y, ft*z) où (x,y,z)
est le point dans l'espace de texture. Si t est inférieur
à zéro, c'est la couleurdominante qui sera prise. Par
contre, si t est compris entre 0 et 1, la couleur résultante sera
une interpolation entre la couleur dominante et la couleur des taches.
rapport_marbre00.scn
|
rapport_marbre02.scn
|
rapport_marbre02.scn
|
rapport_marbre03.scn
|
Marbre sans Turbulence.
|
Fonction turbulence.
|
Mabre avec un peu de turbulence.
|
Mabre avec moyennement de turbulence.
|
Exemple #1:
MARBRE CD1 1 1 1 CD2 0
0 0 FREQ 1 TURB 15 FREQTURB 1 FTX
Résultat : (voir 4e image dans le tableau ci-haut)
Exemple #2:
TX QUAD
TUILE DMORTIER 0.02
DPENTE 0.02 NIV3D 1
MARBRE
CD1 0.53 0.80 0.92 CD2 0 0 0.60 FREQ 10 TURB 25 FREQTURB 3 FTX
CD 0.74
0.74 0.74 CS 0.74 0.74 0.74
FTX
TUILE DMORTIER 0.02
DPENTE 0.02 NIV3D 1
MARBRE
CD1 0.55 0.73 0.56 CD2 0.18 0.54 0.34 FREQ 11 TURB 28 FREQTURB 3.1 FTX
CD 0.74
0.74 0.74 CS 0.74 0.74 0.74
FTX
GU 0.25 GV 0.25
FTX
rapport_marbre04.scn
Brique
Syntaxe : BRIQUE Texture1
Texture2 GrosseurU GrosseurV FTX
Crée une texture de brique. Texture1
est la texture du centre, et Texture2 est la texture pour le mortier. GrosseurU
et GrosseurV sont les dimensions d'une brique.
Exemple:
TX BRIQUE
TURBULENCE CD1 0.54 0.11 0.38 FREQ 14 AMPL 1 FTX
UNI CD 0.54 0.54 0.48 FTX
0.1 0.1
FTX
Vague
Syntaxe : VAGUE Frequence
Amplitude FTX
Perturbe le vecteur normal avec des sinus.
Exemple:
Fichier : rapport_vague.scn
2.4 Fonctions utilitaires
Les textures bois et marbres ont besoin de perturbations. Nous avons
implenté 2 fonctions populaire pour cela.
Noise (noise.cpp)
Nous avons implenté la fonction Noise. La fonction est disponible
sous forme de texture pour voir son effet. Voir
inspiration noise (8.1). Cette
fonction prend 3 valeurs en paramètre (x, y, z) et retourne une valeur
calculée en faisant une interpolation de 8 valeurs aléatoires.
Cette fonction est continue.
Texture Syntaxe : NOISE CD1
Attributs FREQ frequence AMPL amplitude FTX
Exemple:
TX NOISE CD1 0.9 0.2 0.3 FREQ 1 AMPL 1
rapport_noise00.scn
Turbulence
Nous avons implenté la fonction Turbulence. La fonction est
disponible sous forme de texture pour voir son effet. Voir
inspiration turbulence (8.1). Cette fonction prend 3 valeurs en paramètre
(x, y, z) et retourne une valeur. Turbulence fait la somme de plusieurs
fonctions noise().
Texture Syntaxe : TURBULENCE
CD1 attributs FREQ frequence AMPL amplitude FTX
Exemple:
TX TURBULENCE CD1 0.9 0.2 0.3 FREQ 1 AMPL
1
rapport_turbulence.scn
3. Collage des textures
sur les objets
3.1 Textures 2D
Les textures 2D peuvent être "mappées" sur la plupart
des objets atomiques.
3.1.1 Polygone
La façon de mapper les
textures 2D sur un polygone est définit par une structure de données
(class InfoAppliqueTexture2D) contenant 3 informations : un point d'origine
et deux vecteur u et v définissant le système de coordonnées
de l'espace de texture.
Si cette information n'est pas fournise dans le fichier source de
la scène (.scn), un sens d'application par défault de texture
sera détermineé à l'exécution. Le point
d'origine par défault est le premier sommet. Le vecteur u
est un vecteur reliant le sommet 1 au sommet 2. Le vecteur v est
le vecteur reliant le premier sommet au dernier sommet. Enfin, si
les vecteurs u et v ne sont pas perpendiculaire, v sera modifié
afin d'être perpendiculaire à u.
Par contre, il est possible de spécifier dans le fichier scène
comme appliquer la texture. Il suffit d'ajouter ATX tout juste après
avoir spécifier les sommets du polygone.
Syntaxe :
PG
{ sommet1 ... sommetn sommet1}
ATX origine vecteurU vecteurV FATX
TX .... FTX
ID
Important : lorsqu'on définit 2 vecteurs directeurs pour la
texture, il est important de faire attention à leurs longueurs.
La surface couverte par une longueur complète des 2 vecteurs
u et v définit complèment l'espace de texture. Au delà
de cette espace, les coordonnées (u,v) sur cette espace pourront
exéder la région (0,0)-(1,1).
Exemple:
Modification des vecteurs directeurs sur un polygone. Cette scène
est la première scène modifiée.
Avant
(rapport_quad00.scn)
u=(1,0,0) et v=(0,0,1)
|
Après
(rapport_atxpoly00.scn)
u=(1,0,0) et v=(1,0,1)
|
3.1.2 Plan
Pour un plan, il faut obligatoirement
spécifier la façon d'appliquer la texture. Si une
texture est donnée et que la section APTX n'est pas spécifiée,
la texture sera ignorée. En d'autres mots, pour un plan, il
n'y a pas de façon par défault d'appliquer une texture 2D.
3.1.3 Cylindre
Pour un cylindre, il n'y a qu'une
façon d'appliquer la texture et il n'est pas possible d'en spécifier
une autre. La coordonnée u sera "mapper" sur le sens du cercle
(en Y et Z) et la coordonnée v sera "mapper" à la hauteur
dans le cylindre (X).
Voici un
quadrillé 1x8 sur un cylindre
|
Voici un
quadrillé 8x8 sur un cylindre
|
3.1.4 Sphère
Tout comme le cylindre, il n'y
a pas possibilité de changer la façon d'appliquer une texture
sur une sphère. La coordonné u est déterminée
par la position du point à "mapper" sur le cercle (x,y) et la coordonné
v est mappée sur un demi cercle reliant les 2 pôles de la
sphère. Même s'il n'est pas possible de changer la façon
d'appliquer une texture 2D sur la sphère, cela n'est pas grave puisqu'il
est possible de faire des rotations sur la sphère.
Quadrillé 8x1 sur
une sphère
|
Quadrillé 8x8 sur
une sphère
|
3.1.5 Sur une forme quelconte (triangle)
3.2 Textures 3D
Par défault les textures 3D sont "mapper" directement avec leurs
coordonnées locales. Dans
Objet_Inter (
inter.cpp
), les valeurs U, V et W prennent respectivement les valeurs X, Y et Z
du point d'intersection. Tout comme les textures 2D, il est possible
de modifier la façon d'appliquer les textures 3D avec la section ATX3D.
Syntaxe :
OC
{ sommet1 ... sommetn sommet1}
ATX3D origine vecteurU vecteurV FATX3D
TX .... FTX
FI
ID
4. Langage de définition
de scène
Les textures et les changements
d'application de texture se lisent au même niveau que les attributs.
La fonction Lire_Attributs a été modifié de manière
à remplir une structure qui contient la texture et/ou l'application
de la texture au besoin. C'est lors du retour de la fonction pour lire les
attributs que la texture est attachée à l'objet.
Les attributs ont été divisé en deux classes.
Une classe de base pour contenir les attributs non-géométriques
de base, c'est-à-dire tous les coefficients. La texture est un attribut
non-géométrique qui est membre de la classe Attributs
et non pas membre de la classe BaseAttributs. La classe de base a été
créé pour caractériser les textures avec plusieurs coefficients.
Par exemple, la texture uniforme peut modifier le coefficient diffus et
celui miroir.
Trois fonctions ont été ajouté dans les fichiers
pour lire les composantes de la scène. Il s'agit de Lire_Texture,
Lire_Appliquer_Texture et Lire_BaseAttributs.
Des mots-clés ont été ajouté dans le tableau
(vnt) pour signaler le début d'une texture (TX), la fin d'une texture
(FTX), le début d'une application en deux dimensions d'une texture
(ATX) et le début d'une application en trois dimensions d'une texture
(ATX3D). Un autre tableau de mot-clés a été ajouté
pour les noms de textures et les autre mot-clés définissant
les textures.
4.1 Grammaire partielle
des ajouts faits au lecteur de la scène
AttributTexture -> «TX» Texture «FTX»;
Texture -> Uniforme | Quadriller | Tuile | Multiple | Image | Decoupage
| Noise | Turbulence | Bois | Marbre | Brique;
Uniforme -> «UNI» BaseAttributs;
BaseAttributs -> (CD reel reel reel) | (CS reel reel reel) | ...;
Quadriller -> «QUAD» Texture «FTX» Texture «FTX»
[Gu Gv] [Dephasage];
Gu -> «GU» reel;
Gv -> «GV» reel;
Dephasage -> «DEPHASAGE» reel;
Tuile -> «TUILE» DistanceMortier DistancePente Niveau3D
BaseAttributs Texture;
DistanceMortier -> «DMORTIER» reel;
DistancePente -> «DPENTE» reel;
Niveau3D -> «NIV3D» reel;
Multiple -> «MULT» Texture «FTX» {Texture «FTX»};
Image -> «IMAGE» nomfichier BaseAttributs;
Decoupage -> «DECOUPAGE» Texture «FTX» Texture
«FTX» NbCote [Rayon];
NbCote -> «NBCOTE» entier;
Rayon -> «RAYON» reel;
Noise -> «NOISE» CoefDiffus1 Frequence Amplitude;
CoefDiffus1 -> «CD1» reel reel reel;
Frequence -> «FREQ» reel;
Amplitude -> «AMPL» reel;
Turbulence -> «TURBULENCE» CoefDiffus1 Frequence Amplitude;
Bois -> Fonce Pale [Rayon Turb];
Fonce -> «FONCE» reel reel reel;
Pale -> «PALE» reel reel reel;
Turb -> «TURB» reel;
Marbre -> CoefDiffus1 CoefDiffus2 Turb Frequence FreqTurb;
CoefDiffus2 -> «CD2» reel reel reel;
FreqTurb -> «FREQTURB» reel;
Brique -> Texture «FTX» Texture «FTX» Grosseur;
Grosseur -> reel;
5. Autres ajouts
et modifications à N3D
Pour pouvoir utiliser les textures
à une plus grande échelle et produire des images de plus
grande qualité, nous avons fait certaines modifications supplémentaires
au noyau N3D. Les principaux ajouts sont la transparence sans réfraction
mais avec ombres et l'Anti-Aliasing avec "jittering".
5.1 Transparence sans réfraction avec ombres
La transparence a été sensiblement implantée comme
présenté dans le cadre du cours IFT528. La définition
des coefficiants de transmission a demeuré inchangé
puisqu'elle existait déjà dans n3d.
On utilise principalement la transparence pour créer des textures
avec des trous ou faire des effets avec les sources lumineuses. Créer
un quadrillé troués, des lampadaires ou un projecteur
sont des exemples qui sont utilisés dans nos scènes de démonstration.
5.2 Anti-Aliasing avec jittering
L'Anti-Aliasing avec jittering a été implanté pour
palier à la raisonnance que crée l'application de certaines
textures. Les tuiles au plancher en sont un très bon exemple.
5.3 Principales modifications apportées
aux fichiers sources noyau
Classe (fichiers)
|
Descriptions des ajouts et modifications
|
Textures.cpp et textimg.cpp
Ajout
|
Tous les classes de textures
sont dans ces fichiers. Voir le point 2 du rapport pour plus de détails.
|
noise.cpp
Ajout
|
Fonctions noise et turbulence.
|
Objet (objet.cpp)
Modif
|
Ajout d'un attribut Texture*
latexture indiquant quel est la texture à appliquer.
Ajout des attributs InfoAppliqueTexture2D*infoTexture2D et InfoAppliqueTexture3D*infoTexture3D
pour les sens d'application de texture.
Ajout des méthodes virtual mapUV(...) et mapUVW()
permettant de convertir des coordonnées locales en coordonnées
de l'espace de texture 2D et 3D.
Ajout de la méthode virtual getUVSensTexture() retournant
2 vecteurs U et V, représentant les vecteur directeurs de la textures
à un point donner (intersection). Cela est nécessaire
pour la perturbation du vecteur normal.
|
Polygone (polygone.cpp)
Modif
|
Surdéfinition des méthodes
mapUV(...) et getUVSensTexture()
.
Ajout d'une méthode calculerSensTexture() qui détermine
le sens d'application de texture par défault pour un polygone.
Modification de la méthode attributs() pour appliquer les
transformations locales sur l'espace de texture.
|
Sphere et Cylindre
(sphere.cpp, cylindre.cpp)
Modif
|
Surdéfinition des méthodes
mapUV(...) et getUVSensTexture()
.
|
Fichier inter.cpp
Modif
|
Modification de la fonction
Objet_Inter() pour appliquer les textures
2D et 3D. Après Intersection d'un objet, on vérifie
si l'objet possède une texture. Si oui, on vérifie quel
sorte de texutre. Dans le cas d'une 2D, on demande à l'objet
atomique de calculer U et V, ensuite on appele appliquer2D() de la texture
qui modifie les attributs non-géométiques de l'objet. Même
principle pour les 3D.
|
Attributs
BaseAttributs
(attr.cpp)
Modif + Ajout
|
La classe Attributs a été
scinder en 2 : une classe de base BaseAttributs contenant seulements les
coefficients (CD, CS, etc.) ainsi que la classe Attributs qui est dérivé
de BaseAttributs. Attributs contient les transformations et quasi
est équivalante à l'ancienne classe. Plusieurs textures
sont définites avec un ou plusieurs objet BaseAttributs. Le
but de la division était d'avoir les attributs non-géométriques
sans les transformations.
Ajout des opérateurs operator*=(BaseAttributs),
operator*=(Couleur) , operator*(reel), operator*=(reel)
utilisées dans les textures.
|
Coefficient (coef.cpp)
Modif
|
Ajout des opérateur
*=(Coeffient), *=(Couleur), *(Couleur), *=(reel).
|
Fichier io.cpp
|
Beaucoup de modification pour
la lecture des textures.
|
Fichier rayon.cpp
|
Ajout transparence + antialiasing.
Permettre l'ouverture du fichier trace.ppm avant la fin de tracé
de rayons (le fichier est remplit de noir au début).
|
Chaine (chaine.cpp)
|
Ajout de "const" dans
le constructeur et opérateur==.
|
6. Images démonstratives
Plusieurs images de plus grande taille que celles présentées
dans ce rapport sont disponibles dans le répertoire /galerie de la
soumission du projet.
Ces images et certaines autres sont aussi disponibles à l'adresse
internet :
http://esmart.dyndns.org:8888/~eric/galerie
7. Améliorations
possibles
7.1 Collage des textures 2D sur des objets
composés
Il aurait été intéressant d'appliquer des textures
2D sur des ensembles objets, comme un groupe de polygone. Pour le faire,
nous aurions procédé par projection. À l'exécution
de la scène, nous aurions trouvé une surface simple (grand
polygone ou surface courbe de Bezier) qui approxime le groupe d'objet. Ensuite,
pour calculer un point dans l'espace de texture, nous aurions projecter
le point d'intersection sur la surface simple pour finalement appliquer
la texture comme si c'était un simple objet.
7.2 Textures définites par l'utilisateur
Dans notre présent projet, nous n'avons que définit des
textures natives. Bien qu'il est possible de combiner diverses textures
ensembles, il n'est actuellement pas possible de créer de nouvelles
textures sans modifier le code C++ du noyau. Il aurait été
intéressant de faire un interpréteur de langage pour exécuter
de nouvelles texture.
8. Références
et inspirations utilisées
8.1 Fonctions
Noise et Turbulence
Certaines textures comme le bois et le marbre requierent des fonctions
de perturbations. Nous avons implenté Noise et Turbulences.
Concernant Noise, nous nous sommes fortement inspiré d'une
fonction proposé sur le site de Siggraph:
http://www.siggraph.org/education/materials/HyperGraph/mapping/noise.txt
Dans le cas de Turbulence, nous avont trouvé, à plusieurs
endroits sur Internet, l'idée générale : turbulance
est égale à une somme de la Noise prise à plusieurs endroits.
Nous l'avons implenté intuitivement et le résultat ressemblait
aux images exemples sur certains sites web.
8.2 Textures Bois et Marbre
Tout comme la fonction turbulence, nous nous somme inspiré pour
les textures bois et marbres. Nous n'avons pas trouvé de fonctions
simples toute déjà faite utilisant noise ou turbulence, mais
nous avons trouvé des idées.
http://www.siggraph.org/education/materials/HyperGraph/mapping/texture3.htm
.
Dernière modif:
1er Décembre 2001