• Aucun résultat trouvé

Quelques points sensibles

7.2 Cr´eation d’un amplifieur

7.2.3 Quelques points sensibles

for(int i=0;i<20;i++) {

float newSize = size/3;

repere newRepere = localRepere*getRepere(i,size); square* newChild = new square(i,newSize,newRepere); childContainer.addChild(newChild);

} }

La fonction getRepere donne la transformation entre un rep`ere et les 20 rep`eres des amplifieurs fils (cf. figure 7.7).

R´esultat

Les figures 7.8, 7.9 et 7.10 montrent quelques captures d’´ecran. Mˆeme si ces mod`eles ne sont pas anim´es, les r´esultats sont plus impressionnants lorsque la cam´era est en mouvement. Des vid´eos sont disponibles sur le site http://www-evasion.imag.fr/∼Frank.Perbet/these. Ces mod`eles ont ´et´e r´ealis´e par Sandrine Bard et Benjamin Rouveyrol, deux stagiaires qui d´ebutaient en mod´elisation 3D, en une semaine. Ils ont aussi r´ealis´e un mod`ele d’arbre qui sera d´ecrit en 7.3.

7.2.3 Quelques points sensibles

L’´etude de ce cas simple cache quelques subtilit´es dont il est important d’ˆetre conscient. Nous parlerons tout d’abord ici de la zone d’influence d’un amplifieur. Nous expliquerons ensuite pour-quoi le choix des conteneurs des amplifieurs fils est laiss´e au cr´eateur. Enfin, nous parlerons des diff´erentes m´emoires que Dynamic Graph propose et de leur utilisation dans le cadre de l’optimi-sation par coh´erence temporelle.

Zone d’influence d’un amplifieur

Un amplifieur est une transformation de la forme tridimensionnelle qui consiste `a l’amplifier (i.e. `a ajouter de la pr´ecision). Pour chaque amplifieur, on peut d´eterminer la partie d’un objet qu’il amplifie. La fonction draw dessine pr´ecis´ement cette partie amplifi´ee. De mˆeme, la boˆıte englobante entoure cette partie (ainsi que toute la g´eom´etrie pouvant ˆetre amplifi´ee `a partir de celle-ci).

On peut imaginer que la forme est marqu´ee au feutre sur l’objet de diff´erentes zones d’influence correspondant chacune `a un amplifieur. Chaque zone est `a son tour marqu´ee par les zones des amplifieurs fils, et ainsi de suite. La figure 7.11 sch´ematise ces zones d’influence en deux dimensions. Remarquons que dans Dynamic Graph, ces zones d’influences ne sont repr´esent´ees par aucune structure. Elles n’existent que par le simple fait que les amplifieurs modifient une certaine partie des informations repr´esentant la forme. En fait, malgr´e le fait que la m´etaphore visuelle soit plus

forment une partition les sous-zones d’influence

Cas id´eal : D´ebordement :

Cas g´en´eral :

Fig. 7.11 – Lors d’une observation, les amplifieurs enrichissent diff´erentes zones et sous-zones de la forme. Dans Dynamic Graph, rien n’assure le bon positionnement des zones les unes par rapport aux autres. En cons´equence, certains comportements maladifs peuvent survenir.

intuitive, il est plus juste de d´efinir une zone d’influence comme l’ensemble des donn´ees en m´emoire modifi´ees par un amplifieur.

Lorsque plusieurs amplifieurs modifient les mˆemes parties d’un objet, plusieurs zones d’influence peuvent s’intersecter : on parle alors de zone sous influences multiples. Ces derni`eres posent de s´erieuses difficult´es :

– puisque chaque amplifieur dessine sa zone, les zones sous influences multiples sont dessin´ees plusieurs fois ;

– rien n’assure que les op´erations r´ealis´ees par les amplifieurs soient commutatives. En cons´e-quence, la forme sera affich´ee de fa¸con diff´erente selon l’ordre que choisi l’organiseur (qui d´epend, par exemple, du point de vue).

Dans le cas de structures tr`es hi´erarchiques tel que le sont tous les mod`eles pr´esent´es dans ce manuscrit, les zones d’influences sont parfaitement disjointes, ´evitant du coup cette difficult´e. Dans le cas de structures continues, il est ´evident que le probl`eme se pose. On peut par exemple imaginer que la figure 7.11 repr´esente un terrain et que les amplifieurs ajoutent des montagnes.

Une solution consisterait `a imposer un ordre d’´evaluation, ou `a s’assurer de la commutativit´e des amplifieurs. Mais comment savoir s’il faut afficher, `a un instant donn´e, les parties de l’objet appartenant `a la zone d’influence d’un amplifieur ? En effet, peut-ˆetre que celle-ci sera modifi´ee ult´erieurement par un autre amplifieur, auquel cas il faut retarder l’affichage.

Toute cette probl´ematique semble mettre en avant un lien ´etroit entre zone d’influence et boˆıte englobante (i.e. zone “influen¸cant”). En effet, si une zone d’influence avait connaissance des boˆıtes englobantes, elle pourrait d´ecider de ne s’afficher que lorsqu’aucune boˆıte englobante ne l’intersecte (et donc qu’aucun amplifieur ne l’influence). Ceci implique une repr´esentation de la g´eom´etrie intelligente et capable de d´eterminer les zones qu’elle peut afficher sans risque.

Dynamic Graph n’apporte pas de solution `a ces probl`emes. Plus g´en´eralement, il est clair que cet outil est mieux adapt´e aux structures hi´erarchiques. Ceci sera discut´e plus en profondeur en 8.1 : nous y verrons comment il est possible de contourner ces limitations.

Conteneur des fils

Rappelons que le conteneur des fils est la structure de donn´ee qui recense tous les fils d’un amplifieur p`ere. Un amplifieur, lorsque la forme n´ecessite plus de pr´ecision, engendre un certain nombre de sous-amplifieurs pouvant ˆetre de type diff´erent. Les amplifieurs enfants sont r´ef´erenc´es dans un conteneur de l’amplifieur parent. Ce conteneur est utilis´e intensivement par l’organiseur lors des parcours de graphe.

Or, de fa¸con g´en´erale, aucun conteneur n’est efficace pour stocker n’importe quel type de donn´ee : parfois, un tas sera efficace, d’autres fois une table de hachage, parfois un simple tableau... Dans Dynamic Graph, le probl`eme vient du fait que les amplifieurs peuvent repr´esenter de tr`es nombreuses formes de nature tr`es diff´erente. Un choix g´en´erique de conteneur compromettrait donc les performances de l’organiseur.

d´ebut programme fin permanente ´eph´em`ere amplifieur construction destruction mort naissance mortelleamplifieur

Fig. 7.12 – Plusieurs types de m´emoire sont visibles depuis un amplifieur. Chacune d’elles a une dur´ee de vie particuli`ere. La m´emoire permanente est allou´ee pour toute la dur´ee de l’ex´ecution de Dynamic Graph. La m´emoire mortelle est allou´ee `a la naissance d’un amplifieur et d´esallou´ee `a sa mort. La m´emoire ´eph´em`ere est celle stock´ee dans le tampon d’arbres : elle dure 2 ou 3 pas de temps.

De plus, une fonction de tri est appliqu´ee aux conteneurs `a chaque pas de temps afin de r´ealiser un rendu d’avant en arri`ere. Ce tri, s’il n’est pas fait avec pr´ecaution, peut coˆuter cher et ralentir notablement les performances. La r´epartition spatiales des sous-amplifieurs suit souvent des lois connues (cf. figure 4.5 du chapitre 4) qui peuvent ˆetre mises `a profit pour acc´el´erer le tri.

Ainsi, le cr´eateur doit lui mˆeme choisir quel conteneur utiliser parmi ceux propos´es par d´efaut. ´

Eventuellement, il peut en recoder un pour un cas tr`es particulier. C’est ce qui a ´et´e fait pour le cube de Sirpienski : la connaissance tr`es particuli`ere de la structure du cube (cf. figure 7.7) a permis de r´ealiser un conteneur adapt´e tr`es efficace.

M´emoire et coh´erence temporelle

Dynamic Graph propose un m´ecanisme d’´evaluation `a la vol´ee. S’il ´etait utilis´e na¨ıvement, toute la partie visible serait r´eg´en´er´ee `a chaque pas de temps. Afin de pouvoir r´eutiliser certaines informations d’un pas de temps sur l’autre, Dynamic Graph propose des m´emoires `a diff´erente dur´ee de vie (cf. figure 7.12).

Afin de fixer les id´ees, voici, pour chaque type de m´emoire, un exemple d’utilisation :

m´emoire permanente : supposons que l’on veuille dessiner l’un des ´el´ements du cube de Sir-pienski en rouge, et non en gris. Grˆace `a l’arbre permanent (cf. sous-section 6.1.3), ceci est possible en ajoutant dans la m´emoire permanente associ´ee `a un amplifieur une fonction imposant cette caract´eristique ;

m´emoire mortelle : supposons que la g´eom´etrie dessin´ee par un amplifieur soit parfaitement statique. On peut alors la d´ecrire grˆace `a un vertex array. Celui-ci sera allou´e lors de la naissance de l’amplifieur et d´esallou´e lors de sa mort (cf. sous-section 6.1.2) ;

m´emoire ´eph´em`ere : lors d’une animation, le cr´eateur peut utiliser une fonction faisant inter-venir des valeurs `a des temps pass´e. C’est le cas, par exemple, d’un calcul d’acc´el´eration :

a(t) =x(t) − 2.x(t − δt) + x(t − 2.δt) δt2

permet ce calcul par la reformulation :

acourant= x − 2.xanc`etre+ xanc`etre2 δt2

La bonne utilisation de ces m´emoires est essentielle `a de bonnes performances lors de l’´eva-luation et de l’affichage. Ces m´emoires sont le support principal de l’utilisation de la coh´erence temporelle.