如何使用GLKMathUnproject(How to use GLKMathUnproject)

2019-09-18 04:04发布

我已经使用GLKit创建了一个简单的3D世界。 我试图找到根据屏幕上轻点我的3D世界中的特定点。 看来,我想用GLKMathUnproject。 该方法的签名是:

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

有几件事情让我困惑关于它需要PARAMS。 首先应该不是窗口坐标GLKVector2? 而最重要的就不会投影屏幕到3D空间上的点创建射线,而不是一个点。 当你的项目在三维空间中的点到2D平原(又名屏幕),你失去的那点信息的一个维。 因此,如何将有可能在2D屏幕点转换成3D世界点而不在指定你想要什么深度“unproject”你点? 是绝对有关该方法的互联网(除了苹果的文档)的任何地方任何评论。

Answer 1:

第一个参数是GLKVector3因为z分量存储所需的z深度。

所以窗口x,y是屏幕COORDS和窗口z是所希望的深度。

例如,与Z = 0 GLKMathUnproject会给对象的坐标在与Z = 1近平面,GLKMathUnproject会给你对象的坐标在远平面。

这是必要的,因为GLKMathUnproject从平面映射到由所述投影截锥构成的三维空间中的线。 在Z - 视锥的边界由近及远的飞机的限制。

所以说你想平面映射在Z = 0(对象空间)的未投影鼠标点在圆台。

然后unproject 2分与窗口Z = 0和窗口Z = 1 1.使用这些点,以在对象空间中的线。 Interesect与平面z这一行= 0以确定最终的目标点。

希望这可以帮助别人 -

你可以在这里阅读更多CasualDistraction博客



Answer 2:

你有一个“视线方向”,但你不知道的深度。 然后你计算出多少你必须扩展这个载体来达到相同的深度,每一个对象,你想测试。 一旦你做到了这一点,检查扩展矢量其实你的目标对象的合理接近内结束。 这就是所谓的“光线投射”。



文章来源: How to use GLKMathUnproject