iOS将TouchBegan坐标转换为OpenGL ES坐标

时间:2013-02-05 03:30:41

标签: ios opengl-es opengl-es-2.0

这里是OpenGL ES的新手。 我正在使用以下代码来检测我在GLKView(OpenGL ES 2.0)中的位置。我想知道我是否触摸了我的OpenGL绘制对象。这都是2D。 如何将我获得的坐标转换为OpenGL ES 2.0坐标,这些坐标看起来基于-1.0到1.0?是否已经内置了功能?

感谢。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    CGRect bounds = [self.view bounds];

    UITouch* touch = [[event touchesForView:self.view] anyObject];

    CGPoint location = [touch locationInView:self.view];

    NSLog(@"x: %f y: %f", location.x, location.y);

}

1 个答案:

答案 0 :(得分:2)

-1到1是裁剪空间。如果您的坐标空间在屏幕上显示时处于裁剪空间,我会说您忘记使用投影矩阵转换空格。如果你正在使用GLKBaseEffect(因为它往往会在任何地方发生内存泄漏,我之后不建议这样做),那么你需要将<baseEffect>.transform.projectionMatrix设置为一个能够正确转换空间的矩阵。例如,

GLKBaseEffect* effect = [[GLKBaseEffect alloc] init];
GLKMatrix4 projectionMatrix = GLKMatrix4MakeOrtho(0, <width>, 0, <height>, 0.0f, 1.0f);
self.effect.transform.projectionMatrix = projectionMatrix;

widthheight将是设备屏幕/ GLKView /等的宽度和高度。这会自动应用于您传入的坐标,以便您可以使用<width>轴上0到x的常规坐标,<height>轴上的0到y ,原点位于屏幕的左下角。

如果你像我一样使用自定义着色器,那么你可以使用以下方法将投影矩阵作为制服传递: glUniformMatrix4fv(shaderLocations.projectionMatrix,1,0,projection.m)

其中projection是矩阵,shaderLocations.projectionMatrix是统一的标识符 - 正如他们所说的那样。然后,您需要将您的位置乘以投影矩阵。

一旦你通过手动传递矩阵或在GLKBaseEffect上设置正确的属性转换离开剪裁空间,OpenGL空间和UIKit空间之间的唯一区别就是y轴被翻转了。我通过touches方法和这样的手势识别器转换我收到的触摸。

CGPoint openGLTouch = CGPointMake(touch.x, self.view.bounds.size.height - touch.y);

如果您有任何疑问,我会尽力澄清,但请记住,我自己对OpenGL相对较新。 :)