2010-06-03 6 views
2

Je sais que la question suivante a été posée plusieurs fois sur différents forums, mais après avoir vu différentes solutions, cela n'a toujours pas résolu mon problème, ou peut-être que je n'ai pas compris ce qu'ils veulent dire
I Je suis en train de modéliser une pyramide en utilisant OpenGL ES 2.0 sur l'iPhone.
Je voudrais permettre à l'utilisateur de faire pivoter cette pyramide en utilisant l'écran tactile, afin qu'il puisse voir toutes les faces de la forme.
J'utilise mes propres utilitaires matriciels, inspirés de la bibliothèque donnée dans le livre OpenGL ES 2.0 Programming Guide.
J'ai un simple vertex shader qui prend 2 uniformes et 2 attributs.
Voici mon vertex shader:OpenGL ES 2.0: Problème de rotation d'objet

uniform mat4 modelViewMatrix; 
uniform mat4 projectionMatrix; 
attribute vec4 vertex; 
attribute vec4 color; 
varying vec4 colorVarying; 

void main() 
{ 
colorVarying = color; 
gl_Position = projectionMatrix * modelViewMatrix * vertex; 
} 

Ainsi, au cours de mon rendu, je crée 2 matrices: la MODELVIEW et la matrice de projection.

Voici comment ma matrice de projection est initialisé:

[pMatrix frustumWithAngleOfView:70.0f 
          ratio:(float)backingWidth/(float)backingHeight 
          zNear:1.0f 
          zFar:100.0f]; 
[program use]; 
glUniformMatrix4fv(unif_projectionMatrix, 1, GL_FALSE, pMatrix.vertices); 
[program unuse]; 

Mes sommets de la pyramide sont définis comme suit:

GLfloat pyramid[] = { 
    //Base 
    -1.0, -1.0, 1.0, 1.0, 
    -1.0, -1.0, -1.0, 1.0, 
    1.0, -1.0, -1.0, 1.0, 
    1.0, -1.0, 1.0, 1.0, 
    //Front face 
    0.0, 1.0, 0.0, 1.0, 
    -1.0, -1.0, 1.0, 1.0, 
    1.0, -1.0, 1.0, 1.0, 
    //Right face 
    0.0, 1.0, 0.0, 1.0, 
    1.0, -1.0, 1.0, 1.0, 
    1.0, -1.0, -1.0, 1.0, 
    //Back face 
    0.0, 1.0, 0.0, 1.0, 
    1.0, -1.0, -1.0, 1.0, 
    -1.0, -1.0, -1.0, 1.0, 
    //Left face 
    0.0, 1.0, 0.0, 1.0, 
    -1.0, -1.0, -1.0, 1.0, 
    -1.0, -1.0, 1.0, 1.0 

}; 

Enfin, voici mon code de dessin:

[EAGLContext setCurrentContext:context]; 

glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer); 
glViewport(0, 0, backingWidth, backingHeight); 

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

// Use shader program 
[program use]; 

// Apply transformations on the ModelView matrix 
[mvMatrix identity]; 
[mvMatrix translateX:0 Y:0 Z:-6.0]; 
[mvMatrix rotateX:rotatex Y:rotatey Z:rotatez]; 

// Set the ModelView matrix uniform in the v-shader 
glUniformMatrix4fv(unif_modelViewMatrix, 1, GL_FALSE, mvMatrix.vertices); 
// Set the vertex attribute in the v-shader 
glVertexAttribPointer(attr_vertex, 4, GL_FLOAT, GL_FALSE, 0, pyramid); 
glEnableVertexAttribArray(attr_vertex); 

// Draw 
glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 
glDrawArrays(GL_TRIANGLES, 4, 3); 
glDrawArrays(GL_TRIANGLES, 7, 3); 
glDrawArrays(GL_TRIANGLES, 10, 3); 
glDrawArrays(GL_TRIANGLES, 13, 3); 

glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer); 
[context presentRenderbuffer:GL_RENDERBUFFER]; 

Tout semble fonctionner correctement, ma pyramide est ici, traduite en arrière sur l'axe Z.
Le problème apparaît lorsque je commence à faire pivoter la forme, il semble qu'elle tourne autour de l'utilisateur, pas autour de lui-même. Par exemple, lorsque je touche l'écran de gauche à droite, je vois la pyramide sortir de l'écran sur le bord droit, puis revenir à l'écran par le bord gauche, comme si elle avait fait un tour complet moi: p. Je suis à peu près sûr de mon code de gestion matriciel, donc j'ai décidé de ne pas le poster ici pour éviter trop de code dans cette question. Je peux le donner si nécessaire.

Avez-vous une idée de ce que j'ai fait de mal?

Merci beaucoup!

Tom

Répondre

3

Il semble que le problème est dans le code de gestion matricielle - en particulier, que le code de mise à jour mvMatrix (le modelViewMatrix) est en train de modifier réellement projectionMatrix place.

+1

En effet! Le problème était justement dans mon code de multiplication matriciel, qui me donnait le même résultat non dépendant de l'ordre des opérations. –