Bonjour,
J'ai implémenté un view frustum culling, seulement voila mon implémentation s'avère un poil trop "efficace", à avoir qu'elle fait disparaitre des choses dans le champ de caméra J'ai remarqué que le view frustum fonctionne correctement uniquement lorsque le point (0,0,0) est visible dans le champ de camera. Mais impossible de trouver ce qui cause ce comportement. Voila mon code pour extraire les plans (juste une adaptation de ce tutoriel :
Ma méthode pour tester les points :
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72 // Get the current PROJECTION matrix from OpenGL glGetFloatv( GL_PROJECTION_MATRIX, proj ); // Get the current MODELVIEW matrix from OpenGL glGetFloatv( GL_MODELVIEW_MATRIX, modl ); // Combine the two matrices (multiply projection by modelview) clip[ 0] = modl[ 0] * proj[ 0] + modl[ 1] * proj[ 4] + modl[ 2] * proj[ 8] + modl[ 3] * proj[12]; clip[ 1] = modl[ 0] * proj[ 1] + modl[ 1] * proj[ 5] + modl[ 2] * proj[ 9] + modl[ 3] * proj[13]; clip[ 2] = modl[ 0] * proj[ 2] + modl[ 1] * proj[ 6] + modl[ 2] * proj[10] + modl[ 3] * proj[14]; clip[ 3] = modl[ 0] * proj[ 3] + modl[ 1] * proj[ 7] + modl[ 2] * proj[11] + modl[ 3] * proj[15]; clip[ 4] = modl[ 4] * proj[ 0] + modl[ 5] * proj[ 4] + modl[ 6] * proj[ 8] + modl[ 7] * proj[12]; clip[ 5] = modl[ 4] * proj[ 1] + modl[ 5] * proj[ 5] + modl[ 6] * proj[ 9] + modl[ 7] * proj[13]; clip[ 6] = modl[ 4] * proj[ 2] + modl[ 5] * proj[ 6] + modl[ 6] * proj[10] + modl[ 7] * proj[14]; clip[ 7] = modl[ 4] * proj[ 3] + modl[ 5] * proj[ 7] + modl[ 6] * proj[11] + modl[ 7] * proj[15]; clip[ 8] = modl[ 8] * proj[ 0] + modl[ 9] * proj[ 4] + modl[10] * proj[ 8] + modl[11] * proj[12]; clip[ 9] = modl[ 8] * proj[ 1] + modl[ 9] * proj[ 5] + modl[10] * proj[ 9] + modl[11] * proj[13]; clip[10] = modl[ 8] * proj[ 2] + modl[ 9] * proj[ 6] + modl[10] * proj[10] + modl[11] * proj[14]; clip[11] = modl[ 8] * proj[ 3] + modl[ 9] * proj[ 7] + modl[10] * proj[11] + modl[11] * proj[15]; clip[12] = modl[12] * proj[ 0] + modl[13] * proj[ 4] + modl[14] * proj[ 8] + modl[15] * proj[12]; clip[13] = modl[12] * proj[ 1] + modl[13] * proj[ 5] + modl[14] * proj[ 9] + modl[15] * proj[13]; clip[14] = modl[12] * proj[ 2] + modl[13] * proj[ 6] + modl[14] * proj[10] + modl[15] * proj[14]; clip[15] = modl[12] * proj[ 3] + modl[13] * proj[ 7] + modl[14] * proj[11] + modl[15] * proj[15]; // Extract the numbers for the RIGHT plane frustum[0].X = clip[ 3] - clip[ 0]; frustum[0].Y = clip[ 7] - clip[ 4]; frustum[0].Z = clip[11] - clip[ 8]; frustum[0].W = clip[15] - clip[12]; // Extract the numbers for the LEFT plane frustum[1].X = clip[ 3] + clip[ 0]; frustum[1].Y = clip[ 7] + clip[ 4]; frustum[1].Z = clip[11] + clip[ 8]; frustum[1].W = clip[15] + clip[12]; // Extract the BOTTOM plane frustum[2].X = clip[ 3] + clip[ 1]; frustum[2].Y = clip[ 7] + clip[ 5]; frustum[2].Z = clip[11] + clip[ 9]; frustum[2].W = clip[15] + clip[13]; // Extract the TOP plane frustum[3].X = clip[ 3] - clip[ 1]; frustum[3].Y = clip[ 7] - clip[ 5]; frustum[3].Z = clip[11] - clip[ 9]; frustum[3].W = clip[15] - clip[13]; // Extract the FAR plane frustum[4].X = clip[ 3] - clip[ 2]; frustum[4].Y = clip[ 7] - clip[ 6]; frustum[4].Z = clip[11] - clip[10]; frustum[4].W = clip[15] - clip[14]; // Extract the NEAR plane frustum[5].X = clip[ 3] + clip[ 2]; frustum[5].Y = clip[ 7] + clip[ 6]; frustum[5].Z = clip[11] + clip[10]; frustum[5].W = clip[15] + clip[14]; for(int i(0) ; i < 6 ; ++i) { t = sqrt(frustum[i].X * frustum[i].X + frustum[i].Y * frustum[i].Y + frustum[i].Z * frustum[i].Z); frustum[i].X /= t; frustum[i].Y /= t; frustum[i].Z /= t; }
La verticale de la scène est définie selon z.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 bool ViewFrustum::TestPointInFrustum(Vector3<float> p) { for(int i(0) ; i < 6 ; ++i) if(frustum[i].X * p.X + frustum[i].Y * p.Y + frustum[i].Z * p.Z + frustum[i].W <= 0 ) return false; return true; }
Si la façon dont j'ai exposée mon problème n'est pas assez claire, je posterai une vidéo.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 gluLookAt(position.X,position.Y,position.Z,target.X,target.Y,target.Z,0,0,1);
Merci par avance
Partager