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
用作模板以重新创建具有完全相同值的新模板。
我在使用 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进行了测试:也得到了错误的结果。
首先使用工作模拟器。
现在失败的 iOS 11 情况:
最后两张图片显示了 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
用作模板以重新创建具有完全相同值的新模板。