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:
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
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(); }
Une idée du problème ?
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 */ }
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é).
Partager