Partage
  • Partager sur Facebook
  • Partager sur Twitter

Irrlicht

Level of detail

    15 juillet 2007 à 16:43:36

    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?

    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 n'est pas terrible je trouve 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?

    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+



    • Partager sur Facebook
    • Partager sur Twitter
      15 juillet 2007 à 17:49:48

      Salut.

      Citation : ZeroZero

      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?



      J'ai l'impression que tu oublie de prendre en compte le fait que certains sommets seront communs à plusieurs triangles.

      Sinon pour le reste de la question je n'en sais rien mais je vais chercher aussi ça m'intéresse beaucoup. :)
      • Partager sur Facebook
      • Partager sur Twitter
        15 juillet 2007 à 18:05:21

        Salut,
        merci pour cette reponse (a la question 1) mais j'ai un problème.
        Je sais que certaisn sommet sont commun a plusieur triangle mais comment le specifier car j'utilise la fonction suivante :
        driver->drawIndexedTriangleList
                    (&renderBuffer.Vertices[0], renderBuffer.getVertexCount(),
                     &renderBuffer.Indices[0], nbreTriangle );


        Donc le premier terme c'est un pointeur sur le premier vertice du tableau de vertice (normal). Le deuxieme c'est le nombre de vertice, le troisème c'est un pointeur sur le premier indice du tableau d'indice et le dernier c'est le nombre de triangle.

        Donc pour le premier terme ben la je calcul mes 65536 vertice pas de problème.
        Pour le deuxieme pas de problème non plus.
        Pour le troisième, je fais :
        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++;
                }
            }

        et la est mon problème. Je vois bien que je met plusieur le même indice de indice de vertice dans le tableau d'index mais je ne vois pas trop comment faire autrement?

        Si tu as une autre méthode je suis vraiement preneur.

        En tous cas merci d'avoir repondu.

        A+
        PS : Si tu veux mes source pour me repondre demande moi, je ferais de la mise a jour pour que ce soit propre et compréhensible et je t'enverrais ca.
        • Partager sur Facebook
        • Partager sur Twitter
          18 juillet 2007 à 20:03:49

          Salut a tous,

          Quelqu'un peut il me donner un eexplication pour la question 1 et un coup de pouce pour l'algo et l'implementation d'un LOD Dynamique pour un terrain.

          Merci
          A+
          • Partager sur Facebook
          • Partager sur Twitter
            18 juillet 2007 à 23:24:25

            Salut,

            Citation : ZeroZero

            Je sais que certaisn sommet sont commun a plusieur triangle mais comment le specifier car j'utilise la fonction suivante :



            Citation : ZeroZero

            et la est mon problème. Je vois bien que je met plusieur le même indice de indice de vertice dans le tableau d'index mais je ne vois pas trop comment faire autrement?



            Et ben voilà, le fait qu'un indice se répète signifie que le même sommet est utilisé plusieurs fois.

            Je n'ai pas vérifié, mais à priori cette fonction fonctionne de la même manière que décrite au paragraphe 2.1.2 de ce tuto :
            http://loulou.developpez.com/tutoriels/moteur3d/partie3/#L2.1.2

            Sinon pour le code que tu as écris, j'ai un peu la flemme d'essayer de comprendre.
            Pas de commentaires, des variables non déclarées... :/

            Pour le LOD je sais qu'il y a un tut sur developpez.com mais je ne l'ai pas encore lu. :)
            • Partager sur Facebook
            • Partager sur Twitter
              19 juillet 2007 à 13:35:51

              Salut,

              bon je suis un boulet et je viens de comprendre.
              En fait c'est la valeur max d'un indice qui est limité a 65536 et pas le nombre d'indice.
              Donc je peux avoir 65536 Vertex et 195075 indices dans mon buffer du moment que les indices.

              Donc pas de problème on oublie la question 1 (en faite je croyais que le nombre d'indice maximum était de 65536 mais ce nombre correspond en réalité a la valeur maximum d'un indice).

              Pour la question 2 j'ai vue que sur developpez.com y'avait un truc sur le LOD et irrlicht mais c'est du statique (précalculer) et donc ca ne me convient pas car je dois absolument faire du dynamique.

              A+
              • Partager sur Facebook
              • Partager sur Twitter

              Irrlicht

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown