2010-03-29 17 views
6

Pracuję nad aplikacją OpenGL ES1, która wyświetla siatkę 2D i umożliwia użytkownikowi nawigację i skalowanie/obracanie jej. Muszę znać dokładne tłumaczenie współrzędnych View Touch w mojej komórce światowej i siatce opengl. Czy są pomocnicy, którzy wykonają odwrotność kilku transformacji, które wykonuję dla nawigacji? czy powinienem kalkulować i robić rzeczy matrycowe ręcznie?iPhone OpenGL ES - jak wybrać

Odpowiedz

4

Tryb podrywania nie jest dostępny w openGL ES. Łatwo jest jednak obliczyć współrzędną ekranu dowolnego punktu 3D za pomocą macierzy projekcji pobranej z bieżącego stanu OpenGL. Oto jak to zrobić (IMPoint2D i IMPoint3D są podstawowe (x, y) i (x, y, z) struktury)

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

dodałem funkcję - (CGPoint) getScreenCoorOfPoint: (IMPoint3D) _point3D co wydaje się dać mi moją pozycję pozycji w świecie, ale trochę jestem teraz zablokowany na to: * mam obiektów, które mają pozycję * mam pozycję w świecie (gluLookAt oko [0], oko [1], oko [2]) * a potem mam gdzie podsłuchałem s creen Jak to wszystko połączyć, to ostatnia rzecz na mojej drodze do archiwizacji wielkości !!!! – Burf2000

6

Wygląda na to, czego szukasz jest metodą unproject. Biblioteka glut zawiera jedną, ale nie jest dostępna w OpenGL ES. Jest możliwe, aby rewrite the glut code yourself to be iphone compatible Można również napisać własny kod do projektu, co wymagałoby skalowania punktu styczności do ekranu, pomnożenia go przez odwrotność rzutowania * matryc modelarskich i podzielenia przez w, aby uzyskać wektor 3D.

0

Czy można to zrobić z GL_MODELVIEW_MATRIX? lub GL_MODLVIEW, nie zmieniam pozycji widoku, tylko del widoku modelu. jestem w ten sposób:

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

dzięki