如何将窗口坐标转换为2-D OpenGL ES坐标?

时间:2011-03-04 08:26:53

标签: iphone opengl-es

我正在使用OpenGL ES开发iPhone游戏。我想使用以下代码使用触摸坐标移动播放器:

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

然后使用以下代码在我的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];
}

我无法使用窗口坐标转换对象,因此我必须将其转换为规范化设备坐标。我如何从窗口坐标转换为可用于翻译我的OpenGL ES模型的坐标?

1 个答案:

答案 0 :(得分: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];

这对我有用,希望它适合你。