我用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将为您提供物体在远平面上的坐标。
这是必要的,因为 GLKMathUn 投影从平面映射到由投影视锥形成的 3D 空间中的线。 视锥体的 z 边界受近平面和远平面的约束。
假设您想将未投影的鼠标点映射到视锥体中的 z=0(对象空间)平面上。
然后用窗口 z=0 和窗口 z =1 1 取消投影 2 个点。使用这些点在对象空间中形成一条线。 将此线与平面 z=0 相交以确定最终目标点。
希望这对某人有所帮助 -
你可以在这里阅读更多 休闲分心博客
你有一个"眼睛方向",但你不知道深度。然后计算必须缩放此向量的程度才能达到与要测试的每个对象相同的深度。完成此操作后,请检查扩展向量是否实际上最终位于目标对象的合理距离内。它被称为"光线投射"。