Rapport projet IFT528

Arbre de Textures 2D + 3D
avec perturbation du vecteur normal
,transparence sans réfraction avec ombre
et anti-aliasing avec "jittering".




Membres de l'équipe:
Compte du turnin du projet :    beaue00

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
  1. Introduction
  2. Textures
  3. Collage des textures sur les objets
  4. Langage de definition de scène
  5. Autres ajouts et modifications à N3D
  6. Images Démonstratives
  7. Améliorations possibles (extensions envisageables)
  8. 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.
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.

1.2  Arborescence des fichiers du 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.
Espace de texture

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:
Démo Application


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.

Ordre d'application des textures

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

quad02.jpg
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.

tuile

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
tuile00.jpg
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

tuile01.jpg
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

tuile02.jpg


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
multi00.jpg
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
decoup00.jpg
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
image00.jpg
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

bois00.jpg  bois01.jpg
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.

marbre00.jpg
rapport_marbre00.scn
marbre01.jpg
rapport_marbre02.scn
marbre02.jpg
rapport_marbre02.scn
marbre03.jpg
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
marbre04.jpg
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

brique00.jpg


Vague

Syntaxe : VAGUE Frequence Amplitude FTX

Perturbe le vecteur normal avec des sinus.

Exemple:
vague00.jpg
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
noise00.jpg
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
turbulence00.jpg
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.
quad00.jpg

Avant
(rapport_quad00.scn)
u=(1,0,0) et v=(0,0,1)
atxpoly00.jpg

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

cylindre00.jpg
Voici un quadrillé 8x8 sur un cylindre

cylindre01.jpg

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
sphere01.jpg
Quadrillé 8x8 sur une sphère
sphere.jpg

3.1.5 Sur une forme quelconte (triangle)


triangle.jpg

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.

demotrans00.jpg

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


Le contenu de cette page est la responsabilité de son auteur et n'engage en rien l'Université de Sherbrooke et le Département de mathématiques et d'informatique