gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 05:56:30 25 4
gpt4 key购买 nike

这里是 OpenGL ES 的新手。我正在使用以下代码来检测我在 GLKView (OpenGL ES 2.0) 中点击的位置。我想知道我是否触摸了我的 OpenGL 绘制对象。都是二维的。如何将我得到的坐标转换为 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;

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

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

哪里projection是矩阵 and 和 shaderLocations.projectionMatrix是制服的标识符——它的名字,正如他们所说。然后,您需要将您的位置乘以投影矩阵。

一旦您从裁剪空间转换出来,可以通过手动传入矩阵或在 GLKBaseEffect 上设置正确的属性,OpenGL 空间和 UIKit 空间之间的唯一区别是 y轴被翻转。我转换通过 touches 收到的触摸像这样的方法和手势识别器。

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

如果您有任何问题,我会尽力澄清,但请记住,我本人是 OpenGL 的新手。 :)

关于iOS 将 TouchBegan 坐标转换为 OpenGL ES 坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14699719/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com