#0 

18-07-2007 22:03:18

ZeroZero
Membre
Date d'inscription: 18-07-2007
Messages: 15

Bonjour,

j'ai en tête de réaliser un editeur de terrain 3D

Pour ce faire, je compte (en faite c'est deja fait ca) deriver la classe ISceneNode.

Dans ma nouvelle classe, je vais ajouter quelque fonction de generation auto par différent algo, (pelerin, diamond square et peut être triangulation de Delaunay si je ne me trompe pas).

Je reflechit actuellement sur le fait de deriver ou non la classe IMeshBuffer pour pouvoir avoir plus de 65536 Indice dans mon rendu. D'ailleur voici la première question :

1 - Comment generer un terrain de 256*256 (comme le ITerrainSceneNode) alors qu'il faut 3 point par triangle ce qui donne 255*255*2 = 65025 triangle soit 65025*3 = 195075 ce qui est bien superieur au 65536 indice maximum? Est ce grace au lod?
Nota : pour remplir mes indice, je fais ca :

Code:

for (u32 z = 0; z < size-1; z++)
    {
        for (u32 x = 0; x < size-1; x++)
        {
            renderBuffer.Indices[n] = x+1+(size*z);
            n++;
            renderBuffer.Indices[n] = x+size+(size*z);
            n++;
            renderBuffer.Indices[n] = x+(size*z);
            n++;
            nbreTriangle++;

            renderBuffer.Indices[n] = x+1+(size*z);
            n++;
            renderBuffer.Indices[n] = x+size+1+(size*z);
            n++;
            renderBuffer.Indices[n] = x+size+(size*z);
            n++;
            nbreTriangle++;
        }
    }

mais la je "dessine" plusieur fois chaque sommet, je ne sais pas si c'est la bonne méthode

Donc voila j'hesite un peu a me faire une classe de MeshBuffer qui acceptera plus de point que ca.

Maintenant j'essaye d'appliquer un LOD dynamique sur ma classe (je ne veux pas precalculer tous les maillages car je doit pouvoir modifier le maillage en temps réel et cela impliquera le recalcul de tous les maillage).
Mon problème est que je n'arrive pas a sortir l'algo.
Bon dans le principê je crois que c'est ca :
Suivant la position de la caméra et un critère de distance, on prend en compte plus ou moins de detaille.
Concretement j'aurais vue ca comme ca (en ne prenant en compte que la distance sur x et z pour le moment) :

Code:

z = 0; 
tant que z inf tailleCarte 
   x = 0; 
   PosCam = getPos(); 
   lod = 0; 
   if distz ou distx sup lod1 => lod = 1; 
   else if distz ou distx sup lod2 => lod = 2; 
   ... 
   else lod = 5; (par exemple pour le lod max) 
   fin if 
   step = 1<<lod; 
   setIndiceTwoTriangle(x,z,step); 
   x += step; 
   if x supEgal tailleCarte 
      x = 0; z +=step; 
   fin if 
boucle

Voila maintenant mon algo n'est pas terrible je trouve (même je suis sur) car d'après mes tests, j'ai des problème d'affichage (des triangle qui se recoupe ou des trous) mais je ne vois pas comment faire. Deuxieme problème, comment m'assurer que tous le terrains est dessiner (cad qu'il ne manque pas une bande sur les coté du carré du terrain dessiner en dernier. Je sais que ce n'est pas clair mais bon j'espere que vous comprendrer).

Donc voici la question 2 :
2 - Quelle sont les problèmes et modification a apporter a mon algo de LOD?

Voila j'aurais surement d'autre questions mais bon si deja ca c'est resolu ca me retire une bonne epine du pied lol

Merci et A+

Nota : Je commence juste a jouer avec irrlicht alors soyer indulgent ...

Hors ligne


#1 

18-07-2007 23:00:19

Copland
Modérateur
Lieu: ZarbiLand
Date d'inscription: 22-09-2006
Messages: 657
Site web

Au risque de dire une grosse connerie, avais-tu vu ça ?(on sait jamais ça peut te servir) ^^ : http://forum.irrlicht.fr/viewtopic.php?id=336


Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.

Hors ligne


#2 

19-07-2007 11:30:39

izguit
Administrateur
Lieu: 127.0.0.1
Date d'inscription: 14-09-2006
Messages: 306
Site web

1- Regarde le lien de Copland, après pour ta génération un simple perlin noise suffira

2- Tu fais ce que tu veux hein, mais le LOD... Ca a plus tendance à merder qu'autre chose, c'est le bordel à mettre en place et au final, tu n'auras probablement pas les perfs souhaitées. Regarde ça, t'auras pas mal d'idées d'optimisation après.


Athlon 64 3000+ // 1Go RAM // Geforce 6600GT 128Mo
Turion 64 X2 // 1Go RAM // ATI X1250

Hors ligne


#3 

19-07-2007 19:20:24

ZeroZero
Membre
Date d'inscription: 18-07-2007
Messages: 15

Ok tous d'abord merci pour vos reponses.

Copland oui j'ai vue ... et la je me suis mis a pleurer en repetant inlassablement mais quand serais capable de faire ca ... lol.
J'ai effectivement rapidement regarder mais avant de me plonger dans ton code, j'aurais souhaiter comprendre les mecanisme de base (remplir un tableau de vertices, calculer les indices et l'afficher).
Bon deja j'ai un peu avancer pour la question 1 car j'ai compris (enfin il était temps) que ce n'est pas le nombre d'indice qui est limité a 65536 mais bien la valeur maximal d'un indice.

En faite si j'ai bien compris, dans un IMeshBuffer, on peu mettre autant de vertex et d'indice qu'on veux (les deux sont des array) mais par contre la valeur maximal d'un indice est de 65536 (cad pas la peine de remplir le tableau de vertice avec un index supérieur a 65536 car on ne pourra pas l'inclure dans le tableau d'indice a dessiner). Déja est ce que ce que je viens de dire est bon?

Ensuite et partant de cette nouvelle hypothese, je tente de faire un terrainde 256*256.
Mon resultat est que seul la moitier du terrain est dessiner (environ et même un peu moins), soit en fait 64514 polygones au lieu de (255*255*2 = 130050). Donc ma question est tous simplement pourquoi?


izguit, j'avais effectivement lu que le LOD n'était pas la meilleur des solution et des que j'aurais resolu la question 1, j'attaque le lien que tu m'as filé.

Voila donc si vous avez des compléments suite a mes nouvelles remarques n'hésiter pas.

Merci
A+

Hors ligne


#4 

23-07-2007 15:58:24

ZeroZero
Membre
Date d'inscription: 18-07-2007
Messages: 15

Salut,

Quelqu'un peut il m'aider a comprendre le fonctionnement des IMeshBuffer en repondant a ma question concernant les indices.

Merci
A+

Hors ligne


#5 

24-07-2007 20:35:48

ZeroZero
Membre
Date d'inscription: 18-07-2007
Messages: 15

Salut a tous,
je suis toujours a la recherche de la reponse afin de mieux comprendre le fonctionnement.
Dans la classe de Terrain de Copland, le nombre maximum d'indice est de 24576 donc ca marche bien (le plus grand tile possible est de 64*64) mais comment indicé un terrain de 256*256?

Ou autrement dit pourquoi un terrain de 256*256 ne s'affiche pas correctement?

Merci
A+

Hors ligne


#6 

28-03-2008 19:41:16

wetneb
Membre
Date d'inscription: 15-04-2007
Messages: 29
Site web

En séparant le maillage de ton terrain en différents meshbuffers ? (signalez-le moi si je dis une bourde smile )

Dernière modification par wetneb (28-03-2008 19:44:17)

Hors ligne


#7 

28-03-2008 21:14:21

Copland
Modérateur
Lieu: ZarbiLand
Date d'inscription: 22-09-2006
Messages: 657
Site web

Théoriquement sur du 256*256 ça donne 65536 ça devrait s'afficher correctement, essaye juste sur du 255*255 au pire mais sache qu'irrlicht est limité aux indices 16 bits.


Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
881 membres
1426 sujets
11116 messages
Dernier membre inscrit: Bidule
20 invités en ligne
Aucun membre connecté
RSS Feed