2011-03-04 249 views
1

我正在开发一款使用OpenGL ES的iPhone游戏。我想用使用类似的代码触摸坐标移动播放器执行以下操作:如何将窗口坐标转换为2D OpenGL ES坐标?

- (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]; 
} 

使用的窗口,我无法翻译对象:

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

然后用下面的代码我的OpenGL ES视图中绘制坐标,所以我必须将其转换为标准化的设备坐标。我将如何从窗口坐标转换为可用于翻译我的OpenGL ES模型的坐标?

回答

2

要从窗口转换到openGL坐标,您只需要翻转y轴(可能取决于您的方向x)。如果您的设备处于纵向模式时,你使用下面的代码:

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

现在,如果你的设备处于景观你做同样的除了X轴:

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

这为我工作,希望对你有效。

相关问题