Partage
  • Partager sur Facebook
  • Partager sur Twitter

Qt6 OpenGL Affichage de boîtes

Jeu du labyrinthe

Sujet résolu
    5 juin 2024 à 14:45:21

    Bonjour à toutes et à tous,

    Il y a quelques années déjà, j'avais codé un jeu du labyrinthe en 2D avec Qt4.
    J'avais ajouté une option pour y jouer en 3D (2D augmenté) avec OpenGL1.

    Depuis, j'ai commencé à reprendre le code pour en faire une meilleure version, en plus d'y ajouter un labyrinthe 3D.
    Sauf que je bloque avec OpenGL, devant passer d'OpenGL1 à une nouvelle version d'OpenGL.

    L'étape sur laquelle je suis, c'est d'afficher des boîtes (symbolisant l'existence d'un mur).
    Je me suis donc inspiré de l'exemple ici : https://doc.qt.io/qt-6/qtopengl-textures-example.html, avec la compréhension des matrices ici : https://opengl.developpez.com/tutoriels/opengl-tutorial/3-matrices/.
    Côté code, j'en suis arrivé à ce niveau sur GitHub : https://github.com/Julien-Livet/Labyrinth.

    Le projet "testLabyrinth3d.pro" permet d'illustrer le problème que j'ai. La génération du labyrinthe se fait bien, c'est au niveau de l'affichage OpenGL que je ne vois pas ce que je fais de mal, m'attendant à voir une perspective avec des boîtes autour de moi.

    Je suis preneur de vos avis pour m'aider à avancer sur ce problème, en espérant que ce ne soit pas grand chose.

    Merci d'avance pour votre aide ;-) ,

    P'tit Ju

    -
    Edité par P'tit Ju 6 juin 2024 à 13:00:25

    • Partager sur Facebook
    • Partager sur Twitter
    Le premier et meilleur outil de l'Homme reste encore et toujours son cerveau.
      5 juin 2024 à 19:24:12

      Je ne m'y connais clairement pas assez en OpenGL pour t'aider à résoudre ton soucis, mais je tique un petit peu en lisant "OpenGL2"

      On parle d'OpenGL moderne à partir d'OpenGL 3 qui n'est déjà pas tout jeune car sorti en 2008 et on a OpenGL 4 depuis 2010.

      l'API et la façon d'utiliser OpenGL a énormément changé depuis OpenGL2. Ca ne reglera peut-être pas ton problème d'utiliser une version moderne d'OpenGL, mais tu trouveras surement bien plus facilement de l'aide avec un code moderne

      • Partager sur Facebook
      • Partager sur Twitter
        5 juin 2024 à 19:32:11

        Quand je fais tourner ton programme, j'ai plein d'erreurs "QOpenGLTexture::setData() tried to set a null image"

        Ah. Ok. Le chemin vers les images code en dur dans le code...

        Ton code est beaucoup trop complexe/long pour qu'on passe du temps a le review pour trouver les problemes. Il faut que tu ecrives de tests et verifie que chaque classe et chaque fonction fait ce que tu pense qu'elle fait.

        -
        Edité par gbdivers 5 juin 2024 à 19:37:34

        • Partager sur Facebook
        • Partager sur Twitter
          5 juin 2024 à 20:49:07

          Je suis d'accord pour mettre en place des tests, c'est ce que j'essaye de faire de façon gauche sur ce projet.
          Je vais voir pour essayer de faire mieux.

          Le code en question est dans GlWidget.cpp.
          Dans initializeGL(), je créée autant de boîtes que de murs existants avec la fonction makeBox().
          Dans paintGL(), j'affiche tous les cubes précédemment créés et je place ma caméra au milieu du 1er espace vide dans le coin xyz 0, 0, 0 (donc un point interne dans le labyrinthe, non représenté dans les images ci-dessous).
          Quand on appuie sur les touches directionnelles (PageUp et PageDown sont sur z), je me déplace dans le labyrinthe et la caméra se met à jour dans la fonction précédente.

          Sur FreeCAD, la 3D que j'arrive à obtenir pour m'aider donne ça (avec et sans les murs extérieurs) :
          Labyrinthe 3D

          J'ai mis à jour le GitHub avec nouveau projet CodeBlocks pour tester OpenGL avec SFML.
          Les touches Haut, Bas, Droite, Gauche, Page haut et Page Bas permettent de se déplacer d'une case suivant x, y, z.
          Les combiner avec la touche Maj permet de faire des rotations de +/-90 degrés autour de x, y, z.
          J'arrive à obtenir un affichage un peu meilleur (cf. ci-dessous) mais je ne vois pas ce qui cloche...
          Ma matrice de pose est mal définie ? Pourtant, il me semble la placer au bon endroit avec les calculs (au centre d'une case).

          EDIT : J'ai pu corriger le code OpenGL/SFML pour que ça fonctionne. Il ne me reste plus qu'à transposer avec le code OpenGL/Qt :-) .

          Dans le projet SFML, il arrive de temps en temps qu'un bug d'affichage arrive mais je ne sais pas d'où ça vient non plus.

          Les codes d'erreur d'OpenGL étant par exemple les suivants (pas de codes correspondant à la documentation...) :

          2076822352
          2076819520
          2076839344
          2076808608
          2076813856
          2076816688
          2076813856
          2076833680



          -
          Edité par P'tit Ju 7 juin 2024 à 20:47:20

          • Partager sur Facebook
          • Partager sur Twitter
          Le premier et meilleur outil de l'Homme reste encore et toujours son cerveau.
            9 juin 2024 à 21:06:14

            Bonsoir tout le monde,

            J'ai pu avancer sur le sujet, j'avais bien un problème de matrice de transformation sur ma caméra et un bind de VBO pour les triangles des différentes boîtes à faire. Je constate quand même un léger bug d'affichage sur des boîtes transparentes représentant la trace laissée par le joueur (cf. image ci-dessous).

            Concernant le bug OpenGL avec la SMFL, j'ai créé une bonne fois pour toutes les blocs, plutôt que d'en créer sur la pile lors d'un appel de fonctions. Du coup, je ne constate plus de problème.

            EDIT : J'ai trouvé la source du bug d'affichage ci-dessus (un mauvais indice de boucle).

            -
            Edité par P'tit Ju 10 juin 2024 à 20:24:46

            • Partager sur Facebook
            • Partager sur Twitter
            Le premier et meilleur outil de l'Homme reste encore et toujours son cerveau.

            Qt6 OpenGL Affichage de boîtes

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            • Editeur
            • Markdown