在ARKit中,ARSKViewDelegate中的平面检测委托方法是什么?

时间:2017-07-31 14:40:34

标签: ios arkit

阅读the documentation for planeDetection,说明

  

如果启用水平平面检测,会话会添加ARPlaneAnchor对象,并在其捕获的视频图像分析检测到看似平坦的区域时通知您的ARSessionDelegate,ARSCNViewDelegate或ARSKViewDelegate对象。

但是,我找不到ARSKViewDelegate中接收平面检测事件的方法。我看到很多ARSCNViewDelegate的例子。它是否在方法view(_:didAdd:for:)中,如果是这样,我如何检测它是否是一个平面检测锚?

1 个答案:

答案 0 :(得分:1)

检测到的平面是添加到ARSession的锚点,因此您可以使用委托方法来响应新添加的锚点。

Apple's "Providing 2D Virtual Content with SpriteKit" doc中,他们展示了一些基本代码,用于创建SpriteKit节点以响应新的锚点:

func view(_ view: ARSKView, nodeFor anchor: ARAnchor) -> SKNode? {
    return SKLabelNode(text: "")
}

如果你想在每个检测到的飞机的中心放一个广告牌表情符号,那就是你需要的所有代码。否则,您可以执行以下一项或多项操作...

  • 提供不同的SpriteKit节点 - 在该方法中初始化它并将其返回。 (请参阅SpriteKit文档,教程,SO问题等,了解如何使用SpriteKit。)

  • 也可以手动向场景添加锚点,在这种情况下,您可能需要从其余部分中挑选基于平面检测的锚点。平面锚点是ARPlaneAnchor个实例,因此您可以在该方法中测试类型:

    func view(_ view: ARSKView, nodeFor anchor: ARAnchor) -> SKNode? {
        if let plane = anchor as? ARPlaneAnchor {
            // this anchor came from plane detection
            return SKLabelNode(text: "✈️") // or whatever other SK content
        } else {
            // this anchor came from manually calling addAnchor on the ARSession
            return SKLabelNode(text: "⚓️") // or whatever other SK content
        }
    }
    
  • 使用ARPlaneAnchor的某些属性来选择要提供的SK内容或如何设置它。在这种情况下,请使用上面的条件转换(as? ARPlaneAnchor),以便您可以访问这些属性。

  • 更改SK内容相对于ARKit提供/管理的位置/方向,或为每个锚添加多个SK节点。在这种情况下,请实现view(_:didAdd:for:),为SK内容创建新节点并设置其位置(等),然后将其添加为该方法提供的node的子节点。

    < / LI>
相关问题