这里是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);
}
答案 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;
width
和height
将是设备屏幕/ 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相对较新。 :)