Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: [Resolu] Problème de rotation, OpenGL  (Lu 2601 fois)

0 Membres et 1 Invité sur ce sujet

Reycan

  • Newbie
  • *
  • Messages: 49
    • Voir le profil
[Resolu] Problème de rotation, OpenGL
« le: Septembre 07, 2013, 08:52:21 am »
Bonjour,

J'ai un problème avec mes rotations. Elles ne s'effectuent que sur un demi-cercle. J'ai implémenté une classe Transform3D et en pensant que l'erreur venaient de là, je l'ai désactivée pour tester mes rotations directement avec les fonctions glRotated d'OpenGL. Mais le soucis persiste.

Voici ma configuration OpenGL qui est assez minimal :

void GLContext::resetGLStates() const
{
    glMatrixMode(GL_PROJECTION);    // La matrice courante devient la matrice de projection
    glLoadIdentity();               // initialise la matrice courante

    //glLoadMatrixf(mView3D.getTransform3D().getMatrix());
    glOrtho(0,1024,768,0,0,500);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

}
 

Ensuite ma fonction draw :

void SkeletonMD5::draw(sf::RenderTarget& target, RenderGLStates states3D) const
{
    if(m_modelMD5)
    {
        //glLoadMatrixf(states3D.transform3D.getMatrix());

        // Test avec les glTransfo
        glLoadIdentity();

        glTranslated(500,500,0);

        glRotated(135,0,1,0);

        glRotated(90,1,0,0);
        //**********************

        glEnable(GL_TEXTURE_2D);
        glBindTexture(GL_TEXTURE_2D, m_texture->getTextureID());

        glEnableClientState (GL_VERTEX_ARRAY); // activer le tableau pour la position des sommets
        glEnableClientState (GL_TEXTURE_COORD_ARRAY); // activer le tableau pour les coordonnées de texture des sommets
        glEnableClientState (GL_NORMAL_ARRAY); // activer le tableau des normales

        vector<mesh> meshes = m_modelMD5->getMeshes();
        Skeleton skeleton = m_modelMD5->getSkeleton();

        // Dessiner le modèle
        for (int i = 0; i < m_modelMD5->getNumMeshes(); ++i)
        {
            prepareMesh(i,meshes,skeleton); // calculer la position des sommets à partir des vertex weights

            glVertexPointer (3, GL_FLOAT, 0, &meshes[i].vertexArray[0]);

            glTexCoordPointer(2, GL_FLOAT, 0, &meshes[i].textureArray[0]);

            glNormalPointer(GL_FLOAT, 0, &meshes[i].normaleArray[0]);

            glDrawElements (GL_TRIANGLES, meshes[i].numTris * 3,
                            GL_UNSIGNED_INT, &meshes[i].vertexIndices[0]);
        }

        glDisableClientState (GL_VERTEX_ARRAY);
        glDisableClientState (GL_TEXTURE_COORD_ARRAY);
        glDisableClientState (GL_NORMAL_ARRAY);
    }
}
 

Resultat de l'affichage en modifiant les paramètres de la rotation sur l'axe Y :

glRotated(45,0,1,0) :



glRotated(90,0,1,0) :



glRotated (135,0,1,0) : ( le personnage ne tourne jamais le dos  :'( )



J'ai déjà utilisé mon loader MD5 et j'utilise cette même boucle for pour dessiner mes modèles dans un très ancien projet et je sais que j'ai déjà sû les faire tourner correctement. Enfin, ça m'énerve, je vois pas du tout ce qui cloche. Si quelqu'un aurait une idée ?
« Modifié: Septembre 07, 2013, 04:56:22 pm par Reycan »

Reycan

  • Newbie
  • *
  • Messages: 49
    • Voir le profil
Re : Problème de rotation, OpenGL
« Réponse #1 le: Septembre 07, 2013, 09:10:18 am »
Bon au final, j'ai trouvé l'origine du problème. Et c'est bien ma vue que j'utilisais également dans une autre méthode. Je l'ai désactivé pour utiliser openGL directement avec glOrtho et ça marche.

void GLContext::applyCurrentView(const sf::Vector2u& windowSize) const
{
    sf::IntRect viewport = getViewPort(windowSize);
    int top = windowSize.y - (viewport.top + viewport.height);
    glViewport(viewport.left, top, viewport.width, viewport.height);

    // Set the projection matrix
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    //glLoadMatrixf(mView3D.getTransform3D().getMatrix());
    glOrtho(0,1024,768,0,0,500);

    // Go back to model-view mode
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

sf::IntRect GLContext::getViewPort(const sf::Vector2u& windowSize) const
{
    float width  = static_cast<float>(windowSize.x);
    float height = static_cast<float>(windowSize.y);
    const sf::FloatRect& viewport = mView3D.getViewport();

    return sf::IntRect(static_cast<int>(0.5f + width  * viewport.left),
                   static_cast<int>(0.5f + height * viewport.top),
                   static_cast<int>(width  * viewport.width),
                   static_cast<int>(height * viewport.height));
}
 



Voici ma méthode qui calcul la matrice de ma vue :

const Transform3D& View3D::getTransform3D() const
{
    if (!m_transformUpdated)
    {
        // Projection components
        float a =  2.f / m_size.x;
        float b = -2.f / m_size.y;
        float c = -2.f / (mFarVal - mNearVal);

        float d = -a * m_center.x;
        float e = -b * m_center.y;
        float f = -c * m_center.z;

        m_transform = Transform3D(a, 0, 0, d,
                                  0, b, 0, e,
                                  0, 0, c, f,
                                  0, 0, 0, 1);

        m_transformUpdated = true;
    }
    return m_transform;
}
 

Reycan

  • Newbie
  • *
  • Messages: 49
    • Voir le profil
Re : Problème de rotation, OpenGL
« Réponse #2 le: Septembre 07, 2013, 09:59:23 am »
Bon, j'ai trouvé et corrigé mon erreur :

if (!m_transformUpdated)
    {
        float a = 2.f / m_size.x;
        float b = -2.f / m_size.y;
        float c = -2.f / (mFarVal - mNearVal);

        float d = -a * m_center.x;
        float e = -b * m_center.y;
        float f = -((mFarVal + mNearVal) / (mFarVal - mNearVal));


        m_transform = Transform3D(a, 0, 0, d,
                                  0, b, 0, e,
                                  0, 0, c, f,
                                  0, 0, 0, 1);

        m_transformUpdated = true;
    }
    return m_transform;
 
« Modifié: Septembre 07, 2013, 10:21:08 am par Reycan »

Reycan

  • Newbie
  • *
  • Messages: 49
    • Voir le profil
Re : [Resolu] Problème de rotation, OpenGL
« Réponse #3 le: Septembre 07, 2013, 10:40:10 am »
Merde, ça ne marche pas, j'y ai cru car le screenshot est un peu découper mais en fesant une translation de -20 en Z, je revois mon perso avec la même rotation qu'à 45°  :'(

Reycan

  • Newbie
  • *
  • Messages: 49
    • Voir le profil
Re : Problème de rotation, OpenGL
« Réponse #4 le: Septembre 07, 2013, 04:56:11 pm »
C'est bon, la correction est bonne avec un exemple de code minimum. Et j'ai finalement retrouver un vieux glRotated qui traînait dans mon application.