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

OpenGL Discussion :

chargement de modèle avec Assimp : rendu bizarre dans certains cas


Sujet :

OpenGL

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2007
    Messages : 61
    Points : 30
    Points
    30
    Par défaut chargement de modèle avec Assimp : rendu bizarre dans certains cas
    Bonjour,

    Je suis en train de me battre avec Assimp, une librairie de chargement de modèle qui prend en charge pas mal de format.

    Une fois un modèle chargé à l'aide de cette librairie, j'arrive à les afficher dans la plupart des cas, mais dans certains cas, une partie du modèle est rendu en noir et il est "attaché" par un point au centre de ma fenêtre. c'est donc très gênant. Forcement je ne vois pas du tout pourquoi ça fait. Donc un petit coup de main serait grandement apprécié.

    un modèle rendu correctement :


    Un exemple d'un cas problématique :


    C'est un peu long, mais je vous mets le code qui me parait important :

    à noter, le rendu se fait à l'aide de VBO et de shaders (très basique) dans un environnement OpenGL/Qt.

    le chargement du modèle :
    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
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
     
    bool Modele::loadGlresources(const aiScene *scene)
    {
        m_scene = scene;
     
        //adapte le tableau contenant les indices des VBO au nombre de mesh
        m_info_rendu.resize(scene->mNumMeshes);
     
        //on crée un VBO pour chaque mesh
        for(unsigned int i = 0; i < scene->mNumMeshes; i++)
        {
            aiMesh* mesh = scene->mMeshes[i];
     
            //structure recevant les indices, ....
            g_resources infoMesh;
     
            infoMesh.mesh = mesh;
     
            // Gestion des matériaux
            unsigned int numMaterial = mesh->mMaterialIndex;
            if(scene->HasMaterials() && (numMaterial <= scene->mNumMaterials))
            {
                //gestion de la texture
                //nom de la texture
                aiString cheminTex;
     
                if(AI_SUCCESS == material->GetTexture(aiTextureType_DIFFUSE, 0, &cheminTex))
                {
                    //conversion aiString to std::string
                    std::string nomTex;
                    for(size_t k = 0; k < cheminTex.length; k++)
                    {
                        nomTex += cheminTex.data[k];
                    }
                    //construction du chemin absolu de l'image
                    QDir cheminAppli;
                    QString cheminImage = cheminAppli.absolutePath() + "/modeles/" + nomTex.c_str();
     
                    infoMesh.texture = m_RenduModele->loadTexture(cheminImage);
     
                    infoMesh.hasTexture = true;
                }
                else
                    infoMesh.hasTexture = false;
            }
            else
            {
                infoMesh.hasTexture = false;
                //couleur par defaut
                infoMesh.couleur = glm::vec4(1.0f, 0.0f, 0.0f, 1.0f);
            }
     
            // création du buffer pour les position, normals, texCoord
            infoMesh.vertex_buffer = new QGLBuffer(QGLBuffer::VertexBuffer);
            if(infoMesh.vertex_buffer->create())
            {
                infoMesh.vertex_buffer->bind();
                infoMesh.vertex_buffer->setUsagePattern(QGLBuffer::DynamicDraw);
                //tableau temporaire contenant les infos
                info_vertex *attributes = (info_vertex *)malloc(mesh->mNumVertices * sizeof(info_vertex));
                for(unsigned int j = 0; j < mesh->mNumVertices; j++)
                {
                    attributes[j].position.x = mesh->mVertices[j].x;
                    attributes[j].position.y = mesh->mVertices[j].y;
                    attributes[j].position.z = mesh->mVertices[j].z;
                    attributes[j].position.w = 1.0f;
     
                    if(mesh->HasNormals())
                    {
                        attributes[j].normal.x = mesh->mNormals[j].x;
                        attributes[j].normal.y = mesh->mNormals[j].y;
                        attributes[j].normal.z = mesh->mNormals[j].z;
                        attributes[j].normal.w = 1.0f;
                    }
                    else
                    {
                        attributes[j].normal = glm::vec4(0.0f, 0.0f, 0.0f, 0.0f);
                    }
     
                    if(mesh->HasVertexColors(0))
                    {
                        infoMesh.hasColors = true;
                        attributes[j].couleur.r = mesh->mColors[0][j].r;
                        attributes[j].couleur.g = mesh->mColors[0][j].g;
                        attributes[j].couleur.b = mesh->mColors[0][j].b;
                        attributes[j].couleur.a = 1.0f;
                    }
                    else
                    {
                        attributes[j].couleur = glm::vec4(0.0f, 0.0f, 0.0f, 1.0f);
                    }
     
                    if(mesh->HasTextureCoords(0))
                    {
                        attributes[j].texCoord.x = mesh->mTextureCoords[0][j].x;
                        attributes[j].texCoord.y = mesh->mTextureCoords[0][j].y;
                    }
                    else
                    {
                        attributes[j].texCoord = glm::vec2(0.0, 0.0);
                    }
                }
                //on envoie les données au VBO
                infoMesh.vertex_buffer->allocate(attributes, mesh->mNumVertices * sizeof(info_vertex));
     
    			GLsizei stride = sizeof(info_vertex);
                infoMesh.in.position = m_RenduModele->m_program.attributeLocation("position");
                m_RenduModele->m_program.setAttributeBuffer(infoMesh.in.position, GL_FLOAT, (int)offsetof(info_vertex, position), 4, stride);
     
                infoMesh.in.normal = m_RenduModele->m_program.attributeLocation("normal");
                m_RenduModele->m_program.setAttributeBuffer(infoMesh.in.normal, GL_FLOAT, (int)offsetof(info_vertex, normal), 4, stride);
     
                infoMesh.in.texCoord = m_RenduModele->m_program.attributeLocation("texCoord");
                m_RenduModele->m_program.setAttributeBuffer(infoMesh.in.texCoord, GL_FLOAT, (int)offsetof(info_vertex, texCoord), 2, stride);
     
                infoMesh.in.couleur = m_RenduModele->m_program.attributeLocation("couleur");
                m_RenduModele->m_program.setAttributeBuffer(infoMesh.in.couleur, GL_FLOAT, (int)offsetof(info_vertex, couleur), 4, stride);
     
                infoMesh.vertex_buffer->release();
     
                m_RenduModele->m_program.release();
     
                free(attributes);
     
            }
            else
                return false;
     
            //Création des indices
            infoMesh.element_buffer = new QGLBuffer(QGLBuffer::IndexBuffer);
            if(infoMesh.element_buffer->create())
            {
                infoMesh.element_buffer->bind();
     
                //tableau temporaire
                element *indices = (element *)malloc(mesh->mNumFaces * 3 * sizeof(element));
     
                //on parcourt les faces
                unsigned int count = 0;
                for(unsigned int p = 0; p < mesh->mNumFaces; p++)
                {
                    indices[count].element = mesh->mFaces[p].mIndices[0];
                    indices[count + 1].element = mesh->mFaces[p].mIndices[1];
                    indices[count + 2].element = mesh->mFaces[p].mIndices[2];
                    count += 3;
                }
                //on charge les indices
                infoMesh.element_buffer->allocate(indices, mesh->mNumFaces * 3 * sizeof(element));
                infoMesh.count = mesh->mNumFaces * 3;
     
                free(indices);
            }
     
            //on sauvegarde à l'indice du mesh
            m_info_rendu[i] = infoMesh;
            //on augmente le nombre de mesh
            m_nbMesh++;
        }
        return true;
    }
    l'affichage :
    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
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
     
    void RenduModele::renderModele()
    {
        //on récupère un pointeur vers le modèle en cours
        Modele *modele = m_gestionModele->getModele();
        //le node racine de ce modèle
        aiNode *rootNode = modele->getScene()->mRootNode;
        //matrice de transformation de la racine
        aiMatrix4x4 matriceRacine = rootNode->mTransformation;
        renderModeleRec(modele, rootNode, matriceRacine);
    }
     
    void RenduModele::renderModeleRec(Modele *modele, aiNode *node, aiMatrix4x4 matriceNode)
    {
        //on dessine chaque mesh pour ce noeud avec la matrice de transformation de ce noeud
        for(unsigned int i = 0; i < node->mNumMeshes; i++)
    	{
    		renderModeleMesh(modele, node->mMeshes[i], matriceNode);
    	}
     
        //puis on rappelle cette fonction pour chaque enfant de ce noeud
    	for(unsigned int i = 0; i < node->mNumChildren; i++)
    	{
    	    //on concatène la matrice des parents avec celle des enfants
    	    aiMatrix4x4 matriceEnfant = matriceNode * node->mChildren[i]->mTransformation;
    		renderModeleRec(modele, node->mChildren[i], matriceEnfant);
    	}
    }
     
    void RenduModele::renderModeleMesh(Modele *modele, unsigned int numMesh, aiMatrix4x4 aiMatriceNode)
    {
        m_program.bind();
     
        glm::mat4 matriceNode;
        aiMat4toMat4(aiMatriceNode, matriceNode);
     
        //prise ne compte des transformations de la caméra
        glm::mat4 matrixMP = m_camera->getProjectionMatrix() * m_camera->getModelViewMatrix() * matriceNode;
     
        //conversion glm::mat4 en QMatrix4x4
        QMatrix4x4 mvp;
        mat4toQmat4(matrixMP, mvp);
     
        //récupère les infos pour le mesh à afficher
        g_resources infos = modele->m_info_rendu[numMesh];
     
        m_program.setUniformValue(infos.uniform.MVP, mvp);
     
        m_program.setUniformValue(infos.uniform.lightDirection, QVector4D(0.0, 1.0, 1.0, 1.0));
     
        //texture ?
        if(infos.hasTexture)
        {
            glEnable(GL_TEXTURE_2D);
            glBindTexture(GL_TEXTURE_2D, infos.texture);
            m_program.setUniformValue(infos.uniform.hasTexture, 1.0f);
        }
        else
        {
            glBindTexture(GL_TEXTURE_2D, 0);
            m_program.setUniformValue(infos.uniform.hasTexture, 0.0f);
        }
     
        //couleur global pour le mesh
        if(!infos.hasColors)
        {
            m_program.setUniformValue(infos.uniform.hasColors, 0.0f);
            m_program.setUniformValue(infos.uniform.couleurMesh, infos.couleur.r, infos.couleur.g, infos.couleur.b, infos.couleur.a);
        }
        else //couleur par vertex
        {
            m_program.setUniformValue(infos.uniform.hasColors, 1.0f);
        }
     
        //bind le vbo contenant vertex
        infos.vertex_buffer->bind();
     
        m_program.enableAttributeArray(infos.in.position);
        m_program.enableAttributeArray(infos.in.normal);
        m_program.enableAttributeArray(infos.in.texCoord);
        m_program.enableAttributeArray(infos.in.couleur);
     
        infos.vertex_buffer->release();
     
        //bind les elements
        infos.element_buffer->bind();
        glDrawElements(GL_TRIANGLES, infos.count, GL_UNSIGNED_INT, NULL);
        infos.element_buffer->release();
     
        //on libère
        m_program.disableAttributeArray(infos.in.position);
        m_program.disableAttributeArray(infos.in.normal);
        m_program.disableAttributeArray(infos.in.texCoord);
        m_program.disableAttributeArray(infos.in.couleur);
     
        m_program.release();
    }
    Désolée pour le pavé de code, mais je vois pas du tout où peut-être l'erreur. Merci d'avance pour ceux qui auront le courage de lire cela.

  2. #2
    Membre habitué Avatar de Kromagg
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2008
    Messages : 275
    Points : 198
    Points
    198
    Par défaut
    Bonjour laurencew

    Je ne connais pas du tout cette librairie, je ne pourrais t'être d'aucune utilité. Par contre pourrais-tu me donner ton avis sur cette dernière ? J'aimerai l'utiliser dans un moteur de rendu avec le format COLLADA

    Kromagg
    C'est dans ses rêves que l'homme trouve la liberté cela fut, est et restera la vérité! (John Keating - Le cercle des poètes disparus)

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2007
    Messages : 61
    Points : 30
    Points
    30
    Par défaut
    Pour l'instant j'en suis plutôt contente à part le problème évoqué.

    C'est vraiment sympa de pouvoir charger des modèles dans un nombre aussi important de formats. Pour ma part, j'ai pu pour l'instant afficher des modèles au format obj, 3ds, milkshape et collada.

    La doc est assez complète et il y a un forum spécifique sur sourceforge.

    remarque : je ne recommande pas de se servir de la dernière version dispo sur svn, j'ai perdu deux jours à essayer d'accéder aux indices des faces et aux coordonnées de texture (qui provoquait un seg fault) alors que toutes les autres infos (position, normal,...) étaient correctes. Problème résolu sans modifier mon code quand je suis passé à la dernière version stable.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Il faut que tu vois le sens des faces au moment de modeliser tes objets, j'ai eu souvent des problèmes à cause de ça.

    ça ne t'aidera certainement pas, c'est juste une piste.

  5. #5
    Membre habitué Avatar de Kromagg
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2008
    Messages : 275
    Points : 198
    Points
    198
    Par défaut
    Bonjour laurencew

    J'ai commencé l'implémentation des VBO avec Assimp mais j'ai remarqué que la librairie contient en interne plusieurs fois le même sommet pour un mesh donné. Si je prend le simple exemple d'un cube je me retrouve avec 2-3 fois le même vertex dans la structure Assimp. Qu'en penses-tu ?

    Kromagg
    C'est dans ses rêves que l'homme trouve la liberté cela fut, est et restera la vérité! (John Keating - Le cercle des poètes disparus)

  6. #6
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2007
    Messages : 61
    Points : 30
    Points
    30
    Par défaut
    Pour ce que tu dis aryanwolf je pense pas que ça vienne des objets/modèles car quand je les regarde à l'aide d'un viewer (G3Dviewer) il les affiche correctement. L'erreur doit être dans mon code, mais je vois pas trop où chercher et je ne comprends pas trop pourquoi ça marche pour certains et pas d'autres.

    Kromagg, je n'ai pas regardé dans le détail ce que contient la structure de données fournie par Assimp une fois un modèle chargé car je travaille avec des objets contenant des centaines/milliers de sommets. Mais je sais qu'il y a des options que tu peux activer pour qu'Assimp réalise des opérations d'optimisation en post-chargement. Parmi elles il y en a une qui permet de joindre les sommets identiques (aiProcess_JoinIdenticalVertices), voir http://assimp.sourceforge.net/lib_ht...3dc1be4f52e410

    Dans ton cas, tu veux dire qu'il ne sont pas présents dans la description de l'objet et que c'est Assimp qui les duplique ? Est-ce que l'option que je t'indique améliore les choses ou tu t'en sers peut-être déjà ?

  7. #7
    Membre habitué Avatar de Kromagg
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2008
    Messages : 275
    Points : 198
    Points
    198
    Par défaut
    Citation Envoyé par laurencew Voir le message
    Mais je sais qu'il y a des options que tu peux activer pour qu'Assimp réalise des opérations d'optimisation en post-chargement. Parmi elles il y en a une qui permet de joindre les sommets identiques (aiProcess_JoinIdenticalVertices)
    J'utilise déjà ce flag de chargement .

    Citation Envoyé par laurencew Voir le message
    Dans ton cas, tu veux dire qu'il ne sont pas présents dans la description de l'objet et que c'est Assimp qui les duplique ? Est-ce que l'option que je t'indique améliore les choses ou tu t'en sers peut-être déjà ?
    En effet Assimp stocke en interne plusieurs fois le même vertices. Par exemple avec un cube je me retrouve avec 24 vertices au lieu de 8. C'est très embêtant surtout au niveau du stockage et des performances, qui plus est pour les meshs lourd en vertices)

    Kromagg
    C'est dans ses rêves que l'homme trouve la liberté cela fut, est et restera la vérité! (John Keating - Le cercle des poètes disparus)

  8. #8
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 045
    Points : 11 368
    Points
    11 368
    Billets dans le blog
    10
    Par défaut
    En fait c'est logique car un vertex ne peut avoir qu'une seule normale et un seul UV. Donc pour pouvoir assigner une texture par face de ton cube, il faut avoir une intance de chaque vertex pour chaque face, d'où les 24 vertex pour un cube.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  9. #9
    Membre habitué Avatar de Kromagg
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2008
    Messages : 275
    Points : 198
    Points
    198
    Par défaut
    Citation Envoyé par dragonjoker59 Voir le message
    En fait c'est logique car un vertex ne peut avoir qu'une seule normale et un seul UV. Donc pour pouvoir assigner une texture par face de ton cube, il faut avoir une intance de chaque vertex pour chaque face, d'où les 24 vertex pour un cube.
    Mais justement Assimp devrait en interne stocker une instance de chaque vertex, normale et coordonnées de texture ainsi que les indices. Ensuite c'est à l'utilisateur final d'instancier correctement sa géométrie en fonction des indices.

    Kromagg
    C'est dans ses rêves que l'homme trouve la liberté cela fut, est et restera la vérité! (John Keating - Le cercle des poètes disparus)

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Université de Technologie de Compiègne
    Inscrit en
    Mai 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Université de Technologie de Compiègne

    Informations forums :
    Inscription : Mai 2011
    Messages : 15
    Points : 38
    Points
    38
    Par défaut
    Bonjour,

    Un vertex étant un ensemble [position, couleur, coordonnée de texture, ...], si l'une des composantes change (ex: la couleur) alors il c'est considéré comme un nouveau vertex: il faut donc ajouter la position, la couleu, etc.

    Il me semble que tu ne peux pas dire:
    "Pour ce sommet, utilise la position 1, la couleur 7, la coordonnée de texture 42 ..."

  11. #11
    Membre habitué Avatar de Kromagg
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2008
    Messages : 275
    Points : 198
    Points
    198
    Par défaut
    Citation Envoyé par Kiwei Voir le message
    Il me semble que tu ne peux pas dire:
    "Pour ce sommet, utilise la position 1, la couleur 7, la coordonnée de texture 42 ..."
    Et bien justement si, d'où l'utilité des indices. Tu ne stocke qu'une seule fois le même vertex, couleur, coordonnées de textures... et tu accèdes à c'est différents composants à travers les indices. Ainsi un vertex n'est décrit qu'avec des indices (un pour chaque tableau de composantes)

    Kromagg
    C'est dans ses rêves que l'homme trouve la liberté cela fut, est et restera la vérité! (John Keating - Le cercle des poètes disparus)

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Université de Technologie de Compiègne
    Inscrit en
    Mai 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Université de Technologie de Compiègne

    Informations forums :
    Inscription : Mai 2011
    Messages : 15
    Points : 38
    Points
    38
    Par défaut
    Je suis curieux de savoir comment tu fais alors, car je ne connais pas du tout cette façon de faire. Pour moi, avec OpenGL, c'était quelque chose d'impossible. En gros, si tu as:

    pos[] = {p0, p1, p2, p3}
    col[] = {c0, c1, c2, c3}

    Si tu donnes "index 0" il va te prendre (p0, c0).
    Ainsi, si en 5-eme vertex tu souhaites avoir (p0, c1) il faut:

    pos[] = {p0, p1, p2, p3, p0}
    col[] = {c0, c1, c2, c3, c1}
    vertex[] = {0, 1, 2, 3, 4, 5}

    Enfin, c'est ce que je pense, après s'il existe une autre façon de faire j'aimerai bien la connaître.

  13. #13
    Membre habitué Avatar de Kromagg
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2008
    Messages : 275
    Points : 198
    Points
    198
    Par défaut
    Citation Envoyé par Kiwei Voir le message
    Je suis curieux de savoir comment tu fais alors, car je ne connais pas du tout cette façon de faire. Pour moi, avec OpenGL, c'était quelque chose d'impossible. En gros, si tu as:

    pos[] = {p0, p1, p2, p3}
    col[] = {c0, c1, c2, c3}

    Si tu donnes "index 0" il va te prendre (p0, c0).
    Ainsi, si en 5-eme vertex tu souhaites avoir (p0, c1) il faut:

    pos[] = {p0, p1, p2, p3, p0}
    col[] = {c0, c1, c2, c3, c1}
    vertex[] = {0, 1, 2, 3, 4, 5}

    Enfin, c'est ce que je pense, après s'il existe une autre façon de faire j'aimerai bien la connaître.
    Et bien il suffit pour chaque sommet de donné plusieurs indices, un qui contient l'indice du vertex dans le tableau de vertex et un autre qui contient l'indice de la couleur dans le tableau de couleur. C'est par exemple de cette manière que le format OBJ stocke les informations du mesh.
    http://fr.wikipedia.org/wiki/Objet_3..._de_fichier%29

    Kromagg
    C'est dans ses rêves que l'homme trouve la liberté cela fut, est et restera la vérité! (John Keating - Le cercle des poètes disparus)

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Université de Technologie de Compiègne
    Inscrit en
    Mai 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Université de Technologie de Compiègne

    Informations forums :
    Inscription : Mai 2011
    Messages : 15
    Points : 38
    Points
    38
    Par défaut
    Jusque là, je suis d'accord (pour le format OBJ).

    Je me suis heurté à ce problème lorsque j'ai implémenté un loader de fichier obj, le fait de ne pas pouvoir indexer les composantes indépendamment. En fait, je te demandais plus comment tu faisais avec l'API OpenGL pour faire ça, car si ça existe, je suis vraiment curieux d'apprendre comment on peut le faire.

    Pour moi tu peux en effet fournir plusieurs indices pour dire "pour cette face, utilise v1, v2, v3", mais {v1, v2, v3} sont des indices de sommets, et on en revient à ce que je disais plus haut.

  15. #15
    Membre habitué Avatar de Kromagg
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2008
    Messages : 275
    Points : 198
    Points
    198
    Par défaut
    Ah je crois que je t'ai mal compris depuis le début. En effet je ne pense pas que cela soit possible en OpenGL que ce soit avec les VBO ou autre (à confirmer)

    Citation Envoyé par Kiwei Voir le message

    pos[] = {p0, p1, p2, p3}
    col[] = {c0, c1, c2, c3}

    Si tu donnes "index 0" il va te prendre (p0, c0).
    Ainsi, si en 5-eme vertex tu souhaites avoir (p0, c1) il faut:

    pos[] = {p0, p1, p2, p3, p0}
    col[] = {c0, c1, c2, c3, c1}
    vertex[] = {0, 1, 2, 3, 4, 5}
    Je n'ai pas fait attention à cette partie mais j'aimerai savoir quel est l'intérêt d'avoir ton sommet avec 2 couleurs différentes. Au niveau du rendu comment tu vas dire à OpenGL d'afficher deux fois le même vertex exactement au même endroit mais avec deux couleurs différentes ? Qu'est ce que ça t'apportes exactement ?

    Kromagg
    C'est dans ses rêves que l'homme trouve la liberté cela fut, est et restera la vérité! (John Keating - Le cercle des poètes disparus)

  16. #16
    Nouveau membre du Club
    Homme Profil pro
    Université de Technologie de Compiègne
    Inscrit en
    Mai 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Université de Technologie de Compiègne

    Informations forums :
    Inscription : Mai 2011
    Messages : 15
    Points : 38
    Points
    38
    Par défaut
    Bon, ce qui me rassure, c'est que je ne suis pas passé à cotés d'une killer-feature d'OpenGL. Dans mon cas, c'était vraiment un exemple bateau, remplace couleur par normale ou coordonnée de texture, et ça a tout de suite plus d'intérêt.

  17. #17
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2007
    Messages : 61
    Points : 30
    Points
    30
    Par défaut
    Pour ma part je trouve que le fait qu'Assimp duplique certaines données est justement pas mal, ça permet de pas galérer à les remettre en forme et à dupliquer certaines données comme on doit être nombreux à avoir du le faire pour afficher des OBJ à l'aide de VBO.

    Bon sinon pour le problème initial j'ai toujours pas trouvé d'où ça venait. Je travaille maintenant sur une série de modèles qui s'affiche correctement et je n'ai pas le temps de me pencher plus là dessus car j'attaque la cinématique inverse...

  18. #18
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2011
    Messages : 36
    Points : 80
    Points
    80
    Par défaut
    Citation Envoyé par laurencew Voir le message
    je n'ai pas le temps de me pencher plus là dessus car j'attaque la cinématique inverse...
    Parce que je vois que tu es étudiante et par curiosité, tu fais ce projet dans le cadre scolaire ? Si oui, c'est quelle école ?
    Pace que vous avez pas l'air de chômer !

  19. #19
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2007
    Messages : 61
    Points : 30
    Points
    30
    Par défaut
    Oui c'est un projet dans le cadre de mes études. Je suis en M1 informatique, synthèse d'images et conception graphique à la fac de Limoges.

    On a un projet à réaliser au choix qui compte pas mal pour l'année et je me suis lancée dans un truc un peu gros à base d'animation de modèle avec squelette à l'aide de cinématique inverse.

Discussions similaires

  1. [Débutant] Boite de dialogue bizarre dans certains cas
    Par Attila54 dans le forum VB.NET
    Réponses: 35
    Dernier message: 07/12/2011, 17h16
  2. Empecher la validation dans certains cas ?
    Par elitost dans le forum Struts 1
    Réponses: 2
    Dernier message: 19/09/2006, 14h03
  3. Passer la validation Javascript dans certains cas
    Par tkino dans le forum Struts 1
    Réponses: 2
    Dernier message: 31/07/2006, 16h37
  4. [JOINTURES] interêt dans certain cas
    Par nicotine002 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 13/06/2006, 18h22
  5. [POO] Modèle objet: this inutilisable dans certains cas?
    Par vlord dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 13/08/2005, 11h41

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