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

这是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到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;

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

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

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

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

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

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

点赞