iOS 11 SceneKit hitTest:options: 失败

iOS 11 SceneKit hitTest:options: fails

我在使用 hitTest:options 时遇到困难:在 iOS 11 的 SceneKit 中。

在地图应用程序中,我有一个地形节点。使用 hitTest:options:我能够通过触摸屏幕在地形上找到一个点。在 iOS 11 上发布的二进制文件以及 Xcode 9 为 iOS 10 模拟器编译的二进制文件,它仍然可以按预期工作。

但是 iOS 11 二进制文件在 iOS 11 SDK 上给出了完全错误的结果。 Return 来自 hitTest:options 的数组:可能不包含结果或包含太多结果。而且,大多数时候none的结果都是有效的。以下是说明这一点的图片。所有图像均来自没有隐藏节点的场景。

编辑:我今天使用hitTestWithSegmentFromPoint:toPoint:options进行了测试:也得到了错误的结果。

首先使用工作模拟器。

显示正常命中地形。命中点用红球表示。它半嵌入地形中,因为它的中心就在地形上。

这两张图片显示了 "ray" 穿过地形 3 次的情况。我们在 terrain.The 第二张图片上正确放置了 3 个匹配项,更改视角以显示 3 个点。

现在失败的 iOS 11 情况:

在这张照片上我们中了一个,但它 "nowhere" 在两座山之间,而不是在地形上。

最后两张图片显示了 4 次和 16 次命中的其他尝试,所有 "in the blue" 都与地形无关。

有时命中 "away" 越过地形,有时在相机和地形之间。

我在 iOS 11 上遇到了同样的问题。我的解决方案:

var hitTestOptions = [SCNHitTestOption.sortResults : NSNumber(value: true),
                      SCNHitTestOption.boundingBoxOnly : NSNumber(value: true)]

if #available(iOS 11.0, *) {
    hitTestOptions[SCNHitTestOption.searchMode] = SCNHitTestSearchMode.all.rawValue as NSNumber
}

四年后我回到这个问题并找到了解决我原来问题的方法。

Apple 发布 iOS 11.2 后,解决了多次命中问题,但我们遇到了“无命中”难题。

问题出在原问题中没有完全解释的特定情况。在最初计算和显示地形后,我们总是会得到第一个命中。然后我们平移 地形使命中点居中并重建一个新的地形扇区。在此过程中,我们通过重用多个几何元素来节省计算,仅更改地形顶点的 z 坐标。问题在于重复使用三角形带SCNGeometryElement。从现在开始,通过重复使用此对象构建的任何地形都很好看,但无法通过 hitTest 方法。

原来SCNGeometryElement不能重用,应该重建。 最初的工作代码是:

t_strip = [geom_cour geometryElementAtIndex:0];

要解决 HitTest:失败,我们必须这样做:

//get current triangle strip
SCNGeometryElement *t_strip_g = [geom_cour geometryElementAtIndex:0];
//create a new one using the current as a template
t_strip = [SCNGeometryElement geometryElementWithData:t_strip_g.data
                                        primitiveType:t_strip_g.primitiveType
                                       primitiveCount:t_strip_g.primitiveCount
                                        bytesPerIndex:t_strip_g.bytesPerIndex];

当前的 SCNGeometryElement 用作模板以重新创建具有完全相同值的新模板。