• Aucun résultat trouvé

B.1 Projection d'une bo^ te orthogonalement a la diagonale principale

2.5 Compactage

2.5 Compactage

La reutilisation des objets permet deja un gain de place memoire pour stocker une scene. Nous avons utilise une autre methode an de gagner encore de la place.

Lorsque l'on utilise une modelisation CSG avec primitives canoniques, on utilise beaucoup de trans-formations anes. Par exemple, pour denir un parallelepipede, on part d'un cube, auquel on applique tout d'abord une anite pour lui donner des dimensions convenables, puis on eectue une rotation pour lui donner une orientation convenable, enn on lui applique une translation pour lui donner sa position denitive.

Le processus est le m^eme lorsque l'on utilise un objet deni en bibliotheque: il y a peu de chances qu'il ait la position et l'orientation voulue par l'utilisateur.

On peut alors economiser de la place on comprimant ces transformations pour n'en garder qu'une seule. Ceci explique aussi pourquoi on stocke les transformations sous une forme banalisee: ceci permet cette compression par simple multiplication des matrices.

De facon plus generale, on peut essayer de ne pas creer un n!ud du graphe CSG pour toute transfor-mation. La creation d'un tel n!ud n'est rendue necessaire que par la necessite de pouvoir associer a ce n!ud des attributs.

C'est pour ces diverses considerations que nous avons ajoute la possibilite de stocker dans chaque n!ud une ou plusieurs transformations anes. Plus precisement,

{ tout n!ud du graphe peut contenir une matrice de transformation ane qui s'applique globalement a tout le sous-graphe CSG issu de ce n!ud (une telle matrice est appelee matrice globale).

{ les operations booleennes peuvent contenir une ou deux matrices de transformation qui s'appliquent globalement a l'un ou a l'autre des operandes de l'operation (de telles matrices sont appeleesmatrices d'operande).

Il faut cependant prendre garde en eectuant ce compactage aux problemes suivants: { il ne faut pas modier d'objet partage

{ il faut respecter les couleurs et l'ordre des textures

{ il faut respecter les reperes de texturation des textures existantes

De plus, pour ameliorer l'ecacitede l'intersecteur, l'algorithmede compactage retire les attributs reputes inutiles, c'est-a-dire ceux situes immediatemment au-dessus de n!ud non-colorables. Ceci ne permet pas de retirer tous les attributs inutiles mais economise cependant une certaine place memoire.

Enn, pour permettre une plus grande souplesse, notre systeme autorise le compactage d'objets ano-nymes mais egalement le compactage d'objets qui ne sont references qu'une seule fois. Il faut cependant prendre garde au fait qu'un objet monoreference a un nom, et il faut donc retirer ce nom de la table des objets connus par le systeme si l'on ne veut pas generer d'erreur ulterieure.

Nous allons maintenant detailler l'algorithme de compactage. Au debut de l'algorithme, aucun n!ud ne contient de matrice globale. De m^eme, aucune operation booleenne ne contient de matrice d'operande.

L'algorithme procede de maniere recursive a partir de la racine du graphe. Les invariants de l'algorithme de compactage sont les suivants:

{ un n!ud de type transformation ne contient de matrice globale que si ce n!ud contient des textures (sinon, cette matrice globale pourrait ^etre combinee avec la matrice de transformation).

{ un n!ud de type operation booleenne ne contient de matrice globale que si ce n!ud contient des textures, ou bien s'il ne contient pas de matrices d'operande (il est alors plus economique de stocker une matrice globale que deux matrices d'operande).

Enn, les notations suivantes sont utilisees:

{ si N designe un n!ud, on note N:MG sa matrice globale.

{ si N est un n!ud de type transformation, on note N:MT la matrice de transformation et N:OP l'objet auquel s'applique cette transformation.

{ si N est un n!ud de type operation booleenne, on note N:OP1 et N:OP2 ses deux operandes et N:MOP1 et N:MOP2 les matrices d'operande.

2.5.1 Cas de la transformation ane (ou du nud NOP)

L'algorithme peut se decomposer comme suit: compacter N:OP

si N:OP est multireference ou si N et N:OP contiennent tous deux des textures ne rien faire.

STOP.

si N:OP contient des textures

regle 1

faire N:OP:MG= N:MT N:OP:MG.

sinon si N:OP est un n!ud de type transformation ou NOP

regle 2

faire N:MT = N:MT N:OP:MT. faire N:OP = N:OP:OP.

sinon si N:OP est un n!ud d'operation booleenne si N:OP ne contient pas de matrices d'operande et si N ne contient pas de textures

regle 3

faire N:OP:MG= N:MT N:OP:MG

sinon si N:OP contient des matrices d'operande

regle 4

faire N:OP:MOP1= N:MT N:OP:MOP1

faire N:OP:MOP2= N:MT N:OP:MOP2

sinon (N contient des textures)

regle 5

faire N:OP:MOP1= N:MT

faire N:OP:MOP2= N:MT

remplacer N par N:OP.

2.5.2 Cas des operations booleennes

Dans le cas des operations booleennes, le seul compactage possible est l'utilisation des matrices d'ope-rande.

Les conditions qui rendent ce compactage possible sont ici plus strictes, puisque l'on ne peut eectuer ce compactage que si l'un des operandes est une transformation ane, n'est pas multireference et que de plus il ne contient pas de textures.

2.5. COMPACTAGE 27 T MT T MT T MT T MT text text text text text text text text text text MG   MT:MG T MT0 T MT:MT0 OP OP MG BOOL : : O1 O2 MT:MG BOOL : : O1 O2 MG BOOL : : O1 O2 BOOL MTMGMTMG O1 O2 T MT BOOL M1 M2 O1 O2 BOOL MTM1MTM2 O1 O2 BOOL M1  T MT OP BOOL M1MT  OP Regle 1 Regle 2 Regle 3 Regle 4 Regle 5 Regle 6

Plus precisement, l'algorithme peut se decomposer comme suit : compacter N:OP1

compacter N:OP2

pour i variant de 1 a 2

si N:OPi est un n!ud de type transformation (ou NOP) et s'il ne contient pas de textures

regle 6

faire N:MOPi = N:OPi:MT

remplacer N:OPi par N:OPi:OP sinon

ne rien faire.

La gure 2.1 recapitule les regles de compactage utilisees aussi bien pour les transformations anes que pour les operations booleennes.