如何使用GLKMathUnproject

时间:2012-06-15 18:37:37

标签: ios linear-algebra glkit

我使用GLKit创建了一个简单的3D世界。我正在尝试根据屏幕点击在我的3D世界中找到一个特定的点。看来我想要使用GLKMathUnproject。该方法的签名是:

GLKVector3 GLKMathUnproject (
   GLKVector3 window,
   GLKMatrix4 model,
   GLKMatrix4 projection,
   int *viewport,
   bool *success
);

有些事情使我对它所要求的参数感到困惑。首先不应该窗口坐标是GLKVector2?最重要的是,不会将屏幕上的点投射到3D空间中而是创建光线而不是单个点。 当您将3D空间中的点投影到2D平面(也称为屏幕)上时,您会丢失关于该点的一维信息。那么如何才能将2D屏幕点转换为3D世界点,而无需指定您希望“取消投射”您的观点的深度?在互联网上的任何地方都没有关于这种方法的评论(除了苹果文档)。

2 个答案:

答案 0 :(得分:6)

第一个参数是GLKVector3,因为z组件存储了所需的z深度。

因此窗口x,y是屏幕坐标,窗口z是所需的深度。

例如,当z = 0时,GLKMathUnproject将给出近平面处物体的坐标 如果z = 1,GLKMathUnproject将为您提供远处平面上对象的坐标。

这是必要的,因为GLKMathUnproject从一个平面映射到由投影平截头体形成的三维空间中的一条线。截锥体的z - 边界受到近和远平面的约束。

所以说你想在平截头体的z = 0(物体空间)平面上映射未投影的鼠标点。

然后在窗口z = 0和窗口z = 1 1的情况下取消投影2个点。 使用这些点在对象空间中形成一条线。将该线与平面z = 0进行相互交换以确定最终目标点。

希望这有助于某人 -

您可以在此处阅读更多内容CasualDistraction Blog

答案 1 :(得分:0)

你有'眼睛方向',但你不知道深度。然后计算您必须将此向量缩放到与要测试的每个对象达到相同深度的程度。完成此操作后,请检查扩展矢量是否实际上在目标对象的合理距离内。 它被称为“光线投射”。