2010-03-29 6 views
6

Je travaille sur une application OpenGL ES1 qui affiche une grille 2D et permet à l'utilisateur de naviguer et de l'échelle/rotation. J'ai besoin de connaître la traduction exacte des coordonnées de View Touch dans mon monde ouvert et ma cellule de grille. Y a-t-il des aides pour faire l'inverse des dernières transformations que je fais pour la navigation? ou je devrais calculer et faire les choses matricielles à la main?iPhone OpenGL ES - Comment choisir

Répondre

4

Le mode de prélèvement n'est pas disponible dans OpenGL ES. Mais il est facile de calculer la coordonnée d'écran de n'importe quel point 3D en utilisant la matrice de projection récupérée à partir de l'état openGL actuel. Voici comment je le fais (IMPoint2D et IMPoint3D sont basiques (x, y) et (x, y, z) structures)

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

I a ajouté la fonction - (CGPoint) getScreenCoorOfPoint: (IMPoint3D) _point3D qui semble me donner ma position articles dans le monde, mais le peu que je suis maintenant coincé On est: * J'ai des objets qui ont une position * J'ai ma position dans le monde (oeil gluLookAt [0], oeil [1], oeil [2]) * et je avoir où j'ai tapé sur le s creen Comment puis-je me joindre à tout cela, c'est la dernière chose sur mon chemin pour archiver la grandeur !!!! – Burf2000

6

ressemble à ce que vous cherchez est une méthode unproject. La librairie glut est fournie avec un, mais elle n'est pas disponible sur OpenGL ES. rewrite the glut code yourself to be iphone compatible Vous pouvez également écrire votre propre code pour unproject, ce qui impliquerait d'avoir besoin de mettre à l'échelle le point de contact à votre viewport, de le multiplier par l'inverse de vos matrices de projection * modelview, et de diviser par w pour obtenir un vecteur 3D.

0

Cela peut-être possible avec GL_MODELVIEW_MATRIX? ou GL_MODLVIEW, je ne modifie pas la position de vue, seulement del modelview. je suis le faire:

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

grâce