3

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

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

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

4

2 回答 2

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 博客

于 2012-08-18T04:48:17.087 回答
0

你有一个“眼睛方向”,但你不知道深度。然后你计算你必须缩放这个向量多少才能达到与你想要测试的每个对象相同的深度。完成此操作后,请检查扩展矢量是否最终位于目标对象的合理接近范围内。它被称为“光线投射”。

于 2012-06-15T21:35:31.320 回答