THEORIE DE L IBO
Il est conseille vivement de d abord avoir vu l explication theorique des LDI.
1.Le Cube
Nous avons besoin d un cube. Celui ci aura cette forme, et ses faces seront notes ainsi:
Ce cube va nous servir a fabriquer 6 LDI, dont les points de vue seront les memes (le centre du cube), dont les resolutions seront les memes (celles donnees dans le .cube), dont les epsilon seront les memes (celui donne dans le .cube), et dont les ecrans de projections seront respectivement les faces du cube.
Ainsi on va pouvoir reprojeter nom plus une pyramide partant du point de vue et de base generatrice l ecran, comme c etait le cas pour une LDI, mais tout un univers dont le centre sera le centre du cube. De plus, toutes les qualites des LDI (pretraitement pour calculs rapides, sauvegardes des points caches pour qu ils apparaissent eventuellement lors des deplacements, facilite de creation...) sont conserves.
La creation de l IBO est exactement la creation des 6 LDI.Il n y a donc rien a ajouter a ce qui a ete dit sur la creation des LDI.
2. Projection d un IBO
Pour projeter un IBO, il va falloir trouver un ordre aux 6 LDI. Pour cela, on calcul l intersection de la demi droite passant par le centre du cube et le point de vue desire, ouverte sur le point de vue desire. Cette projection se trouve en calculant les 6 epipoles correspondant au point de vue projete sur les 6 faces, et en prenant la face dont l epipole est a l interieur de la face, et dont le w est positif (voir l explication du Warping).
Alors on projete cet epipole sur la face arriere K (celle opposee a celle qui possede l epipole), perpendiculairement a la face arriere. La droite allant de l epipole a sa projection coupe une des 4 pyramides ayant pour sommet le centre du cube, et pour base respectivement une des 4 faces qui ne soient pas la face avant F (celle qui contient l epipole) ou la face arriere. La facette etant la base de la pyramide intersectee est nommee Bp, celle opposee a Bp etant nommee B, les 2 autres restantes etant nommees A et Ap.
Alors l ordre de projection des LDI doit etre:K>B>A>Ap>Bp>F ou K>B>Ap>A>Bp>F.
La reprojection se passe alors exactement comme la reprojection de 6 LDI sur la meme image.
3. Une scene d IBO
Pour faire une scene d IBO, on peut soit faire des dpulications du meme objet (foret), soit avoir de nombreux objets. Quand on duplique, il faut pouvoir translater et tourner l objet. Cela se fait assez facilement. En effet, mes fonctions manipulant les IBO ne travaillent pas avec les vecteurs a,b,c des parametres camera, mais reconstruisent ces vecteurs avec les points du cube. Aussi, quand on veut translater et tourner l objet, il suffit de translater et tourner les points du cube, et le tour est joue. C est ce que fait la fonction LireCubeAvecTransformation.
Ainsi, la seule difficulte pour projeter une scene d IBO est l ordre dans lequel projete les IBO. Il faut tout d abord que les volumes que represente les IBO ne s entrecroisent pas, sinon cela devient vraiment plus difficile.Alors on calcul un hypothetique centre, barycentre de tous les centres des cubes des IBO. Ensuite, il faut definir un plan sur lequel on va projeter tous les points 3D pour obtenir des points 2D. On peut par exemple prendre le plan normal a b, parametre de camera. Avec ces points 2D, on calcul les angles entre le segment Point de vue 2D-Hypothetique Centre 2D et le segment HypothetiqueCentre 2D-Point 2D. Alors on prend pour chaque cube une valeur alpha egale au minimum des angles de ces sommets, et une valeur beta egale au maximum des angles de ses sommets.
Ensuite, pour faire le tri des IBO,on fait 4 listes differentes: L11, avec les alpha et beta positifs, L12 avec les alpha et beta negatifs, L21 avec les alpha plus petits en valeur absolue que 90 degres et beta de signe oppose a alpha, et L22 avec les apha plus grand en valeur absolue que 90 degres et beta de signe oppose a alpha. C est ce que fait la fonction void TrierListeSuivantAlphaBeta_Separation(char** TableauNomIBO,float* TableauTransf,int* ListeIndice,
int NombreIBO,
Vecteur3 QuelPlan,Vecteur3 Fromd,
int* TableauTrieSuivantAlpha,
int ioffset) (y compris le calcul de l hypothetique centre et des alpha/beta).
Alors il faut refaire un tri des listes L21 et L22, tout en gardant trace que l ordre sera L21>L11>L12>L22 (ou identiquement Ordre(L21)>Ordre(L12)>Ordre(L11)>Ordre(L22)). Pour connaitre l ordre de L21 et L22, c est assez simple: soit les listes sont vides, ou a un seul element, et la, l ordre est simple, soit alors il faut refaire une separation de la liste, avec un appel recursif a TrierListeSuivantAlphaBeta_Separation. Il y aura un nouvel hypothetique centre calcule juste avec les elements de la liste a rediviser, et de nouveaux alpha beta.
Pour les listes L11 et L12, c est different: On les trie avec qsort, dans l ordre des alpha croissants en valeur absolue. Ensuite, on parcourt cette liste trie en partant du plus petit element. A chaque fois, on fait le test: si alpha(i+1)>beta(i), alors cet objet est a sa bonne place dans la liste triee, sinon il va falloir faire un tri avec tous les objets suivants qui ont des alpha(j+1)
Ainsi, sur cet image, le cube1 est bien place: alpha2>beta1. Par contre, le cube 2 et le cube 3 se recouvrent. Il va donc falloir rediviser la liste constituee du cube 2 et 3, et mettre le resultat du tri de cette mini liste en place qu occupaient les cube 2 et 3. Le cube 4 ne recouvrant pas le 3, il n est pas dans la liste a rediviser. On continue alors avec le cube 4 en regardant si alpha5>beta4 ou non.
Ce travail de test de recouvrement est effectue par void TrierListeSuivantAlphaBeta_Concatenation(pTripletFloat* ListeTripletFloat,int LongueurListe,
int offset,int* TableauTrieSuivantAlpha,char** TableauNomIBO,float* TableauTransf,
Vecteur3 QuelPlan,Vecteur3 Fromd), qui fait eventuellement appel a TrierListeSuivantAlphaBeta_Separation, dans le cas de recouvrements.
Ainsi, en un nombre fini de tests, on obtient un ordre. Il ne reste plus qu a suivre cet ordre pour projeter les differents IBO.
Benoit Chevallier
Last modified: Thu Aug 26 16:38:18 MET DST 1999