Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - OpenGL 3.3+ e Matrici
Forum - C/C++ - OpenGL 3.3+ e Matrici

Avatar
carlduke (Member)
Pro


Messaggi: 153
Iscritto: 29/01/2011

Segnala al moderatore
Postato alle 19:59
Lunedì, 29/10/2012
Ho questo problema nell'implementare le mie matrici (projection matrix, view matrix e model matrix) per le applicazioni opengl.

Se uso il codice per le versioni piu' vecchie delle opengl:

Codice sorgente - presumibilmente C++

  1. . . .
  2.  
  3. void DrawAxis(vec3 center = vec3(-1.0,-1.0,-6.0),float scale = 4);
  4.  
  5. . . .
  6.  
  7. while(running)
  8. {
  9.            start_time = SDL_GetTicks();
  10.            EventHandler();
  11.  
  12.            GLXSDLRenderPipeline::ClearScreen();
  13.            GLXSDLRenderPipeline::SetViewport(); //takes default parameters
  14.  
  15.            glMatrixMode(GL_PROJECTION);          //reset matrices for drawing
  16.            gluPerspective(60,800/600,0.1,200);
  17.  
  18.            glMatrixMode(GL_MODELVIEW);  //reset modelview matrix
  19.            glLoadIdentity();
  20.          
  21.            DrawAxis(); //Draw axis of the scene
  22.  
  23.            glPushMatrix();
  24.              glTranslatef(0.0,-0.5,-5.0);
  25.              glRotatef(angle,0.50,1.0,0.50);
  26.          
  27.              DrawAxis(vec3(0.0),2.0); //Draw axis of the model
  28.  
  29.              glColor3f(0.70,1.0,1.0);
  30.              glBindVertexArray(vao[1]);
  31.              glDrawArrays(GL_TRIANGLES,0,6);
  32.              glBindVertexArray(0);
  33.            glPopMatrix();
  34.  
  35.            GLXSDLRenderPipeline::SwapBuffer();
  36.  
  37.            Update();
  38. }



tutto funziona come dovrebbe, cioe' : http://img204.imageshack.us/img204/3036/screen1wb.png

mentre usando le mie matrici come vogliono opengl e glsl 3+

Codice sorgente - presumibilmente Plain Text

  1. . . .
  2.  
  3. gl3Math::mat4 glProjectionMatrix;
  4. gl3Math::mat4 glViewMatrix;
  5.  
  6. glProjectionMatrix.buildProjection(60,800/600,0.1,200);
  7.  
  8. while(running)
  9. {
  10.            start_time = SDL_GetTicks();
  11.            EventHandler();
  12.  
  13.            GLXSDLRenderPipeline::ClearScreen();
  14.  
  15.            GLXSDLRenderPipeline::SetViewport();
  16.  
  17.            glViewMatrix.translate(vec3(0.0,0.0,5.0));
  18.  
  19.            gl3Math::mat4 glModelMatrix;
  20.            glModelMatrix.LoadIdentity();
  21.            glModelMatrix.translate(vec3(0.0,-0.5,-5.0));
  22.            glModelMatrix.rotate(angle,0.0,1.0,0.0);
  23.            
  24.  
  25.            DrawAxis();
  26.          
  27.            glMatrixMode(GL_PROJECTION);
  28.            glLoadMatrixf(glProjectionMatrix);
  29.            
  30.            glMatrixMode(GL_MODELVIEW);
  31.            glLoadMatrixf(glViewMatrix);
  32.            
  33.            glPushMatrix();
  34.              glMatrixMode(GL_MODELVIEW);
  35.              glMultMatrixf(glModelMatrix);
  36.          
  37.              DrawAxis(vec3(0.0),2.0);
  38.  
  39.              glColor3f(0.70,1.0,1.0);
  40.              glBindVertexArray(vao[1]);
  41.              glDrawArrays(GL_TRIANGLES,0,6);
  42.              glBindVertexArray(0);
  43.  
  44.            glPopMatrix();
  45.  
  46.            GLXSDLRenderPipeline::SwapBuffer();
  47.  
  48.            Update();
  49. }



non disegna piu' il modello, cioe' lo disegna ma non so dove: http://img543.imageshack.us/img543/5228/screen2vg.png

Deduco che il problema sia nei calcoli delle matrici, quindi in buildProjection() o translate() o rotate()

posto i sorgenti:

Codice sorgente - presumibilmente C#

  1. void mat4::translate(vec3 t)
  2. {
  3.     mat4 tm; //translation matrix
  4.     tm.LoadIdentity();
  5.  
  6.     tm.GetAt(0,3) = t.x;
  7.     tm.GetAt(1,3) = t.y;
  8.     tm.GetAt(2,3) = t.z;
  9.  
  10.     *this *= tm;
  11. }
  12.  
  13. void mat4::rotate(decimal angle,float x,float y,float z)
  14. {
  15.         mat4 rm;
  16.         rm.LoadIdentity();
  17.  
  18.         decimal s = sin(angle);
  19.         decimal c = cos(angle);
  20.  
  21.         rm.GetAt(0,0) = x*x*(1-c) + c;
  22.         rm.GetAt(0,1) = x*y*(1-c) - z*s;
  23.         rm.GetAt(0,2) = x*z*(1-c) + y*s;
  24.  
  25.         rm.GetAt(1,0) = x*y*(1-c) + z*s;
  26.         rm.GetAt(1,1) = y*y*(1-c) + c;
  27.         rm.GetAt(1,2) = y*z*(1-c) - x*s;
  28.  
  29.         rm.GetAt(2,0) = x*z*(1-c) - y*s;
  30.         rm.GetAt(2,1) = y*z*(1-c) + x*s;
  31.         rm.GetAt(2,2) = z*z*(1-c) + c;
  32.  
  33.         *this *= rm;
  34. }
  35.  
  36. void mat4::buildProjection(float fovy,float aspect,float zNear,float zFar)
  37. {
  38.    decimal y = cotan(fovy/2.0);
  39.    decimal x = y/aspect;
  40.  
  41.    Clear(); //set all elements to 0.0
  42.  
  43.    GetAt(0,0) = x;
  44.    GetAt(1,1) = y;
  45.    GetAt(2,2) = zFar/(zNear-zFar);
  46.    GetAt(2,3) = -1;
  47.    GetAt(3,2) = (zNear*zFar)/(zNear-zFar);
  48. }



dove GetAt e' definito nel seguente modo (ma e' giusto, lo posto per completezza) :

Codice sorgente - presumibilmente C++

  1. class gl3Math::mat4
  2. {
  3.  public :
  4.          mat4();
  5.          mat4(decimal m[16]);
  6.  
  7.          
  8.          inline decimal& GetAt(int i,int j){ return mat[i*4 + j]; }
  9.  
  10.          . . .
  11.  
  12. protected :
  13.          decimal mat[16];
  14. };



per costruire la projection matrix ho seguito questo: http://msdn.microsoft.com/en-us/library/bb205351%28v=vs.85 ...

Ultima modifica effettuata da carlduke il 30/10/2012 alle 19:45


Il mio canale: http://www.youtube.com/user/MrDukeCarl

tecnologia e programmazione!
PM Quote
Avatar
arack95 (Member)
Pro


Messaggi: 144
Iscritto: 15/11/2010

Segnala al moderatore
Postato alle 21:03
Martedì, 30/10/2012
Un primo errore è questo:

Codice sorgente - presumibilmente Plain Text

  1. *this *= tm;



Calcoli la matrice traslata(e ruotata) facendo (*this) = (*this) * tm, i fattori dovrebbero essere invertiti (e il prodotto tra matrici non è commutativo)


Take life less seriously!
PM Quote
Avatar
carlduke (Member)
Pro


Messaggi: 153
Iscritto: 29/01/2011

Segnala al moderatore
Postato alle 21:12
Martedì, 30/10/2012
accidenti!! quindi dovrei fare

Codice sorgente - presumibilmente Plain Text

  1. *this = tm * (*this)



?

grazie mille, non me ne ero accorto :k:


Il mio canale: http://www.youtube.com/user/MrDukeCarl

tecnologia e programmazione!
PM Quote
Avatar
carlduke (Member)
Pro


Messaggi: 153
Iscritto: 29/01/2011

Segnala al moderatore
Postato alle 15:58
Mercoledì, 31/10/2012
Ho risolto..!
Il riscritto le funzioni delle matrici in questo modo:

Codice sorgente - presumibilmente C++

  1. void mat4::translate(vec3 t)
  2. {
  3.        mat4 tm;
  4.         tm.LoadIdentity();
  5.  
  6.         tm.GetAt(3,0) = t.x;
  7.         tm.GetAt(3,1) = t.y;
  8.         tm.GetAt(3,2) = t.z;
  9.  
  10.         (*this) = tm * (*this);
  11.  
  12. }
  13.  
  14. void mat4::rotate(decimal angle,float x,float y,float z)
  15. {
  16.        
  17.  
  18.         vec3 axis(x,y,z);
  19.         axis = axis.normalize();
  20.  
  21.         mat4 rm;
  22.  
  23.         float b = angle * PI /180;
  24.         float c = cosf(b);
  25.         float ac = 1.0 - c;
  26.         float s = sinf(b);
  27.  
  28.         rm[0] = axis.x * axis.x * ac + c;
  29.         rm[1] = axis.x * axis.y * ac + axis.z * s;
  30.         rm[2] = axis.x * axis.z * ac - axis.y * s;
  31.  
  32.         rm[4] = axis.y * axis.x * ac - axis.z * s;
  33.         rm[5] = axis.y * axis.y * ac + c;
  34.         rm[6] = axis.y * axis.z * ac + axis.x * s;
  35.        
  36.         rm[8] = axis.z * axis.x * ac + axis.y * s;
  37.         rm[9] = axis.z * axis.y * ac - axis.x * s;
  38.         rm[10] = axis.z * axis.z * ac + c;
  39.  
  40.         (*this) = rm * (*this);
  41. }
  42.  
  43. void mat4::buildProjection(float fovy,float aspect,float zNear,float zFar)
  44. {
  45.    decimal xmin,xmax,ymin,ymax;
  46.  
  47.    ymax = zNear * tan(fovy * PI / 360.0);
  48.    ymin = -ymax;
  49.    xmin = ymin * aspect;
  50.    xmax = ymax * aspect;
  51.  
  52.    buildFrustrum(xmin,xmax,ymin,ymax,zNear,zFar);
  53. }
  54.  
  55. void mat4::buildFrustrum(float left,float right,float bottom,float top,float zNear,float zFar)
  56. {
  57.         Clear();
  58.  
  59.         GetAt(0,0) = 2*zNear/(right-left);
  60.         GetAt(0,2) = (right+left)/(right-left);
  61.         GetAt(1,1) = 2*zNear/(top-bottom);
  62.         GetAt(1,2) = (top+bottom)/(top-bottom);
  63.         GetAt(2,2) = -((zFar+zNear)/(zFar-zNear));
  64.         GetAt(2,3) = -1.0;
  65.         GetAt(3,2) = -((2.0*zFar*zNear)/(zFar-zNear));
  66. }



Il mio canale: http://www.youtube.com/user/MrDukeCarl

tecnologia e programmazione!
PM Quote