阅读the documentation for planeDetection
,说明
如果启用水平平面检测,会话会添加ARPlaneAnchor对象,并在其捕获的视频图像分析检测到看似平坦的区域时通知您的ARSessionDelegate,ARSCNViewDelegate或ARSKViewDelegate对象。
但是,我找不到ARSKViewDelegate
中接收平面检测事件的方法。我看到很多ARSCNViewDelegate
的例子。它是否在方法view(_:didAdd:for:)
中,如果是这样,我如何检测它是否是一个平面检测锚?
答案 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
的子节点。