【问题标题】:ARKit: Are renderer(didAdd: ) and renderer(nodeFor: ) exclusiveARKit:是 renderer(didAdd: ) 和 renderer(nodeFor: ) 独有的
【发布时间】:2018-02-23 22:44:25
【问题描述】:

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

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

但是,在我不想手动点击按钮的其他情况下,renderer(didAdd: ) 应该可以工作。我制作了一个 sharedObject,通过它我可以确定平面检测是需要“automated”还是“ma​​nual”。如果它是自动的,planeDetection 将设置为.horizontal,而如果它是手动的,planeDetection 将设置为[]

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

是否可以使用两个不同的委托来实现它,只是一个想法......在那种情况下它会如何工作。指针将不胜感激。

【问题讨论】:

    标签: ios swift arkit


    【解决方案1】:

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

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

    renderer(nodeFor: ) 内,在planeDetection = .horizo​​ntal 的情况下,锚点可以转换为ARPlaneAnchor,其centerextent 可用于更新添加的节点。

    如:

    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 = []施加另一个条件,即不能将anchor转换为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
        }
    }
    

    【讨论】:

    • 如果没有其他/更好的答案,这将被接受为答案。
    猜你喜欢
    • 2021-12-25
    • 2021-05-16
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多