2011-03-04 4 views
1

Je développe un jeu iPhone en utilisant OpenGL ES. Je veux déplacer le joueur en utilisant les coordonnées tactile en utilisant le code comme le suivant:Comment convertir les coordonnées de fenêtre en coordonnées 2D OpenGL ES?

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    CGPoint point=[[touches anyObject]locationInView:self.view]; 
    [eaglView render:point.x]; 
}// end 

alors rendu dans mon point de vue OpenGL ES en utilisant le code suivant:

- (void) render:(float)delta 
{ 

    if(initialized==0) { 
     [self initOpenGL]; 
    } 

    static const GLfloat squareVertices[] = { 
     -0.5f, -0.33f, 
     0.5f, -0.33f, 
     -0.5f, 0.33f, 
     0.5f, 0.33f, 
    }; 

    static const GLubyte squareColors[] = { 
     255, 255, 0, 255, 
     0, 255, 255, 255, 
     0,  0, 0, 0, 
     255, 0, 255, 255, 
    }; 

    float transY = delta; 

    // This application only creates a single context which is already set current at this point. 
    // This call is redundant, but needed if dealing with multiple contexts. 
    [EAGLContext setCurrentContext:context]; 

    // This application only creates a single default framebuffer which is already bound at this point. 
    // This call is redundant, but needed if dealing with multiple framebuffers. 
    //glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer); 
    glViewport(0, 0, backingWidth, backingHeight); 

    glClearColor(0.5f, 0.5f, 0.5f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT); 

    // Use shader program 
    //glUseProgram(program); 

    // Update uniform value 
    //glUniform1f(uniforms[UNIFORM_TRANSLATE], (GLfloat)transY); 
    //transY += 0.075f; 

    glVertexPointer(2, GL_FLOAT, 0, squareVertices); 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glColorPointer(4, GL_UNSIGNED_BYTE, 0, squareColors); 
    glTranslatef(0.0f, (GLfloat)(sinf(transY)/2.0f), 0.0f); 
    //transY += 0.0001f; 

    glEnableClientState(GL_COLOR_ARRAY); 
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 
    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisableClientState(GL_COLOR_ARRAY); 
    // Update attribute values 

    // Validate program before drawing. This is a good check, but only really necessary in a debug build. 
    // DEBUG macro must be defined in your debug configurations if that's not already the case. 
    // Draw 

    // This application only creates a single color renderbuffer which is already bound at this point. 
    // This call is redundant, but needed if dealing with multiple renderbuffers. 
    // glBindRenderbuffer(GL_RENDERBUFFER, renderBuffer); 
    glBindRenderbufferOES(GL_RENDERBUFFER_OES,renderBuffer); 
    [context presentRenderbuffer:GL_RENDERBUFFER_OES]; 
} 

Je ne peux pas traduire l'objet en utilisant la fenêtre coordonnées, donc je dois le convertir en coordonnées normalisées de l'appareil. Comment procéder pour convertir des coordonnées de fenêtres à celles que je pourrais utiliser pour traduire mon modèle OpenGL ES?

Répondre

2

Pour convertir des coordonnées window en openGL, il vous suffit de retourner l'axe y (cela peut être x selon votre orientation). Si votre appareil est en mode portrait que vous utilisez le code suivant:

CGPoint touch_point = [[touches anyObject] locationInView:self.view]; 
touch_point = CGPointMake(touch_point.x, 480-touch_point.y); //Or you can put touch_point.y = 480-touch_point.y 
[eaglview renderTouchAtPoint:touch_point]; 

Maintenant, si votre appareil est dans le paysage que vous faites le même, sauf pour l'axe x:

CGPoint touch_point = [[touches anyObject] locationInView:self.view]; 
touch_point = CGPointMake(480-touch_point.x, touch_point.y); 
[eaglview renderTouchAtPoint:touch_point]; 

Cela a fonctionné pour moi, J'espère que ça marche pour toi.

Questions connexes