Bonjour a tous, j'ai vraiment un gros probleme, que je n'arrive pas a resoudre depuis plusieurs jours ...

Les algos pour affcher des ombres sont connus, et censés etre simples d'utilisation.
J'ai pris des modeles pour etablir une classe de gestion des ombres (appelées SHADOW).
HORS MON OMBRE SORT TOUJOURS DU PLAN QUI EST CENSé LA CONTENIR.

Je vais detailler l'algorithme.
Normalement c'est simple, mais je cherche sans jms trouver
POuvez vous m'aider la dessus ? ? Un grand merci :

PS : c'est long mais c'est parceque je détaille tout, en commentant. J'en ai tellement marre de pas trouver ...

Voici ce que je met dans la boucle principale d'affichage (myDraw()) :

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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
 
 
/* On fixe le plan qui va supporter les ombres */
shadow.setShadowedFloor(lePlan);
/* NB : le plan est un objet tout simple (un QUAD) */
 
/* Affecte le stencil buffer pour ce plan : */
shadow.initStencilForFloor();
 
// AFFICHAGE DU PLAN avec une texture
shadow.drawPlane(my_textures[0]);
 
/* AFFICHAGE DE LOMBRE */
float objectTranslation[3] = {-20,0,0} ; 
glPushMatrix();
shadow.drawShadow(c,0.2,lightPosition, objectTranslation);
glPopMatrix();
 
// Affichage de l'objet qui cree lombre ......
 
//Maintenant, detaillons les focntions importantes de la classe ombre :
// (DANS LA CLASSE Shadow)
 
 
/* SIMPLEMENT : PLACE 1 dans le Stencil Buffer ou est tracé le plan (sans l'afficher) */
void Shadow::initStencilForFloor(){
	/* The shadow will be bounded to the ground */
	// Turn off writing to the Color Buffer and Depth Buffer
	// We want to draw to the Stencil Buffer only
	glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
	//glDepthMask(GL_FALSE);
	glDisable(GL_DEPTH_TEST);
 
	// Enable the Stencil Buffer
	glEnable(GL_STENCIL_TEST);
 
	// Set 1 into the stencil buffer
	glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
	glStencilFunc(GL_ALWAYS, 1, 0xffffffff);
 
	// Trace the floor only to set the stencil values to 1	
	//glCallList(thePlane);
 
	glPushMatrix();
	glRotated(-90,1,0,0);
	plan.afficheGL();
	glPopMatrix();
 
	// Turn on Color Buffer and Depth Buffer
	glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
	//glDepthMask(GL_TRUE);
	glEnable(GL_DEPTH_TEST);
	glDisable(GL_STENCIL_TEST);
}
 
/* 
Prend un objet cube, une opacité pour l'ombre, la position de la lumiere, et le deplace de l'objet (eventuellement).
 
Cette fonction se contente de calculer l'objet ombre et de l'afficher.
ON L'affiche uniquement quand le Stencil = 1 (donc ca devrait marcher !!!!).
Or, ca l'affiche sur tout l'ecran. Miséricorde, help !!
*/
 
 
void Shadow::drawShadow(Cube c, float opacity, float lightPosition[4], float objectTranslation[4]){
	glEnable(GL_STENCIL_TEST);
 
                /* LE TEST QUI DEVRAIT TOUT FAIRE : */
	glStencilFunc(GL_EQUAL,1,0x11111111f); 
	glStencilOp(GL_KEEP,GL_KEEP,GL_KEEP); // indique que le test réussi toujours 
                /* Ombre semie transparente */
	glEnable(GL_BLEND);
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
	glDisable(GL_LIGHTING);
	glDisable(GL_TEXTURE_2D);
	glDisable(GL_DEPTH_TEST);
	/* Couleur de l'ombre */
	glColor4f(.5,.5,.5,opacity);
 
	glPushMatrix(); 
	{
	/* On se place ds un nveau repere avec la matrice de projection */	  
	  glMultMatrixf(matriceProjection(lightPosition));
 
	  /* Avoid Z Fighting */
	  glTranslated(0,0.025,0);	  
	  glTranslated(objectTranslation[0], objectTranslation[1], objectTranslation[2]);	  
                 /* Dessine l'ombre du cube (soit le cube dans le nveau repere */
	  c.afficheGL();  
	}
	glPopMatrix();	
 
	glEnable(GL_DEPTH_TEST);
	glEnable(GL_TEXTURE_2D);
	glDisable(GL_BLEND);
	glEnable(GL_LIGHTING);
	glDisable(GL_STENCIL_TEST);
}