2010-03-29 16 views
6

Estoy trabajando en una aplicación OpenGL ES1 que muestra una cuadrícula 2D y permite al usuario navegar y escalar/rotarla. Necesito saber la traducción exacta de las coordenadas de View Touch en mi mundo opengl y en la celda de la grilla. ¿Hay ayudantes para hacer el reverso de las últimas transformaciones que hago para la navegación? o debería calcular y hacer las cosas de la matriz a mano?iPhone OpenGL ES - Cómo elegir

Respuesta

4

El modo de selección no está disponible en openGL ES. Pero es fácil calcular la coordenada de pantalla de cualquier punto 3d usando la matriz de proyección recuperada del estado OpenGL actual. Aquí es cómo lo hago (IMPoint2D y IMPoint3D son básicas (x, y) y (x, y, z) estructuras)

+ (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

que añade la función - (CGPoint) getScreenCoorOfPoint: (IMPoint3D) _point3D que me parece dar mi posición de objetos en el mundo, pero el bit Ahora estoy atascado en es: * tengo objetos que tienen una posición * tengo mi posición en el mundo (gluLookAt ojo [0], ojo [1], ojo [2]) * y luego tengo donde hice tapping en el s creen ¿Cómo unir todo esto, es lo último en mi camino para archivar la grandeza !!!! – Burf2000

6

Suena como lo que estás buscando es un método unproject. La biblioteca glut viene con uno, pero no está disponible en OpenGL ES. Es posible rewrite the glut code yourself to be iphone compatible También puede escribir su propio código para desprogramar, lo que implicaría la necesidad de escalar el punto de contacto a su ventana gráfica, multiplicarlo por el inverso de su proyección * matrices de vista modelo y dividir por w para obtener un vector 3D.

0

¿Podría ser posible hacer esto con GL_MODELVIEW_MATRIX? o GL_MODLVIEW, no estoy modificando la posición de vista, solo del modelo. estoy haciendo esto:

  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); 

gracias

Cuestiones relacionadas