ARKit:渲染器(didAdd :)和渲染器(nodeFor :)是独占的

时间:2018-02-23 12:20:05

标签: ios swift arkit

完全依赖ARKit自动平面检测是我不想做的事情,因为它需要时间来检测表面,然后现实生活中的表面应该有足够的纹理,因此我需要考虑一些事情如果我愿意,我可以选择一个选项,只需按一下按钮,就可以随意添加锚点。

这里renderer(nodeFor: )派上用场。只需在按钮上添加锚点,使用hitTest确定锚点的位置,然后使用nodeFor:方法添加节点。

但是,在其他情况下,当我不想手动点按按钮时,renderer(didAdd: )应该有效。我制作了一个共享对象,通过它我可以确定平面检测是否需要" 自动化"或" 手动"。如果它的自动planeDetection设置为.horizontal,而如果是手动,则planeDetection将设置为[]

问题在于测试似乎委托下的两种方法中的任何一种都可以工作。 有没有办法可以实现我的目标? 有一个开关,我可以切换我是想要自动平面检测,还是想添加锚点然后再添加平面。我很想有两个选择。

是否有可能使用两个不同的代表来实现它,只是一个想法...在这种情况下它将如何工作。指针将非常感激。

1 个答案:

答案 0 :(得分:1)

是的,renderer(didAdd: )renderer(nodeFor: )是独占的。根据文档,如果我们想要实现我们自己的方法在场景中添加节点,我们可以继续使用renderer(nodeFor: ),或者我们可以而不是选择ARKit来做同样的事情我们使用renderer(didAdd: )

管理这两种情况的方法,即在planeDetection = []时手动添加节点;使用planeDetection = .horizontal方法本身可以在renderer(nodeFor: )时自动添加节点。不需要renderer(didAdd: )

如果在planeDetection = .horizo​​ntal的情况下renderer(nodeFor: ),则可以将锚定为ARPlaneAnchor,其中 center extent 可用于更新添加的节点。

如:

func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
    if let planeAnchor = anchor as? ARPlaneAnchor {
        let node = SCNNode()
        let plane = SCNPlane(width: CGFloat(planeAnchor.extent.x),
                             height: CGFloat(planeAnchor.extent.z))

        let planeNode = SCNNode(geometry: plane)
        planeNode.name = "anchorPlane"
        planeNode.simdPosition = float3(planeAnchor.center.x, 0, planeAnchor.center.z)
        node.addChildNode(planeNode)
        return node

同时,planeDetection = []可以施加另一个条件,当锚点不能被转换为ARPlaneAnchor时,可以根据需要给出节点下面的几何图形。

    } else {
        let node = SCNNode()
        let plane = SCNPlane(width: 0.5, height: 0.5)
        plane.firstMaterial?.diffuse.contents = UIColor.white
        let planeNode = SCNNode(geometry: plane)
        node.addChildNode(node)
        return node
    }
}