Bonjour

J'essaie depuis quelques mois d'implémenter l'algorithme de division en cellules et en portails et le portal culling dans JME 2.0. Je me suis inspiré du document suivant pour comprendre quelques grandes étapes :
http://geck.bethsoft.com/index.php/Occlusion_Culling

Voici comment je procède une fois que JME 2.0 m'indique qu'un portail donné se situe dans le frustum de vue courant :
- décomposition du portail en triangles
- pour chaque triangle
- multiplication des sommets par la matrice modèle-vue : on a ainsi les Eye coordinates
- multiplication de ces coordonnées par la matrice projection : on a ainsi les Clip coordinates
- division des coordonnées X, Y et Z par W : on a ainsi les Normalized Device coordinates
- transformation de ces coordonnées en fonction des paramètres du frustum de vue courant ainsi :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
store = getNormalizedDeviceCoordinates( worldPosition , store );
store.x = ( ( ( store.x + 1 ) * ( frustumRight - frustumLeft ) / 2 ) ) + frustumLeft;
store.y = ( ( ( store.y + 1 ) * ( frustumTop - frustumBottom ) / 2 ) ) + frustumBottom;
store.z = ( store.z + 1 ) / 2;
- calcul des abscisses et des ordonnées minimales et maximales
- clipping avec le frustum de vue courant
- construction du nouveau frustum de vue avec les coordonnées résultant de ce clipping (en gros, on prend les mêmes paramètres que le frustum courant sauf pour left, right, bottom et top)

Le code source suivant est l'implémentation de ce que j'explique ci-dessus :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Vector3f[] trianglesVertices = ((TriMesh)portal.getChild(0)).getMeshAsTrianglesVertices(null);      
            float left=Float.MAX_VALUE;
            float right=-Float.MAX_VALUE;
            float top=-Float.MAX_VALUE;
            float bottom=Float.MAX_VALUE;
            Vector3f vertex=null;
            for(Vector3f triangleVertex:trianglesVertices)
                {vertex=currentCamera.getFrustumCoordinates(triangleVertex,vertex);                
                 if(vertex.x<left)
                     left=vertex.x;
                 if(vertex.x>right)
                     right=vertex.x;
                 if(vertex.y>top)
                     top=vertex.y;
                 if(vertex.y<bottom)
                     bottom=vertex.y;
                }  
            Camera subFrustum;
            //if the portal is outside the current frustum
            if(bottom>currentCamera.getFrustumTop()||
               top<currentCamera.getFrustumBottom()||
               right<currentCamera.getFrustumLeft()||
               left>currentCamera.getFrustumRight())
                subFrustum=null;
            else
                {left=Math.max(left,currentCamera.getFrustumLeft());
                 right=Math.min(right,currentCamera.getFrustumRight());
                 top=Math.min(top,currentCamera.getFrustumTop());
                 bottom=Math.max(bottom,currentCamera.getFrustumBottom());
                 AbstractCamera cam=((AbstractCamera)currentCamera);
                 subFrustum=new JOGLCamera(cam.getWidth(),cam.getHeight(),true);
                 subFrustum.setFrustum(cam.getFrustumNear(),cam.getFrustumFar(),left,right,top,bottom);
                 subFrustum.setFrame(cam.getLocation(),cam.getLeft(),cam.getUp(),cam.getDirection());
                }           
return(subFrustum);
Mon problème est qu'apparemment, les sous-frusta ainsi obtenus sont trop petits. Ma façon de procéder est-elle la bonne? J'ai un doute sur la manière de passer des Eye coordinates aux coordonnées "frustum", je me suis inspiré d'une FAQ sur les transformations sur le site officiel d'OpenGL. Merci d'avance.