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

Qt Discussion :

QMatrix4x4 et envoi au shader [2D/3D]


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    212
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2009
    Messages : 212
    Par défaut QMatrix4x4 et envoi au shader
    Bonjour,

    J'ai un petit soucis avec une application simple. Je visualise un triangle et je souhaite pouvoir le faire tourner sur les axes x, y et z. Pour ce faire j'ai 3 slots reliés à un QSlider pour changer les valeurs de mon angle (de 0 à 360 avec un pas de 10) sur chacun des axes. Seulement, lors de l'envoie des données au shader, la visualisation est quelque peu déroutante ... En effet, j'ai comme un effet de saut, je m'explique je change x de 0 à 10 et le sommet sur le plus haut diminue (ok jusque là) et je change de nouveau de 10 à 20 en théorie le sommet le plus haut devrait "baisser" mais il "remonte".

    Voici les bouts de code de ma classe (à savoir les angles sont initialisés à zéro dans le constructeur), les matrices sont de type QMatrix4x4:

    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
     
    void OpenGLView::render(){
     
        glClear(GL_COLOR_BUFFER_BIT);
        glClearColor(0.8, 0.8, 0.8, 1.0);
        //glClear(GL_CLEAR_BUFFER | GL_DEPTH_BUFFER_BIT);
     
        m_program->bind();
     
        glViewport(0, 0, this->size().width(), this->size().height());
     
        glUniformMatrix4fv(m_transfUniform, 1, GL_FALSE, m_transformation.data());
        glUniformMatrix4fv(m_projectionUniform, 1, GL_FALSE, m_projection.data());
        glVertexAttribPointer(m_vertexAttr, 3, GL_FLOAT, GL_FALSE, 0, m_vertices);
        glVertexAttribPointer(m_colorsUniform, 3, GL_FLOAT, GL_FALSE, 0, m_colors);
     
        glEnableVertexAttribArray(m_vertexAttr);
        glEnableVertexAttribArray(m_colorsUniform);
     
        glDrawArrays(GL_TRIANGLES,0,3);
     
        glDisableVertexAttribArray(m_vertexAttr);
        glDisableVertexAttribArray(m_colorsUniform);
     
        m_program->release();
    }
    Un des slots, sachant que j'ai la même chose sur y et z à peu de chose près :
    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
     
    void OpenGLView::setXRotation(int angle){
        m_xAngle = float(angle);
     
        qDebug() << "Angle" << m_xAngle;
     
        m_transformation.rotate(m_xAngle, 1.0, 0.0, 0.0);
        m_transformation = m_transformation.transposed();
     
        //Rotation initiale
        /*m_zRotation = setRotation(angle,0,0,1); // j'effectue ma rotation
        m_transformation = matrixProduct(m_xRotation, 4, 4, m_yRotation, 4, 4);// je multiplie les deux matrices x et y
        m_transformation = matrixProduct(m_transformation, 4, 4, m_zRotation, 4, 4);//je multiplie aussi par z pour prendre en compte tout les axes de rotation et avoir une seule matrice de rotation
        */
    }
    Une idée du problème ?

    ps : Je tiens à préciser que j'avais fait ma propre classe matrice (peu optimisé et avec peu de méthodes, d'où le fait de prendre une classe Qt), où ma rotation marchait (vous trouverez le code juste au dessus commenté).

  2. #2
    Membre confirmé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    212
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2009
    Messages : 212
    Par défaut
    Je viens d'essayer ceci, je pensais l'avoir fait plus tôt mais il faut croire que non puisque mon problème semble résolu Si quelqu'un pouvait me confirmer que c'est bon, quelque chose peut encore m'échapper.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void OpenGLView::setXRotation(int angle){
        m_transformation.setToIdentity();
        m_xAngle = float(angle);
        qDebug() << "Angle" << m_xAngle;
        m_transformation.rotate(m_xAngle, 1.0, 0.0, 0.0);
        m_transformation.rotate(m_yAngle, 0.0, 1.0, 0.0);
        m_transformation.rotate(m_zAngle, 0.0, 0.0, 1.0);
        m_transformation = m_transformation.transposed();
    }

  3. #3
    Membre chevronné Avatar de Jbx 2.0b
    Homme Profil pro
    Développeur C++/3D
    Inscrit en
    Septembre 2002
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur C++/3D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2002
    Messages : 477
    Par défaut
    Oui si tu ne redéfinit pas ta matrice de transformation comme identité, tu vas empiler à chaque fois tes transformations qui vont devenir de plus en plus importantes (d'ou les effets de saut).
    Une autre façon de le dire et qu'ici tu veux une transformation absolue et non relative.

  4. #4
    Membre confirmé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    212
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2009
    Messages : 212
    Par défaut
    Merci beaucoup

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/09/2011, 20h19
  2. [VB6] [Winsock] Envoi de données
    Par CYFL dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 25/12/2002, 17h49
  3. [Winsock] Envoi et recupération d'une image
    Par arnolanf dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 29/11/2002, 08h49
  4. [Socket]envoie de fichier!!!
    Par SamDaKap dans le forum C++Builder
    Réponses: 5
    Dernier message: 20/11/2002, 08h07
  5. Envoi de Datagrames par IP en JAVA
    Par the java lover dans le forum Développement
    Réponses: 2
    Dernier message: 14/08/2002, 11h44

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