Bonjour à tous,

je suis sur un projet permettant tel un simulateur de vol d'afficher un terrain à partir de données d'élévation terrain (type DTED1) et j'ai un gros problème en ce qui concerne la création de la surface correspondante surtout vis-à-vis du temps de calcul.

Voici ce que j'ai réussi à faire : utiliser et afficher dans une fenêtre 2D mon terrain correspondant aux données DTED. Pour celà je suis passé par le biais de création de texture 2D pour gagner en temps de calcul et ai également implémenté un frustrum culling permettant de gagner de précieuses images par seconde. Ainsi j'ai juste crée un quad sur lequel ma texture (découpée en multiples parcelles de 256x256 pixels) a été plaquée.

Maintenant j'amerais créer ce même terrain mais en 3D c'est-à-dire en voyant le relief et donc les altitudes de celui-ci. J'ai, pour procéder à un test, réalisé l'affichage (partiel) de manière brutale des données c'est-à-dire en utilisant des quads, voici le code utilisé : la variable t ici correspond au terrain crée et le tableau t->ppTE[][] correspond au tableau ayant toutes les valeurs d'élévations, la première dimension correspondant à la latitude la deuxième à la longitude :

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
 
int pas_color ;
float ind_color ;
 
 
pas_color = floor((float)((abs(t->Elev_Min)+(t->Elev_Max/2))/256));
 
for(int i=0; i<t->m_NL-1 ; i++)
{
	for(int j=0; j<t->m_NG-1 ; j++)
	{
		glBegin(GL_QUADS);
		ind_color = ((float)(t->ppTE[i][j])/(float)(256*pas_color))*2;
		if(ind_color <= 1)glColor3f(ind_color,ind_color,ind_color);
		else glColor3f(1.,1.,1.);
		glVertex3f(i*30,t->ppTE[i][j],j*30);
 
		ind_color = ((float)(t->ppTE[i+1][j])/(float)(256*pas_color))*2;
		if(ind_color <= 1)glColor3f(ind_color,ind_color,ind_color);
		else glColor3f(1.,1.,1.);
		glVertex3f((i+1)*30,t->ppTE[i+1][j],j*30);
 
		ind_color = ((float)(t->ppTE[i+1][j+1])/(float)(256*pas_color))*2;
		if(ind_color <= 1)glColor3f(ind_color,ind_color,ind_color);
		else glColor3f(1.,1.,1.);
		glVertex3f((i+1)*30,t->ppTE[i+1][j+1],(j+1)*30);
 
		ind_color = ((float)(t->ppTE[i][j+1])/(float)(256*pas_color))*2;
		if(ind_color <= 1)glColor3f(ind_color,ind_color,ind_color);
		else glColor3f(1.,1.,1.);
		glVertex3f(i*30,t->ppTE[i][j+1],(j+1)*30);
		glEnd();
	}	
}
Comme vous pouvez l'imaginer cette solution marche bien, mais mon simulateur n'est plus du tout en temps réel, ça rameeeeeeeeee mais énormément, imaginez-vous que le nombre de latitude t->m_NL-1 et le nombre de longitudes t->m_NG-1 peuvent aller respectivement jusqu'à 10800 et 7200. Le nombre de quads affichés est alors énorme et donc pas de secret ça rameeee dur durrrr !!!

Alors ma question est comment puis-je faire pour créer mon terrain en 3D tout en restant en temps réel ??? J'ai entendu parlé de ROAM mais si quelqu'un peut m'en donner l'algorithme et comment je pourrai l'utiliser dans mon cas précis je suis preneur !!!

2ème question qui elle est juste pour implémenter un frustum culling dans cette vue 3D : ma caméra dans cette vue correspond à l'avion vue d'intérieur et donc pour celà je n'ai pas utilisé de gluLookat pour pouvoir réaliser les rotations (en cap roulis tangage) aisément...
Voici le code source de ceci, qui marche impeccable au passage

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
 
void camera (void) 
{
	glRotatef(Hel->The/Deg,1.0,0.0,0.0);  //rotate our camera on the x-axis (left and right)
	glRotatef(Hel->Psi/Deg,0.0,1.0,0.0);  //rotate our camera on the y-axis (up and down)
	glRotatef(Hel->Phi/Deg,0.0,0.0,1.0);  //rotate our camera on the z-axis 
	glTranslated(-Hel->Pos2D[0],-Hel->Pos.Z,-Hel->Pos2D[1]); //translate the screen to the position of our camera
}
// Fct d'affichage
void drawVueHC(void)
{
	// Effacement ecran
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
	// Modif de la matrice projection
	glMatrixMode(GL_MODELVIEW);
	// Actualisation de la position de la cam <=> hélico
	camera();
	// Affichage de la carte (DTED) en perspective
	glPushMatrix();
		Draw_DTED_HC();
	glPopMatrix();
	glFlush();
	glutSwapBuffers();
}
Voilà en gros le problème à ce niveau c'est que j'ai pas crée de gluLookat et que mon frustum culling se base sur les paramètres du gluLookAt pour pouvoir créer les 6 faces correspondant au champs de la camera... Savez-vous comment pourrai-je retrouver les paramètres du gluLookAt sans l'utiliser ??? Par exemple je sais que les 3 premiers paramètres représentent la position de la caméra que j'ai sans soucis mais le problème est surtout pour les 3 paramètres suivants correspondant à la direction : comment je peux trouver les 3 composantes de la direction juste avec mes glRotate et glTranslate ??? est-ce-possible ??? Si je suis pas très clair n'hésitez pas à me dire à quel niveau vous bloquez !!!

Je vous remercie d'avance et attends vos réponses et conseils impatiemment !!! le premier problème est beaucoup plus important mais j'insiste quand même sur ma deuxième question car le frustum culling permet de gagner du temps de calcul assez aisément et c'est déjà pas mal !