2010-03-29 23 views
6

Sto lavorando a un'app OpenGL ES1 che visualizza una griglia 2D e consente all'utente di navigare e ridimensionarla/ruotarla. Ho bisogno di conoscere l'esatta traduzione delle coordinate di View Touch nel mio mondo opengl e nella cella della griglia. C'è qualche aiuto per fare l'opposto delle ultime trasformazioni che faccio per la navigazione? o dovrei calcolare e fare le matrix a mano?iPhone OpenGL ES - Come scegliere

risposta

4

La modalità di prelievo non è disponibile in openGL ES. Ma è facile calcolare le coordinate dello schermo di qualsiasi punto 3d usando la matrice di proiezione recuperata dallo stato corrente di OpenGL. Ecco come lo faccio (IMPoint2D e IMPoint3D sono essenziali (x, y) e (x, y, z) strutture)

+ (IMPoint2D) getScreenCoorOfPoint:(IMPoint3D)_point3D 
{ 
    GLfloat  p[16];            // Where The 16 Doubles Of The Projection Matrix Are To Be Stored 
    glGetFloatv(GL_PROJECTION_MATRIX, p);       // Retrieve The Projection Matrix 
/* 
Multiply M * point 
*/ 
    GLfloat _p[] = {p[0]*_point3D.x +p[4]*_point3D.y +p[8]*_point3D.z + p[12], 
        p[1]*_point3D.x +p[5]*_point3D.y +p[9]*_point3D.z + p[13], 
        p[2]*_point3D.x +p[6]*_point3D.y +p[10]*_point3D.z+ p[14], 
        p[3]*_point3D.x +p[7]*_point3D.y +p[11]*_point3D.z+ p[15]}; 
/* 
divide by scale factor 
*/ 
    IMPoint2D _p2D = {_p[0]/_p[3], _p[1]/_p[3]}; 
/* 
get result in screen coordinates. In this case I'm in landscape mode 
*/ 
    return (IMPoint2D) {_p2D.x*240.0f + 240.0f, (1.0f - _p2D.y) *160.0f}; 
} 
+0

ho aggiunto la funzione - (CGPoint) getScreenCoorOfPoint: (IMPoint3D) _point3D che sembra darmi la mia posizione oggetti nel mondo, ma il bit Ora sono bloccato on è: * devo oggetti che hanno una posizione * ho la mia posizione nel mondo (gluLookAt occhio [0], occhio [1], occhio [2]) * e poi ho ho dove ho toccato il s creen Come faccio a unire tutto questo, è l'ultima cosa a mio modo di archiviare la grandezza !!!! – Burf2000

6

suona come quello che stai cercando è un metodo unproject. La libreria glut viene fornita con una, ma non è disponibile su OpenGL ES. È possibile rewrite the glut code yourself to be iphone compatible È anche possibile scrivere il proprio codice per non proiettare, il che comporterebbe la necessità di ridimensionare il touchpoint nella vista, moltiplicarlo per l'inverso delle matrici di modelview * di proiezione * e dividere per w per ottenere un vettore 3D.

0

Potrebbe essere possibile farlo con GL_MODELVIEW_MATRIX? o GL_MODLVIEW, non sto modificando la posizione della vista, solo del modelview. sto facendo questo:

  glMatrixMode(GL_MODELVIEW); 

// Setup model view matrix 
      glLoadIdentity(); 
      [gAccel GetAccelerometerMatrix:(GLfloat *) matrix headingX:headx headingY: heady headingZ:headz]; 

      // Finally load matrix 
      glLoadMatrixf((GLfloat*)matrix); 

      glPushMatrix(); 
      glRotatef(-90, 1, 0, 0); 
      glScalef(0.0005, 0.0005, 0.0005); 
      glTranslatef(x, 0.0, z); 

grazie