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

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

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

最佳答案

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

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

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

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

因此,假设您想将未投影的鼠标点映射到视锥体中 z=0(对象空间)平面。

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

希望这可以帮助某人 -

你可以在这里阅读更多 CasualDistraction Blog

关于ios - 如何使用 GLKMathUnproject,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11056391/

10-11 18:01