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 :
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) :
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
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
Hors ligne
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.
Hors ligne
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
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
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
En séparant le maillage de ton terrain en différents meshbuffers ? (signalez-le moi si je dis une bourde )
Dernière modification par wetneb (28-03-2008 19:44:17)
Hors ligne
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.
Hors ligne