我已经使用GLKit创建了一个简单的3D世界。 我试图找到根据屏幕上轻点我的3D世界中的特定点。 看来,我想用GLKMathUnproject。 该方法的签名是:
GLKVector3 GLKMathUnproject (
GLKVector3 window,
GLKMatrix4 model,
GLKMatrix4 projection,
int *viewport,
bool *success
);
有几件事情让我困惑关于它需要PARAMS。 首先应该不是窗口坐标GLKVector2? 而最重要的就不会投影屏幕到3D空间上的点创建射线,而不是一个点。 当你的项目在三维空间中的点到2D平原(又名屏幕),你失去的那点信息的一个维。 因此,如何将有可能在2D屏幕点转换成3D世界点而不在指定你想要什么深度“unproject”你点? 是绝对有关该方法的互联网(除了苹果的文档)的任何地方任何评论。
第一个参数是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博客
你有一个“视线方向”,但你不知道的深度。 然后你计算出多少你必须扩展这个载体来达到相同的深度,每一个对象,你想测试。 一旦你做到了这一点,检查扩展矢量其实你的目标对象的合理接近内结束。 这就是所谓的“光线投射”。