【问题标题】:ARKit : how to get a SCNNode hit by hitTest?ARKit:如何获得 hitTest 命中的 SCNNode?
【发布时间】:2018-02-22 11:47:19
【问题描述】:

我有几个被 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

问题是我没有得到可靠的结果。当我点击一个平面时,结果数组总是包含一个对象,但它并不总是一个平面对象(既不是它的父对象),而只是一个 SCNNode。

发生了什么?如何解决这个问题呢 ?

如果您有任何代码可以检测其他飞机中的飞机点击,我很感兴趣!

【问题讨论】:

    标签: objective-c xcode scenekit arkit


    【解决方案1】:

    如果您想要完美的结果,您使用的选项似乎过于宽松

    SCNHitTestBoundingBoxOnlyKey 默认值为 NO,指定命中测试搜索应针对节点几何进行测试。为该选项指定 YES 会提高搜索性能以牺牲几何精度为代价。

    SCNHitTestFirstFoundOnlyKey 默认值为 NO,指定命中测试应返回找到的所有对象。如果指定 YES,则命中测试结果数组仅包含找到的第一个对象(不一定是最近的)。

    【讨论】:

    • 即使我对两个参数都使用“否”,我也没有得到可靠的结果... 很多时候,当我点击一个平面时,没有检测到平面。我不明白为什么。有时,当我在飞机的某个位置单击两次时,它首先被检测到,然后不再检测到(或反向)。我不明白!
    猜你喜欢
    • 2019-01-30
    • 2017-12-14
    • 2018-08-04
    • 2017-12-22
    • 2018-07-18
    • 2018-01-30
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多