如何使用GLKMathUnproject

Tyl*_*230 3 linear-algebra ios glkit

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

GLKVector3 GLKMathUnproject (
   GLKVector3 window,
   GLKMatrix4 model,
   GLKMatrix4 projection,
   int *viewport,
   bool *success
);
Run Code Online (Sandbox Code Playgroud)

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

Opt*_*key 6

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

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

例如,当z = 0时,GLKMathUnproject将给出近平面上物体的坐标,其中z = 1,GLKMathUnproject将给出远处平面上物体的坐标.

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

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

然后用窗口z = 0和窗口z = 1取消投影2个点.使用这些点在对象空间中形成一条线.将此线与平面z = 0相互交叉以确定最终目标点.

希望这有助于某人 -

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