Echelle OpenGL !!

Résolu
barraq Messages postés 89 Date d'inscription mercredi 25 juin 2003 Statut Membre Dernière intervention 14 septembre 2007 - 14 mars 2005 à 18:42
KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 - 19 mars 2005 à 18:43
Salut a tous,



J'ai créé une "heightmap" ou dedans je peux me deplacer.

Je lis dans un fichier ou mes vecteur sont tous rangés.

Par exemple :



fichier1.txt :

-15000 345 12734

.

.

.

15000 34 -12734



fichier2.txt

-500 23 500

.

.

.

500 56 -500



L'ennui est que lorsque la map s'affiche, je ne vois pas la difference
entre le fichier 1 et le fichier 2 !! je ne sais pas trop comment faire
....



OpenGL ne fait pas attention a mes coordonnée, il prend juste plus
grande je pense et fait une moyene..... d'ou le fait d'afficher des map
de meme "taille" sur l'écran !!



Comment peu on regler se probleme ???

peu etre tracer un ligne trés grande par rapport a ma carte pour bluffer opengl ?



Ceux qui on des idées......

merci bien.

http://nomind-world.com

65 réponses

KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 2
15 mars 2005 à 19:05
"A donc sa viendrai du fait que je place ma camera trop haut au départ........"
Ben non ni trop haut ni trop bas, j'ai mis ces valeurs histoire de tourner un peu la camera pour voir ce que ca donnerai.
Et disons que c'est un peu normal que les triangles apparaissent "de meme taille" a l'ecran car avec la "Petite" tu dessines un "petit" triangle mais "près" et avec la "Grande" tu dessines un "grand" triangle mais "loin".
En fait c'est exactement ca, avec la grande tu dessine les memes triangles dix fois plus grand mais dix fois plus loin (je sais plus si c'est 10 le facteur mais bon...).

Effectivement j'ai terminé mon DESS l'année derniere donc oui pendant quelques annees j'ai eu une formation informatique (DEUG,licence,maitrise,DESS).
-Apres je pense pas qu'il y est THE Methode unique, mais plusieurs, chacune s'adaptant au soft a developpe.
-D'une facon generale, faut tout mettre au papier (UML, diagramme de classe, etc..). et coder ensuite puis test, integration, le cycle en V quoi.
-Je ne benifie pas d'une experience assez grande dans le milieu professionnel pour te dire si c'est super ou nul ou a revoir, mais je dirais quand meme que c'est bien codé au niveau presentation (commentaire, des espaces, tabulations, lisible, rigueur de la syntaxe (le underscore devant chaque membre de classe, les majuscules ou il faut,etc)..... ca respire déjà). Apres il y a des gens qui vont surement te dire que tu fais du C++ donc les FILE*,fscanf,fprintf,etc.. ben t'oublies !!!

Personnellement, ton code j'aimerai en etre l'auteur donc a part les rectifications que je t'ai donne plus haut, ben il est BIEN

KeniiyK
0
KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 2
15 mars 2005 à 19:10
Erf, on a poste en meme temps, c'est quoi cette police qu'il a mis ?????, bon bref....

Tu peux aussi faire par les display lists, mais les glDrawArray ca turbine 4 fois plus.
Les display lists moi je m'en sers pour retablir les etats d'OpenGL.

Je vais te chercher un exemple et je te le poste ici.

KeniiyK
0
KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 2
15 mars 2005 à 20:03
Bon autant commence avec du code

glEnableClientState(XXX) sers a dire (en les activant donc) quels tableaux tu va utiliser lors de ton prochain trace.
glDisableClientState(XXX) contrairement a la precedente sert a desactiver les tableaux.

Apres pour chaque tableau utilisé il y a une commande pour precise le tableau de donnees a utilisé qui sont (je te presente juste les 3 plus importantes):
glVertexPointer(XXX); pour les sommets (la plus importante c'est elle qui trace la geometrie, les autres dependent de ce que tu precise dans celle la...).
glNormalPointer(XXX);pour les normales aux sommets (dans celle la par exemple si tu trace plus de sommets dans glVertexPointer qu'il n y a de normales ben tu genere une erreur).
glTexCoordPointer(XXX); pour les coords de textures aux sommets.(meme remarque que pour les normales il en faut au moins autant que les sommets).

Un exemple de code de tracé:

// on active le tableaux des sommets
glEnableClientState(GL_VERTEX_ARRAY);

// on precise le tableau "vertexArray" de GLfloat avec "3" composantes par points
// je te parle pas du "0" en fait tu peut utiliser des tableaux entrelacés c'est a dire que tu peux
//faire un tableau contenant les coords des sommets, des normales, color vertex, coord
//texture,etc..
glVertexPointer(3,GL_FLOAT,0,vertexArray);

// on active le tableaux des normales
glEnableClientState(GL_NORMAL_ARRAY);

// on precise "normalVertexArray" comme tableau de données en GLfloat
// notes ici que l'on ne dit pas si c'est des normales 2D ou 3D, il saura au moment du tracé que c'est du 3D (ici) car on l'a precise dans la commande glVertexPointer(3,...)
glNormalPointer(GL_FLOAT,0,normalVertexArray);

// enfin on y arrive, le trace proprement dit, on precise que l'on va trace des
//"GL_TRIANGLES"
// que l'on commencent a tracé a partir du premier sommet (le "0")
// et que l'on fini au sommets 3*numTriangles-1
// il est imperatif que tu comprennes que dans cette fonction les indices donnés sont ceux des
//points du tableau passé dans glVertexArray
glDrawArrays(GL_TRIANGLES,0,3*numTriangles);

// on desactive enfin les tableaux utilises
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);

Precision :
le vertexArray doit etre construit face par face donc c'est une suite de POINT(ijk)
qui veut dire " La composante "i" du point (ou sommet) "j" de la face "k" "
exemple : disons que l'on veuille trace les triangles
T0( V0=[0 0 0], V1=[0 0 1], V2=[0 1 0])
T1( V0=[0 0 0], V1=[0 0 2], V2=[2 0 0])
le vertexArray=(0 0 0 0 0 1 0 1 0 0 0 0 0 0 2 2 0 0)
et le trace glDrawArray(GL_TRIANGLE,0,6)

si on fait glDrawArray(GL_TRIANGLE,0,3) seul le triangle T0 sera trace

Et donc tu peux donc meme mettre un/des quads suivi de Triangles ou l'inverse ou plus
imaginons le quad Q0 (V0=[0 0 0], V1=[0 0 1], V2=[0 1 1], V3=[0 1 0]) et
le triangle T1( V0=[2 0 0], V1=[0 0 2], V2=[2 0 0])

le vertexArray contenant Q0 puis T1 =
(0 0 0 0 0 1 0 1 1 0 1 0 2 0 0 0 0 2 2 0 0)
pour trace les deux primitives :
glVertexPointer(3,GL_FLOAT,0,vertexArray);// tjrs pareil
glDrawArray(GL_QUADS,0,4);
glDrawArray(GL_TRIANGLES,4,7);

voila, si t'as d'autre question...

KeniiyK
0
barraq Messages postés 89 Date d'inscription mercredi 25 juin 2003 Statut Membre Dernière intervention 14 septembre 2007
15 mars 2005 à 20:28
ouao :)

je vais me pencher serieusement sur le probleme, la je suis un peu perdu...

je relis le truc et je te dis.



Par contre un autre probleme celui est moin compliqué, je pense avoir une idée, mais peu etre que il y a une plus facile :

quand je déssine une grande map, donc la distance entre les sommets de
mes triangles est de 1000 par exemple, sur ma heightmap, cela
represente 1 pixel.

Le probleme est comment eviter de rentrer dans la montage !!, je ne peu
pas utiliser ma heightmap car la heuteur est exprimée entre 0 et 255
donc un mouvement de 1 sur ma heightmap se traduis par un mouvement de
1000 dans la carte affichée !!! se qui nest pas possible bien sur....
le probleme n'est pas quand le sol est plat mais quand le sol est tordu.

En montée : je rentre dans le sol

En descente : je suis 1000 foi trop haut :)



Donc se qui faudrai faire c'est en utilisant ma vrais position, donc
celle que la camera a, retrouver le ou le triangles que je survole et
avec cela, calculer la pente des face et en ressortir une fonction f(X,
Y) qui me donnera la position a avoir en Y.



Ya pas mieux ?? par hazard si tu sais :)



vraiment déja c'est trop bien se que tu m'as donné, merci beaucoup

bon je regarde les glDrawArray de plus pret...



.....
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 2
15 mars 2005 à 20:50
Ben là, tu rentres dans un des problemes les plus compliqués : les collisions et leurs détections. Au debut j'ai cru que ton code les geraient car la methode principalement utilisée passe par les Octree et apres en chaque Octree construire un BSPtree.
Ah oui je t'est pas dit, je suis aussi en train de faire un ptit soft (C++ / Qt / OpenGL / Windows) qui est a base de HeightMap pour tester et bien comprendre les collisions via la méthode précédente, j'en suis au BSPtree...

Pour les BSPtree si tu connais pas cherche sur le web, désolé,c un peu long a expliquer.

KeniiyK
0
barraq Messages postés 89 Date d'inscription mercredi 25 juin 2003 Statut Membre Dernière intervention 14 septembre 2007
16 mars 2005 à 11:42
Oui je vois ce que s'est, sa marche en gros pareil que les octrees donc.....

mais dans mon cas je pense que je vais supposer que le rayon de
courbure de mon terrain est trés petit devant la sphere qui englobe mon
joueur... et hop comme cela c'est carement plus simple.... la j'ai pas
le temps de construite un BSP tree...

A oui ton projet, tien moi au courant quand il est fini, tu va le mettre ici je pense?

moi une foi finis je compte le mettre ici.



Bon a plus, et encore merci pour tout !!
0
KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 2
16 mars 2005 à 12:02
"je vais supposer que le rayon de courbure de mon terrain est trés petit devant la sphere qui englobe mon joueur..." tu veux dire que localement le rayon de courbure de ton terrain sera toujours largement inferieur a celui de la sphere englobante du joueur
?.
Je sais pas si c'est une bonne idée, imagines que ton joueur se trouve sur une ligne d'arete des triangles et que l'angle entre l'arete ou il se trouve et la prochaine soit quasiment a 90 degre (falaise), les rayons de courbures seront quasi equivalent et si 90 degrés alors equivalents.....

"et hop comme cela c'est carement plus simple....", en imaginant que ta supposition marche, je vois ce qui est plus simple ou alors j'ai loupé un truc...

Je sais pas si je posterai mon code, il est un peu (bcp ....) degueulasse et le but des forums et des codes postés est d'apprendre, alors.....

KeniiyK
0
cs_neodante Messages postés 2835 Date d'inscription lundi 11 août 2003 Statut Modérateur Dernière intervention 16 décembre 2006 11
16 mars 2005 à 12:06
Salut



Le principe du BSP est de loin celui de l'octree avec frustum bien que
l'objectif est le même ... en fait le BSP (inventé par le non moins
célèbre John Carmack de chez ID et créateur de Doom et de Quake qui
jouait avec nos cartes graphiques avec de l'assembleur à l'époque ...)
est une technique qui consiste à séparé ton monde en plan et à
organiser celui-ci dans uns structure de données de façon à le rendre
dans un certain ordre, etc ... en fait tout ce dont on a besoin pour
l'affichage et ... la détection de collision, en plus ça peut servir
pour l'IA donc que du bonheur ...



Voici un petit lien (sinon 'BSP tree' dans google) pour expliquer le
foncitonnement avec une applet Java vraiment impressionante :

http://symbolcraft.com/graphics/bsp/



Sinon pour le fair evaec le heightmap il faut que tu fasses un peu de
math tel qu'une fonction te permettant de faire l'intersection d'une
ligne sur une surface et également la projection d'un point sur un plan
... tu devrais trouver des tutoriaux trsè intéressant sur
www.gametutorials.com



@+ et bon courage
0
KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 2
16 mars 2005 à 12:08
Bon je me suis planté :
"et hop comme cela c'est carement plus simple....",
en imaginant que ta supposition marche, je ne vois pas ce qui est plus simple ou alors j'ai loupé un truc...

KeniiyK
0
cs_neodante Messages postés 2835 Date d'inscription lundi 11 août 2003 Statut Modérateur Dernière intervention 16 décembre 2006 11
16 mars 2005 à 12:10
Salut



En fait l'utilisation de l'une ou l'autre des techniques bien que j
epenche plus plus pôur le BSP dépend de ce que tu veux rendre ... si
c'est de l'intérieur alors le BSP est indispensable alors que
pour de l'extérieur, l'octree/quadtree avec d'autres techniques dont je
pourrais te retrouver les nom + combinaison d'autres techniques (LOD
par exemple) sont fortement conseillé ...



@+
0
barraq Messages postés 89 Date d'inscription mercredi 25 juin 2003 Statut Membre Dernière intervention 14 septembre 2007
16 mars 2005 à 18:01
juste une autre question dans mon prog j'ai des probleme, a certain
moment les montagnes sont mal déssinées.... genre par exemple des fois
on voit a travers !!

ou les textures bougent !!! quand tu te rapproche elles changent d'apparence !

d'ou sa peu venir ? sa vien du faire que mon application est gourmande
en temps calcul et donc opengl fais n'importe quoi ? ou sa vient de la
maniere de comment je dessine ?

dans les deux cas, vous avez une solution :)



trop bien :) merci



barraq
0
KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 2
16 mars 2005 à 18:26
Ben tu utilises le mipmaping avec 3 niveaux il me semble, alors normal qu'elle change de temps en temps d'apparence.
Apres j'ai pas trop regarde les filtres MAG et MIN que tu appliques mais ca peut jouer aussi.
Ensuite les extension ARB je ne les connait que pour activer ou desactiver les etages de textures, donc je peut pas trop t'aider par exemple :
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
glTexEnvi(GL_TEXTURE_ENV, GL_RGB_SCALE_ARB, 2);
j'ai jamais utilise ces "envirronements de plaquage".

Par contre je peut te donner un tuyau :
GL_TEXTURE1_ARB == GL_TEXTURE0_ARB+1
avec ca tu peut vite fait activer / desactiver les etages de textures ou plus suivant l'application.

KeniiyK
0
KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 2
16 mars 2005 à 18:40
Et au fait quand j'etais en DESS mon prof d'OpenGL m'avait dit qu'il fallait toujours reactive l'etage 0 apres un enable ou disable de ton materiau (si le multi texturing est utilise).

glActiveTextureARB(GL_TEXTURE0_ARB);

KeniiyK
0
cs_neodante Messages postés 2835 Date d'inscription lundi 11 août 2003 Statut Modérateur Dernière intervention 16 décembre 2006 11
16 mars 2005 à 20:25
Salut



OpenGL c'est comme l'informatique, il fera toujours ce que la personne
lui a dit de faire ou ce que les développeurs ont voulu faire !!!!

Je pense que ton problème d'apparence vient plutôt du filtre de ta texture cf :

http://www.neogamedev.com/index.php?PageID=2028

(désolé je n'ai pas eu le temps de refaire la mise en page de cette page !)

surtout si tu n'utilises pas le multitexturing ...

@+
0
barraq Messages postés 89 Date d'inscription mercredi 25 juin 2003 Statut Membre Dernière intervention 14 septembre 2007
16 mars 2005 à 20:34
Pour les textures qui bougent je vais regarder ce que tu me dis.



Mais le fait que des fois opengl affiche se qui a derrière les montagnes par exemple ?

sa sa peu venir de ou ? c'est vraiment desagreable.... comme si le
DEPH_testing ne marchais pas... si tu regarde bien les montagnes de
loin tu veras tu apercevras ce qui a derrière....

déja je sais que si je dessine la skybox avant sa empire :) mais c'est tout :)



tu as étudié OpenGL en DESS ? ta bien de la chance....

la moi je galere comme un fou :) je suis en angleterre pour faire ma licence d'info .

Le truc c'est que je n'est jamais réélement fait de gros projet comme
sa.... juste je m'amusai a programmer un peu pour moi.

La je me retrouve en angleterre en 3iem année d'info, donc (2em année maitrise !!) et donc je suis trop a la rue !!!!!

j'ai du apprendre programmation object, c++, openGL tout comme sa a la vas vite ! car pour eux c'est déja de l'aquis...

bref c'est chaux pour moi :)

Surtout que la je vien de voir mon superviseur et il a dis en gros que c'été de la merde !!

donc ............. je me remet tout de suite a bosser !!!!!!!!!!!!!!!!



a plus,



barraq
0
barraq Messages postés 89 Date d'inscription mercredi 25 juin 2003 Statut Membre Dernière intervention 14 septembre 2007
16 mars 2005 à 20:41
A on a posté en meme temps

j'ai mis ma source en ligne si tu veu aller voir :


http://barraquand.fr/rb247/DoubleProject/Prog/



j'utilise le multitexturing....
0
KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 2
16 mars 2005 à 21:08
Ah oui pardon c'est vrai que tu peux avoir des probleme de DEPTH_TEST, en effet le
Z-BUFFER est calcule sur un certain nombre de bit (je croi que ca depend de la CG) et qu'en plus si tu te sers du STENCIL BUFFER il prend ca place dans les bits du Z-BUFFER.
Explication :
Admettons que le Z-BUFFER marche sur 4 bit (faux mais pour l'exemple) ca veut dire qu'il ne peut differencier que 2 puissance 4 valeurs differentes donc quand tu trace 10000 polygon et qu'en fait il y a 100000000 de distances differentes ben il peut pas toutes les differencier donc a certain moment il fait un choix....

KeniiyK
0
cs_neodante Messages postés 2835 Date d'inscription lundi 11 août 2003 Statut Modérateur Dernière intervention 16 décembre 2006 11
16 mars 2005 à 22:16
Salut



Le depth buffer est définit lors de la création du context rendering
(sous Windows lros de la définition du PIXELFORMAT) en général on met
16 bits pour celui-ci ...



T'aurais pas le code en ZIP ou RAR .. ACE comprends pas mon winrar !!!! Il me fait une erreur ... sniff ..



@+
0
barraq Messages postés 89 Date d'inscription mercredi 25 juin 2003 Statut Membre Dernière intervention 14 septembre 2007
16 mars 2005 à 22:30
ok c'est partis, c'est entain de l'envoyer (App3_Tree.zip)
0
barraq Messages postés 89 Date d'inscription mercredi 25 juin 2003 Statut Membre Dernière intervention 14 septembre 2007
16 mars 2005 à 22:51
J'ai encore une question



voila, en fait je construit mon octree pour ne pas avoir a afficher la
map entierement, mais seulement la partie qui est visible par la camera.

Donc pour dessiner mon octree, je commence par le neoud parent et je
regarde si il est dans mon frustum et si oui je recurse si non je
stop..... etc...



Maintenant j'aimerais utiliser mon octree pour autre choses, par exemple :

mon joueur est a la position (x,y,z) j'aimerai savoir comment acceder
au noeud correspondant dans mon octree, de tel maniere a se que je
fasse le teste de collision seulement avec les vertex compris dans ce
neoud.



Le probleme c'est que j'ai que une relation neoud -> verticies

je n'est pas de relation verticies ou position -> noeud



J'ai peut etre une methode, je recurse dans mon arbre :

- si ma position est comprise dans le carré qui constitu mon noeud : je recurse

- sinon j'arrete

- si le noeud est une feuille ben sa veu dire que j'ai trouvé le
conteneur de mes verticies et donc je fait mon teste de collision avec
ce noeud.



Ya pas mieux ? ou c pas trop mal ?
0
Rejoignez-nous