2013-02-05 125 views
4

这里是OpenGL ES的新手。 我使用下面的代码来检测我在GLKView(OpenGL ES 2.0)中点击的位置。我想知道是否触摸了我的OpenGL绘制的对象。这都是2D。 如何将坐标转换为OpenGL ES 2.0坐标,这些坐标基于-1.0到1.0?有没有建立在这样做的功能?iOS将TouchBegan坐标转换为OpenGL ES坐标

谢谢。

- (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); 

} 
+2

我可以这样做:* x =((* x /(bounds.size.width))* 2.0) - 1.0; *(((bounds.size.height- * y)/(bounds.size.height))* 2.0) - 1.0;但看到这是一个频繁的任务是否有内置函数? – lppier

回答

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 /等的宽度和高度。这会自动应用于您传递的坐标,以便您可以使用x轴上的0至<width>范围内的法线坐标轴和y轴上的0至<height>范围内的原点,原点位于屏幕左下角。

如果您正在使用自定义着色像我,那么你可以使用投影矩阵传递的统一: 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本人相对较新。 :)

+0

嗨,谢谢你的详细解释。我将如何去在我的代码函数touchesBegan中使用projectionMatrix?我只想检查触摸是否发生在屏幕上的openGL图形的边界内。此外,在您发出有关GLKBaseEffect的警告后,我去运行仪器检查内存泄漏。已经运行了一段时间,并没有任何 - 也许苹果已经修复它在iOS 6.1? – lppier

+0

@Ippier在'touchesBegan'中不使用投影矩阵;您可以使用上面指定的代码将投影矩阵设置为您的基本效果。您通常在创建“GLKBaseEffect”时执行此操作,例如“viewDidLoad”。它可以防止你处理剪切空间坐标,并让GLKBaseEffect在屏幕渲染时将屏幕坐标转换为剪切空间。例如,风景iPhone的居中对象将具有“{240,180}”的位置,而不是奇怪的“{0.0,0.0}”。另外,关于GLKBaseEffect,他们可能已经修复了它。 – Metabble

+0

我看到了 - 所以这意味着对于在屏幕上绘图,将projectionMatrix应用于GLKBaseEffect后,我现在使用法线坐标{240,180},是否正确? – lppier

相关问题