我有几架ARKit检测到的飞机,并且让用户可以看到。
我希望用户能够点击屏幕,只保留他选择的平面,更改颜色并删除其他平面。
我的飞机被添加到didAddNode委托方法中,如下所示:
Plane *plane = [[Plane alloc] initWithAnchor: (ARPlaneAnchor *)anchor];
[self.planes setObject:plane forKey:anchor.identifier];
在另一种方法中,我抓住了用户的点击,希望能够更改他选择的平面的颜色并删除其他平面。
这是我写的:
CGPoint holdPoint = [recognizer locationInView:self.sceneView];
NSArray<SCNHitTestResult *> *result = [self.sceneView hitTest:holdPoint
options:@{SCNHitTestBoundingBoxOnlyKey: @YES, SCNHitTestFirstFoundOnlyKey: @YES}];
if (result.count == 0) {
return;
}
SCNHitTestResult * hitResult = [result firstObject];
SCNNode *node = hitResult.node;
SCNNode *parentNode = node.parentNode; // the geometry being child of my Plane object
问题在于我没有得到可靠的结果。当我点击一个平面时,结果数组总是包含一个单个对象,但它并不总是一个Plane对象(既不是它的父对象),而只是一个SCNNode。
发生了什么事?如何解决这个问题呢 ?
如果你有任何代码在其他飞机上检测飞机上的点击,我很感兴趣!
答案 0 :(得分:2)
如果您想要完美的结果,您使用的选项似乎过于宽松
SCNHitTestBoundingBoxOnlyKey
默认值为NO,指定命中测试搜索应针对节点几何进行测试。为此选项指定YES会增加搜索性能,但会牺牲几何精度。
SCNHitTestFirstFoundOnlyKey
默认值为NO,指定命中测试应返回找到的所有对象。如果指定YES,则命中测试结果数组仅包含找到的第一个对象(不一定是最近的)。