Bonjour,je cherche en ce moment a appliquer l'algorithme du view frustum culling, mais je suis confronté à un problème que je n'ai pas pu résoudre :
J'ai réussi à calculer l’équation des deux plans 'near' et 'far', mais la normal des autres plans est inadéquate (elle ne marche que quand la caméra est à la position (0,0,0) (j'ai posté a la fin une vidéo qui le montre), voici comment je calcule pas exemple les deux points du plan left :
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 Vector c,t; double wNear, hNear; Vector normal,point; Vector right,direction,up = InitVector(0,1,0),camPos = InitVector(m->x,m->y,m->z); hNear = 2*tan((double) (f->fovy*M_PI/180)*0.5) *f->near; wNear = hNear* f->ratio; direction = MinusVectors(InitVector(m->x_f,m->y_f,m->z_f),camPos);// camPos -> cible NormaliseVector(&direction); right = VectorProduct(direction,up); ...... c = AddVectors(camPos,AddVectors(ScaleVector(direction,f->near),AddVectors(ScaleVector(up,hNear/2.0),ScaleVector(right,-(wNear/2.0)))));// c est le point à gauche et au centre du plan Near t = AddVectors(camPos,AddVectors(ScaleVector(direction,f->near),AddVectors(ScaleVector(right,-wNear/2.0),ScaleVector(up,-hNear/2.0))));// t est le point à gauche et en bas du plan near. normal = VectorProduct(t,c); point = c; SetPlane(&f->planes[LEFT_PLANE],normal,point);[ame="http://www.youtube.com/watch?v=GFYowJqWGNE"]YouTube - VFX 2011 05 03 18 29 51 84[/ame]
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 void SetPlane (Plane *p,Vector normal,Vector point) { p->normal = normal; p->d = - DotProduct(normal,point); } Vector AddVectors(Vector v1, Vector v2) { Vector result = v1; result.x += v2.x; result.y += v2.y; result.z += v2.z; return result; } Vector MinusVectors (Vector v1, Vector v2) { Vector result = v1; result.x -= v2.x; result.y -= v2.y; result.z -= v2.z; return result; } Vector ScaleVector (Vector v, double scale) { Vector result = v; result.x *= scale; result.y *= scale; result.z *= scale; return result; } double DotProduct (Vector v1, Vector v2) { return v1.x*v2.x + v1.y*v2.y + v1.z*v2.z; } Vector VectorProduct (Vector v1,Vector v2) { Vector result; result.x = v1.y*v2.z - v1.z*v2.y; result.y = v1.z*v2.x - v1.x*v2.z; result.z = v1.x*v2.y - v1.y*v2.x; return result; } void NormaliseVector ( Vector *v) { double lenght = sqrt(v->x*v->x + v->y*v->y + v->z*v->z); v->x/=lenght; v->y/=lenght; v->z/=lenght; } Vector InitVector (double x,double y, double z) { Vector result; result.x = x; result.y = y; result.z = z; return result; }
Merci![]()
Partager