Partage
  • Partager sur Facebook
  • Partager sur Twitter

Moteur de jeu 3D

Trouver l'aiguille dans une botte de paille...

Sujet résolu
    11 mai 2019 à 0:43:06

    Bonjour à tous les développeurs ;)

    Je suis sur un projet de Moteur 3D en C++. En ce moment je suis entrain de coder sur CodeBlocks tous les outils liés à la géométrie dans l'espace tel que les matrices homogènes, vertex, etc... Tout ça c'est des maths, donc je ne sais pas si beaucoup d'entre vous comprendrons :euh:.

    J'ai donc fait le choix de créer une classe Vertex qui correspond tout simplement à un point dans l'espace. Or j'ai une erreur qui survient dés mon constructeur sans que je ne comprenne trop pourquoi.

    Pour vous mettre en situation, j'ai adapté mon fichier main.cpp :

    #include <iostream>
    #include <vector>
    #include "render.h"
    #include "geometry.h"
    
    using namespace std;
    
    int main()
    {
    
        vector<double> const location_1 (4,1.0);
        vector<double> const location_2 (4,0.0);
    
        Vertex vertex_1 ();
    
        vertex_1.setLocation(location_1);
    /*    Vertex vertex_2 ();
        vertex_2.setLocation(location_2);
        vertex_2.setLinks(vector<Vertex> a (1;vertex_1));
    */
        cout << "Hello World" << endl;
        return 0;
    
    }
    

    Ici j'aimerai construire vertex_1 à partir d'une postion décrite au préalable. Sauf que CodeBlocks me renvoie très gentiment :

    error: request for member ‘setLocation’ in ‘vertex_1’, which is of non-class type ‘Vertex()’

    J'avoue ne pas trop comprendre...

    Le reste de mon code se trouve sur le git : https://gitlab.com/peterpanGP/3d_engine_cpp/

    Merci à vous de m'aider, parce que vraiment je sèche...:(

    -
    Edité par GrégoirePineau 11 mai 2019 à 0:44:32

    • Partager sur Facebook
    • Partager sur Twitter
      11 mai 2019 à 1:41:38

      Lu',

      Pour commencer, il y'a une (grosse) difference entre moteur graphique/ de rendu et moteur de jeu; il y'en a un qui est un peu plus chaud à coder que l'autre...

      Concernant ton problème, ce que tu as ecrit à la ligne 14 ne declare pas une variable, mais une fonction s'appellant vertex_1 (mauvais nommage d'ailleurs) qui ne prend aucun parametre et qui retourne un Vertex. En gros:

      Type nom() = declaration de fonction
      Type nom{} = declaration de variable
      

      avec une exception pour les tableaux (std::vector/array....)

      Sinon pour le reste de ton code:

      • pas de using namespace std
      • pas de tableau à la C
      • En general un vertex est composé à minima d'une coordonée dans son propre espace, d'une coordonnée pour la texture et d'une couleur. Ces 3 données ne sont nulle part dans ton code (à priori)
      • Un mesh c'est (pour faire simple )juste un tableau de vertices. On peut ajouter un tableau d'indice pour un peu d'optimisation, ajouter un tableau de normales pour plus de fonctionnalités, mais surement pas des matrices ou même des rotations. Si ton mesh doit translater, rotationner, etc... Ce n'est pas au mesh lui même de gerer ces movement, mais à l'objet qui "possede" le mesh en question.
      • Ecrire un moteur de rendu est deja assez galère comme ça pour en plus aller coder toute la partie mathematique du truc. Il y'a des lib faites pour: glm (en autre)
      • Essaie de mieux nommer tes variables. Par exemple location, link, dans la classe Vertex perso, ça ne me parle pas assez pour que je puisse comprendre à quoi elle servent.
      • Apres je ne sais pas quelle lib graphique tu comptes choisir (ou as deja choisi), mais au pif il y'a Vulkan (certain diront que c'est du suicide...)
      • etc....

      Good luck!

      • Partager sur Facebook
      • Partager sur Twitter

      Eug

        11 mai 2019 à 10:20:17

        Merci beaucoup pour temps que tu donne pour me répondre :)

        Pour te répondre, link sert à lister les autres vertices qui sont lié à l'objet. Par exemple, dans un cube, chaque vertices est lié à trois autres vertices, Cela me servira ensuite, dés lors que j'ai réussi à projeter ma scène 3d en 2d, a liés les points entre eux par un segment.

        Ensuite tout le but de mon projet c'est de comprendre comment marche un moteur de rendu, donc il faut que j'utilise le minimum de librairie, mathématique ou graphique. J'ai le bagage mathématique pour assumer la partie cette partie, et c'est pour ça que je voulais me lancer là dedans. Pour la librairie graphique j'ai choisi SDL, mais pour l'instant je l'ai pas implanté parce que je sais pas encore l'utiliser :-°

        J'ai regardé ton truc sur le "using namespace std" et effectivement c'est un détail que je ne savais pas. J'ai encore peu d'expérience en C++, donc j'avoue suivre un peu la forme type qu'on retrouve dans le cours d'openclassrooms.

        Mais juste je comprends pas ce que tu voulais me dire pour la ligne 14... Je veux dire, c'est normal qu'il y est des parenthèse puisque j'appelle le constructeur (qui est une fonction...). Où est le problème? Pourquoi j'utiliserais les '{}'? En plus ça marche pas :(.

        Merci quand même je continue, ton commentaire m'aide bien déjà:D

        -
        Edité par GrégoirePineau 11 mai 2019 à 10:29:05

        • Partager sur Facebook
        • Partager sur Twitter
          11 mai 2019 à 10:54:19

          Salut !

          Le constructeur par défaut est appelé, comme son nom l'indique, par défaut. Donc pas besoin de mettre les ( ). Les { } te permettent d'appeler explicitement le constructeur par défaut.

          Vertex vertex;
          Vertex vertex{};

          À part ça, c'est quand même assez bizarre de se lancer dans le développement d'un moteur de rendu 3D sans même savoir comment utiliser la bibliothèque qui servira à l'affichage... o_O

          Dans tout les cas, je te souhaite bonne chance pour ton projet ! :D

          • Partager sur Facebook
          • Partager sur Twitter
            11 mai 2019 à 11:31:59

            >Pour te répondre, link sert à lister les autres vertices qui sont lié à l'objet. Par exemple, dans un cube, chaque vertices est lié à trois autres vertices, Cela me servira ensuite, dés lors que j'ai réussi à projeter ma scène 3d en 2d, a liés les points entre eux par un segment.

            Me dis pas que tu veux faire la rastérisation toi-même ?

            • Partager sur Facebook
            • Partager sur Twitter

            Si vous ne trouvez plus rien, cherchez autre chose.

              11 mai 2019 à 12:07:11

              Coucou

              J'ai un doute sur ta démarche. Essaies tu d'apprendre sans avoir une référence d'une pipeline de rendu 3D temps réel (avec juste des connaissances en algèbre linéaire tu vas galérer à fond) ? D'implémenter des algos de rasterization sans passer par une API bas niveau?

              Fais toi au moins les dents sur quelques tutos en OpenGL (je te déconseille Vulkan pour l'instant, pas assez de ressources dispos pour un débutant) :

              https://learnopengl.com/

              http://ogldev.atspace.co.uk/

              Livres pour aller plus loin en OpenGL: OpenGL SuperBible, OpenGL Programming Guide, OpenGL Insights

              Livre de référence en 3D temps réel (théorie) : Real Time Rendering par Tomas Akenine Moller. Il y a même un chapitre gratos sur le ray tracing temps réel sur http://www.realtimerendering.com/index.html

              Livre de référence en 3D photoréaliste (théorie et implémentation) : Physically Based Rendering, From Theory to Implémentation

              Livre sur les tests de collision : Real-Time Collision Detection

              -
              Edité par SpaceIn 11 mai 2019 à 12:08:56

              • Partager sur Facebook
              • Partager sur Twitter
                11 mai 2019 à 14:07:08

                Je fais déjà beaucoup d'OpenGl grâce au logiciel Blender. Le but pour moi est de faire quelque chose de similaire à OpenGl. L'intéret de ce projet est très limité, si ce n'est de comprendre comment ça marche.

                dragonjoker a écrit:

                Me dis pas que tu veux faire la rastérisation toi-même ?


                Bah en fait je me dis que si j'ai les cordonnées de deux points en deux dimensions, je peux bien utiliser une librairie graphique tel que sdl pour tracer un sgment entre les deux points... Je vais pas m'embêter à contrôler chaques pixels, on en est pas là ^^

                -
                Edité par GrégoirePineau 11 mai 2019 à 14:12:13

                • Partager sur Facebook
                • Partager sur Twitter
                  13 mai 2019 à 11:03:01

                  Si tu a un peu de connaissance en 3D, tu sais très bien que le rendu d'un segment avec une librairie graphique 2D n'est pas adapté (z-buffer pour les rendus de transparence, aliasing, etc...)

                  Parler de "link" à la place d'"edge", ça donne l'impression que tu ne maitrise pas encore trop le jargon 3D, même si tu connais les math derrière.

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                    14 mai 2019 à 19:35:29

                    GrégoirePineau a écrit:

                    Je fais déjà beaucoup d'OpenGl grâce au logiciel Blender. Le but pour moi est de faire quelque chose de similaire à OpenGl. L'intéret de ce projet est très limité, si ce n'est de comprendre comment ça marche.

                    dragonjoker a écrit:

                    Me dis pas que tu veux faire la rastérisation toi-même ?


                    Bah en fait je me dis que si j'ai les cordonnées de deux points en deux dimensions, je peux bien utiliser une librairie graphique tel que sdl pour tracer un sgment entre les deux points... Je vais pas m'embêter à contrôler chaques pixels, on en est pas là ^^

                    -
                    Edité par GrégoirePineau 11 mai 2019 à 14:12:13


                    Salut !

                    Il me semble que nativement, SDL ne sait pas tracer des segments, a moins que tu installes une extension, ou bien que tu recodes toi même un Bresenham (ce qui se fait bien). 

                    Colle nous ici la fonction que tu utilises pour tracer des segments.

                    Mais sinon, oui, l'image d'un segment dans l'espace rasterisé est également un segment, ce qui te permettra de faire relativement rapidement des rendus en wireframe.

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                    Moteur de jeu 3D

                    × 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