我希望能够单击触摸屏并将触摸的点用作要用于拾取的射线的起始坐标。
如何将触摸屏幕返回的点转换为可以在 GL 世界坐标中使用的点?
搜索带来了许多令人困惑的可能性,包括使用 gluUnProject 以及关于它是否受支持以及如何移植它的大量报告。
请问有人可以直接给我吗?
我正在使用 Objective C、Xcode 并且正在为 iphone 编译。
我希望能够单击触摸屏并将触摸的点用作要用于拾取的射线的起始坐标。
如何将触摸屏幕返回的点转换为可以在 GL 世界坐标中使用的点?
搜索带来了许多令人困惑的可能性,包括使用 gluUnProject 以及关于它是否受支持以及如何移植它的大量报告。
请问有人可以直接给我吗?
我正在使用 Objective C、Xcode 并且正在为 iphone 编译。
步骤 0:获取 gluUnproject:
需要它的报告是真实的。该功能为您完成所有繁重的工作。我知道 MESA 项目有一个实现几乎可以在 iOS 上完美运行而无需修改。我不确定这是否仍然可用。除此之外,您只需要对其进行一些研究,然后自己动手或移植别人的。线性代数有点重,祝你好运。
第 1 步:从 UIKit 坐标转换为 OpenGL 坐标:
这通常涉及两件事:
翻转 Y 坐标,因为 UIKit 喜欢它的原点在左上角,而 OpenGL 喜欢它的原点在左下角。
touchLocation.y = [[self view] bounds].size.height - touchLocation.y;
从“屏幕单位”转换为像素。这使标准和视网膜显示设备之间的事情保持一致。
CGFloat scale = [[UIScreen mainScreen] scale];
touchLocation.y *= scale;
touchLocation.y *= scale;
第 3 步:在转换后的坐标上使用 gluUnproject:
gluUnproject()
从技术上讲,将窗口空间中的 3D 点转换为世界空间中的 3D 点。因此,要获得一条射线,您需要调用它两次:一次用于近剪裁平面,一次用于远剪裁平面。这会给你两个点,你可以从中得到射线。要调用gluUnproject()
,您需要访问 2D 视图坐标、当前 OpenGL 视口、当前 OpenGL 模型视图矩阵和当前 OpenGL 投影矩阵。伪代码:
Vector3 near, far;
gluUnProject(touchLocation.x, touchLocation.y, 0, _modelview, _projection, _viewport, &near.x, &near.y, &near.z);
gluUnProject(touchLocation.x, touchLocation.y, 1, _modelview, _projection, _viewport, &far.x, &far.y, &far.z);
return MakeRay(near, Vector3Subtract(far, near));