• Aucun résultat trouvé

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

3.2 Intersection avec les primitives

3.2.1 Intersection avec une tranche d'espace

Bien que cet objet ne soit pas une primitive de notre modele a proprement parler, elle est utilisee en interne pour realiser une intersection avec un cube, un cylindre ou un c^one ainsi qu'avec les bo^ tes englobantes (voir le chapitre 4).

Une tranche d'espace est la portion d'espace comprise entre deux plans paralleles. Elle peut ^etre denie par la donnee d'un vecteur ~S et de deux constantes et . Un point P de l'espace appartient a cette tranche si et seulement si < ~CP ~S > + 0 (C est l'origine du repere du monde). On remarque que dans cette denition, doit ^etre strictement negatif pour que la tranche represente bien un volume et non une surface ou un objet vide.

On note P1= P1(~S ) le plan deR

3deni par < ~CP ~S > + = 0 et de facon similaire P2= P2(~S ) le plan deR

3deni par < ~CP ~S > + ; = 0. Ainsi, P1 et P2 sont les deux plans qui contiennent la tranche d'espace.

2:Comme nous utilisons des entiers sur 32 bits, ceci limite a 65535 le nombre maximal d'intervallesd'intersectiongeneres pour une classe d'objets. Est-ce vraiment une limitation?

Pour resoudre l'intersection, on parametrise le point courant du rayon par P = O +~V , et on reporte cette expression dans les deux equations de plans. On obtient alors:

 < ~S ~V > = ;< ~S ~CO >; (3.1)  < ~S ~V > = ;< ~S ~CO >; + (3.2) Plusieurs cas peuvent alors se presenter.

{ si < ~S ~V >= 0, le rayon est parallele a la tranche. Il est donc soit entierement en dehors de la tranche, soit entierement en dedans. On convient de considerer le rayon comme en-dehors si est inclus dans l'un des deux plans limites. On a alors les deux sous-cas :

{ soit < ~S ~CO > + 0, soit ;< ~S ~CO >; 0, auquel cas le rayon n'intersecte pas la tranche.

{ sinon, le rayon est entierement dans la tranche, et on genere si le niveau d'intersection est UN

ouTOUSun intervalle d'intersection dont les bornes sont les bornes du segment d'etude. On aecte a ce segment son contenu (s'il est demande) mais on ne genere evidemment pas de points d'entree ou de sortie. Si le niveau estZERO, on tronque eventuellement le segment d'etude au segment d'intersection et on rend comme resultat le nombre d'intersections trouvees, soit dans le cas present une seule intersection.

{ sinon, on calcule les abscisses des deux points d'intersection avec les plans frontieres par 1 = ;< ~S ~CO >;

< ~S ~V > 2 = ;< ~S ~CO >;

< ~S ~V >

On peut alors calculer les abscisses d'entree et de sortie: in = min(12)

out = max(12)

On calcule egalement un drapeau appele indicateur d'echange. Ce drapeau est mis a la valeurVRAI

si in= 2 et aFAUXsi in= 1. Ceci permet de savoir par la suite quels sont les plans P1 ou P2

correspondant respectivement aux points d'entree et de sortie : si l'indicateur d'echange est aFAUX, in est l'abscisse d'un point du plan P1 et out est l'abscisse d'un point du plan P2, sinon c'est le contraire.

Une fois ce premier calcul eectue, on determine si l'on doit generer ou non l'intervalle d'intersection. Ceci se fait en comparant les valeurs de 1, 2, min et inmax. Pour que l'intervalle soit utile, on doit avoir in< inmax et out> min.

On doit maintenant tenir compte de la troncature eventuelle de l'intervalle par le segment d'etude. Ceci peut s'ecrire :

si in< min

faire in= min

ne pas generer le point d'entree si out> max

faire out= max

3.2. INTERSECTIONAVEC LESPRIMITIVES 47 Parvenu a ce point, on peut generer l'intervalle d'intersection si le niveau d'intersection est UN

ou TOUS. On trouve dans l'environnement les informations a generer pour le contenu et les points d'entree/sortie.

La normale peut se calculer simplement: si l'indicateur d'echange est aFAUX, la normale au point d'entree est ~S et la normale au point de sortie est ;~S, sinon, c'est le contraire.

Enn, on peut aecter des numeros de surface aux deux plans de chaque tranche (comme on le verra par la suite, on n'utilise en fait que trois tranches predenies pour intersecter des primitives). La-encore, l'indicateur d'echange est utilise pour aecter les bons numeros.

3.2.2 Intersection avec une quadrique

Nous avons regroupe toutes les fonctions d'intersection avec les quadriques sous une seule forme generale. Ceci n'est peut-^etre pas le plus ecace en temps de calcul mais est justie par notre souci de condenser le code aussi bien sous forme lisible que sous forme executable. En eet, un de nos objectifs etant de paralleliser cet algorithme sur un reseau de transputers ne disposant chacun que d'une memoire de 1 megaoctet, cette reduction de code nous permet de stocker plus de donnees. L'ecriture est egalement grandement facilitee (y compris les corrections d'erreurs. ..).

Une quadrique est simplement denie par une matrice carree 44 symetrique M. An que la primitive representee par cette matrice M soit bien une quadrique, il sut d'assurer que la sous-matrice m de M de taille 33 constituant le coin superieur gauche soit non nulle.

L'interieur de la quadrique est alors l'ensemble des points P verianttCPM ~~ CP < 0. Les matrices des 9 quadriques utilisees sont les suivantes:

Mco= 0 B B @ 1 0 0 0 0 1 0 0 0 0 ;1 1 0 0 1 ;1 1 C C A Mcy= 0 B B @ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 ;1 1 C C A Mcyh= 0 B B @ 1 0 0 0 0 ;1 0 0 0 0 0 0 0 0 0 ;1 1 C C A Mcyp= 0 B B @ 1 0 0 0 0 0 0 0 0 0 0 ; 1 2 0 0 ; 1 2 0 1 C C A Mh1= 0 B B @ 1 0 0 0 0 1 0 0 0 0 ;1 0 0 0 0 ;1 1 C C A Mcyh= 0 B B @ 1 0 0 0 0 1 0 0 0 0 ;1 0 0 0 0 1 1 C C A Mpa= 0 B B @ 1 0 0 0 0 1 0 0 0 0 0 ; 1 2 0 0 ; 1 2 0 1 C C A Mph= 0 B B @ 1 0 0 0 0 ;1 0 0 0 0 0 ; 1 2 0 0 ; 1 2 0 1 C C A Msp= 0 B B @ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 ;1 1 C C A

Pour determiner les intersections entre le rayon et la quadrique, nous reportons simplement l'expression du rayon dans l'equation de la quadrique, ce qui donne l'equation aux :

2t~V M~V + 2t~V M ~CO +tCOM ~~ CO = 0

qui peut se resoudre par la methode classique de resolution des equations du second degre. On trouve donc soit une innite de racines, soit deux racines, soit aucune racine3.

3.2.2.1 Cas d'une innite de racines

Ce cas peut se produire lorsque le rayon est contenu dans la surface d'un c^one par exemple, ou lorsqu'il est une des generatrices d'un parabolo" de hyperbolique ou d'un hyperbolo" de a une nappe.

Nous avons pris la convention de dire dans ce cas que le rayon est en dehors de l'objet.

3.2.2.2 Cas ou il n'y a pas de racines

Dans ce cas, il sut simplement de determiner la position d'un point quelconque du rayon par rapport a la quadrique. On peut par exemple regerder le signe du coecient de degre deux du trin^ome, c'est-a-dire considerer la valeur detCOM ~~ CO. Deux cas peuvent se presenter :

{ le coecient est strictement positif, auquel cas le rayon est entierement hors de la quadrique. { le coecient est strictement negatif, auquel cas on genere si besoin un intervalle d'intersection dont

les bornes sont les bornes du segment d'etude. On lui aecte si besoin son contenu mais on ne genere ni point d'entree ni point de sortie.

3.2.2.3 Cas de deux racines

On note 1 2 les deux racines trouvees. Les racines sont triees par l'algorithme de resolution des equations algebriques.

Le premier traitement consiste a detecter une eventuelle racine double, auquel cas le traitement est similaire a celui du cas ou il n'y pas de racines.

Il est tres important de determiner la position de la quadrique par rapport aux deux racines trouvees. En eet, puisque nous utilisons des quadriques non forcement convexes, rien ne garantit que la quadrique soit entre les racines.

La position de la quadrique par rapport aux racines est determinee encore une fois en considerant le coecient dominant du trin^ome d'intersection. Nous allons detailler chacun des deux cas possibles. quadrique.

Dans le cas \simple" (quadrique entre les racines), on ne genere au plus qu'un intervalle d'intersection. Le traitement de ce cas est tres semblable a celui de la tranche d'espace.

Dans le cas \complique" (quadrique hors des racines), il faut generer selon le niveau d'intersection et les positions des racines zero, un ou deux intervalles d'intersection.

Le schema 3.2 precise quels intervalles generer en fonction de la position de la quadrique. Ce schema ne tient pas compte des eventuelles troncatures par le segment d'etude, ou de la non-presence de certains intervalles dans le cas ou le point d'entree a une abscisse superieure a l'abscisse minimale d'entree.

3.2.2.4 Calcul de la normale

La normale aux points d'intersection eventuellement trouves peut simplement s'exprimer par: ~N = M ~CP = M ~CO + M~V

Une remarque cependant : lorsque la quadrique est un c^one et que le point d'intersection considere est le sommet du c^one, le vecteur normal est alors nul. Mais comme cela sera explique dans le paragraphe suivant, ce cas ne se presente jamais (aux erreurs d'imprecision pres).

3.2. INTERSECTIONAVEC LESPRIMITIVES 49

Quadrique entre les racines min max 1 2 contenu in out min max 1 2 contenu out min max 1 2 contenu in min max 1 2 contenu

Quadrique en dehors des racines

min max

1 2

contenu out in contenu

min max 1 2 contenu in min max 1 2 contenu out min max 1 2

Fig.3.2 {Intersection avec une quadrique

3.2.2.5 Cas particulier du c^one et du cylindre

Le c^one et le cylindre ont ceci de particulier qu'ils sont tous les deux limites a la portion d'espace des points veriant 0 z 1. Ceci signie que ce sont en fait les intersections entre les quadriques non bornees correspondantes et une tranche d'espace que noous appelonstranche en z.

Il serait cependant inecace de gerer cette intersection comme une vraie intersection entre objets. Nous avons donc prefere la methode suivante:

{ on intersecte d'abord la tranche en z en ne demandant aucun intervalle (en aectantZEROau niveau d'intersection) et en demandant la troncature du segment d'etude comme resultat. S'il n'y a pas intersection, on est s^ur d'^etre en dehors. Sinon, on recupere dans l'environnement les indicateurs qui precisent s'il y a eectivement un point d'entree ou un point de sortie ainsi que l'indicateur d'echange eventuel.

{ Ensuite, on tronque le segment d'etude par l'intervalle d'intersection trouve avec la tranche en z et on intersecte la quadrique en demandant cette fois de calculer tout ce qui est necessaire.

{ Enn, on teste si l'on a genere un point d'entree dans la quadrique. Si oui, il n'y a rien de plus a faire. Dans le cas contraire, on regarde les indicateurs generes lors de l'intersection avec la tranche en z. S'il y a un point d'entree dans la tranche, on genere le point d'entree ainsi que la normale correspondante (dont on trouve l'orientation gr^ace a l'indicateur d'echange). On procede de facon identique avec le point de sortie.