Bonjour à tous !
Je code actuellement un moteur 3d en OpenGL qui affiche un heightmap (ou heightfield ?!).
Tout marche comme il faut, sauf que j'ai un souci pour le déplacement de la caméra : comment lui donner la valeur adéquate pour ne pas passer au travers du sol ?
Pour le moment j'ai réussi à récupérer une altitude à partir du vertex le plus proche je suppose en faisant une fonction qui donne ça :
où :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 m_Position.y = (GLfloat)((map->GetVertex(m_Position.x/map->m_ScaleValue, -m_Position.z/map->m_ScaleValue)/map->GetDiviseur())*map->m_ScaleValue * (map->GetHeightScale()))+5*map->m_ScaleValue;
Donc, c'est là que vient la question : comment savoir à quelle altitude dois-je placer la camera pour qu'elle se déplace sur le triangle et non pas d'altitude de vertex en altitude de vertex... pour avoir un déplacement "fluide".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 GLfloat diviseur; //paramètre qui permet de diviser les hauteurs (0-255) pour aplanir les "angles" GLfloat ScaleValue;//facteur d'agrandissement le +5*map->m_ScaleValue; à la fin est une valeur perso qui me permet de maintenir la caméra au dessus de la map, sinon avec le backface culling on ne voir rien.
J'ai une piste : calculer la normale du plan, mais déjà pour commencer... comment savoir au dessus de quel triangle se trouve la camera ?
Merci à ceux qui pourront m'aiguiller...
ps : pour afficher mes triangles... version courte :
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 glBegin(GL_TRIANGLES); for (int x=0; x<height-precision; x+=precision) { for (int z=0; z<width-precision; z+=precision) { //======Points du triangle Point3D normale; //-- Premier point (X+1, Z) Point3D triangle1( (x+precision)*size_scale, (GLfloat)GetVertex(x+precision, z)/diviseur, z*size_scale); //-- Deuxième point (X, Z) Point3D triangle2( x*size_scale, (GLfloat)GetVertex(x, z)/diviseur, z*size_scale); //-- Troisième point (X+1, Z+1) Point3D triangle3( (x+precision)*size_scale, (GLfloat)GetVertex(x+precision, z+precision)/diviseur, (z+precision)*size_scale); //-- Quatrième point (X, Z+1) Point3D triangle4( x*size_scale, (GLfloat)GetVertex(x, z+precision)/diviseur, (z+precision)*size_scale); //========== Selection //== Premier triangle //-- Normale // on calcule la normale du triangle (optionnel) normale = (triangle1-triangle2)*(triangle2-triangle3); glNormal3f(normale.x, normale.y, normale.z); glVertex3f(triangle3.x, triangle3.y, triangle3.z); glVertex3f(triangle1.x, triangle1.y, triangle1.z); glVertex3f(triangle2.x, triangle2.y, triangle2.z); ...etc pour les autres triangle...
Partager