IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GLUT Discussion :

Afficher une scène 3D avec glut - Opengl IMPOSSIBLE


Sujet :

GLUT

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 43
    Points : 29
    Points
    29
    Par défaut Afficher une scène 3D avec glut - Opengl IMPOSSIBLE
    Salut a tous,

    Après avoir combattu mille est une fois avec mon code j'ai céder!
    Je ne parviens pas a afficher une scène 3D chose facile sur le papier, mais sur le clavier c'est toute autre.


    Texture.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    #include "Texture.h"
    #include <iostream>
    #include <string.h>
     
    /*
    #include <fstream>
    #include <cstdlib>
    #include <cstdio>
    */
     
    Texture::Texture(void* data, int w, int h, int format){
     
    	glGenTextures(1, &textureID);
     
    	glBindTexture(GL_TEXTURE_2D, textureID);
     
    	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h , 0, format, GL_UNSIGNED_BYTE, data);
     
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    	glBindTexture(GL_TEXTURE_2D, 0);
    }
     
    Texture* Texture::loadBMP(const char* filename){
    	FILE* fp;
    	fp = fopen(filename, "rb");
     
    	if(!fp){
    		cout << filename << "\n erreur d'ouverture!\n" << endl;
    		fclose(fp);
    		return NULL;
    	}
     
    	char *headerField = new char[2];
    	fread(headerField, 2, sizeof(char), fp);
    	if(strcmp(headerField, "BM")){
            delete [] headerField;
            cout << "\nLe fichier n'est pas un bitmap!\n" << endl;
    		fclose(fp);
    		return NULL;
        }
     
        delete [] headerField;
     
        unsigned int bmpDataLocation;
     
        unsigned int bmpWidth;
        unsigned int bmpHeight;
     
        unsigned short numColorPlanes;
        unsigned short bitsPerPixel;
     
        unsigned int compressionMethod;
        unsigned int bmpDataSize;
     
        fseek(fp, 0x000a, SEEK_SET);
        fread(&bmpDataLocation, 1, sizeof(unsigned int), fp);
     
        fseek(fp, 0x0012, SEEK_SET);
        fread(&bmpWidth, 1, sizeof(unsigned int), fp);
     
        fread(&bmpHeight, 1, sizeof(unsigned int), fp);
        fread(&numColorPlanes, 1, sizeof(unsigned short), fp);
        fread(&bitsPerPixel, 1, sizeof(unsigned short), fp);
        fread(&compressionMethod, 1, sizeof(unsigned int), fp);
        fread(&bmpDataSize, 1, sizeof(unsigned int), fp);
     
        if(numColorPlanes != 1 || bitsPerPixel != 24 || compressionMethod !=0){
            cout << "\nLe fichier n'est pas une Raw bmp24!\n" << endl;
    		fclose(fp);
    		return NULL;
        }
     
        unsigned char* bmpData = new unsigned char[bmpDataSize];
     
        fseek(fp, bmpDataLocation, SEEK_SET);
        fread(bmpData, bmpDataSize, sizeof(unsigned char), fp);
        fclose(fp);
        return new Texture(bmpData, bmpWidth, bmpHeight, GL_RGB);
     
     
    }
    Texture.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <iostream>
    #include <GL/gl.h>
     
    using namespace std;
     
    class Texture{
     
    public:
    	unsigned int textureID;
     
    public:
    	Texture(void *data, int w, int h, int format);
    	static Texture* loadBMP(const char* filename);
    };

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    void Display_Quads()
    {
        inputActions();
     
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);	// la Fonction "glclear" permet de nettoyer les buffers
        glLoadIdentity();				    // Réinitialiser la matrice de transformation.
        //glTranslatef(0.0f,0.0f,-5.0f);
        //glRotatef(rot,0.0f,1.0f,0.0f);	// Tourner le cube sur X, Y, et Z
     
        //Transformations du Camera
        glRotatef(Camera::rotation.x, 1.0f, 0.0f, 0.0f);
        glRotatef(Camera::rotation.y, 0.0f, 1.0f, 0.0f);
        glRotatef(Camera::rotation.z, 0.0f, 0.0f, 1.0f);
        glTranslatef(-Camera::position.x, -Camera::position.y, -Camera::position.z);
     
        glBindTexture(GL_TEXTURE_2D, text->textureID);
     
        glBegin(GL_QUADS);
        glColor3f(1, 1, 1);
     
        glTexCoord2f(100, 100);
        glVertex3f(100, 0, 100);
     
        glTexCoord2f(-100, 100);
        glVertex3f(-100, 0, 100);
     
        glTexCoord2f(-100, -100);
        glVertex3f(-100, 0, -100);
     
        glTexCoord2f(100, -100);
        glVertex3f(100, 0, -100);
     
        glEnd();
     
     
        glBindTexture(GL_TEXTURE_2D, 0);
     
        // En mode double buffer, vide le tampon image à l’écran
        glutSwapBuffers();
    }


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    int main(int argc, char **argv)
    {
        glutInit(&argc, argv);
        /* Definit le mode d'affichage:  Couleur RGB -  Double buffering [Pour optimiser l'affichage] */
        glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
        /* Definit la taille de la fenetre */
        glutInitWindowSize(WINDOW_WIDTH, WINDOW_HEIGHT);
        /* Definit la position de la fenetre */
        glutInitWindowPosition(100, 100);
        /* Definit le nom de la fenetre */
        glutCreateWindow(WINDOW_TITLE);
     
        /* Indique la fonction à utiliser lors de l’affichage graphique.. */
        glutDisplayFunc(Display_Quads);
        /*  La fonction glutIdleFunc est lancée lorsque le système n’a plus rien à faire
            (affichage terminé, pas d’évènements clavier). Elle sert à faire des animations */
        glutIdleFunc(Display_Quads);
     
        /* La fonction "ReshapeFunc" est appelee pour le redimentionnement de la fenetre. */
        glutReshapeFunc(reshape);
        /* La fonction "KeyboardFunc" est appelee quand un evenement clavier est detecter. */
        //glutKeyboardFunc(keyboard);
     
        /* La fonction "Init" permet l'initialisation de GL. */
        Init();
     
        /* La fonction "glutKeyboardFunc" permet la saisit. */
        glutKeyboardFunc(Keyboard::keyDown);
        glutKeyboardUpFunc(Keyboard::keyUp);
     
        glutMotionFunc(Mouse::move);
        glutPassiveMotionFunc(Mouse::move);
     
        //Enable Features
        glEnable(GL_DEPTH_TEST);
        glEnable(GL_TEXTURE_2D);
     
        //Setup Content
     
        text = Texture::loadBMP("tiles_1.bmp");
        if(!text){
            return 1;
        }
        Camera::position.y = 1;
        /* La fonction "MainLoop" boucle principale de gestion des evenements */
        glutMainLoop();
     
        return 0;
    }

    Donc si une personne parviens à me dire pourquoi ce code ne veut pas être dresser comme il ce doit !!!

    Merci de votre aide

    ps: Sa compile, sa affiche le terminale avec le message suivant erreur ouverture, j'utilise codeBlocks

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,

    Si tu as un tant soit peu compris le code que tu as écris, l'erreur devrait pourtant te sauter au yeux : De toute évidence, ton application n'arrive purement et simplement pas à charger le fichier "tiles_1.bmp".

    La raison la plus vraisemblable de cette erreur est très certainement due:
    1. à une erreur dans le nom du fichier
    2. au fait que le fichier bmp ne se trouve pas dans le même dossier que l'application
    3. au fait que l'application n'est peut être pas lancée depuis le bon dossier
    La première raison me semblant peu vraisemblable, il ne reste que la deuxième et la troisième possibilité à explorer:

    Il faut savoir que la plupart des EDI créent un (des) sous dossier(s) dans lesquels ils placeront les exécutables générés, et qu'ils les lancent, généralement depuis ce dossier particulier si l'on ne leur dit pas de faire autrement.

    Tu as donc trois possibilités, il te revient de déterminer laquelle est la meilleure :
    1. copier l'exécutable généré dans le dossier dans lequel se trouve effectivement le fichier tiles_1.bmp
    2. copier le fichier tiles_1.bmp dans le dossier dans lequel se trouve effectivement l'exécutable généré
    3. configurer ton EDI pour faire en sorte qu'il lance l'application depuis le dossier dans lequel se trouve le fichier tiles_1.bmp
    Tu peux aussi envisager de définir un chemin d'accès relatif permettant de trouver le fichier devant être lu au départ d'un dossier "particulier".

    Mais il faut sans doute pousser la réflexion un peu plus loin, dans le sens où, sur un projet d'envergure, tu te retrouveras sans doute avec de nombreuses textures et avec plein d'autres choses qu'il faudra envisager de charger d'une manière générale. Il sera sans doute pas mal/ utile / nécessaire d'organiser tous ces fichiers de manière un tant soit peu rationnelle pour te faciliter la vie au niveau de leur gestion.

    En outre, il n'est pas impossible d'envisager que certains fichiers particuliers doivent tous être chargés en même temps, et qu'il sera peut-être plus facile de faire une boucle qui se charge de charger "tous les fichiers qui se trouvent dans un dossier spécifique". Et bien sur, il serait en outre pas si mal que cela de réfléchir à l'organisation des fichiers tels qu'ils seront installés si ton application est mise à disposition du public.

    Ce sont autant de "détails" auxquels tu devrait réfléchir le plus rapidement possible afin de déterminer la meilleure des solutions à mettre en oeuvre pour t'assurer que ton application trouvera effectivement les fichiers dont elle a besoin

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 43
    Points : 29
    Points
    29
    Par défaut



    Voici mon dossier ou ce trouve l'image en question:

    devrais je le mettre dans un dossier spéciale genre image

    Et pour le chemin soit doit être relatif ou absolue:

    text = Texture::loadBMP("image\tiles_1.bmp");
    text = Texture::loadBMP("image/tiles_1.bmp");

    ps: j'ai essaye ces 2 methode mais sa ne marche pas je ne sais pas ce que veut codeBlocks de plus ?

    image/tiles_1.bmp
    image\tiles_1.bmp


    Merci encore de tes explications
    Images attachées Images attachées  

  4. #4
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Hello,

    Il y à un "tiles.bmp" et un tiles_2.bmp" dans ton dossier, tu essaie de charger un fichier nommé "tiles_1.bmp".

    Les chemins sont relatifs et les antislashs doivent être échappés
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    std::string path = "tiles_1.bmp"; // dans le dossier courant
    std::string path = "images\\tiles_1.bmp"; // dans un sous dossier
    std::string path = "C:\\tiles_1.bmp"; // chemin absolu

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Ah oui, mais bon!!!

    Selon ton code d'orgine, la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    text = Texture::loadBMP("tiles_1.bmp");
    demande de charger la texture tiles_1.bmp.

    Au niveau des images, tu disposes de "tiles.bmp" et de "tiles_2.bmp", mais il n'y a aucune trace d'un fichier "tiles_1.bmp". Heu... est ce que cela t'étonne vraiment que l'application ne trouve pas un fichier... inexistant

    Sinon, pour indiquer à C::B dans quel dossier il doit se placer pour lancer ton application, tu peux aller jeter un oeil dans projet->propriétés (ou clique droit sur le projet->propriétés) -> onglet "buid target".

    Le champs "execution working dir" permet d'indiquer le dossier dans lequel C::B se place pour lancer l'application. Par défaut, c'est . (autrement dit, le dossier courent du projet). C'est parfois correct, parfois pas, tout dépend de la manière dont les dossiers sont organisés

Discussions similaires

  1. Afficher une image JPEG avec le composant TJPEGImage
    Par BigMike dans le forum C++Builder
    Réponses: 4
    Dernier message: 13/07/2006, 15h21
  2. Réponses: 5
    Dernier message: 13/04/2006, 22h54
  3. Afficher une matrice 3d avec OpenGl
    Par kmaniche dans le forum OpenGL
    Réponses: 9
    Dernier message: 03/02/2006, 13h21
  4. Afficher une requete MYSQL avec jointure
    Par Higestromm dans le forum Requêtes
    Réponses: 8
    Dernier message: 18/12/2005, 15h52
  5. Charger et afficher une image jpg avec les mfc
    Par glop - pas glop dans le forum MFC
    Réponses: 3
    Dernier message: 11/02/2004, 18h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo