【问题标题】:Scene is modified when rendering callback渲染回调时修改场景
【发布时间】:2019-04-27 11:55:20
【问题描述】:

我有以下产生错误的代码:

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {

    if anchor is ARImageAnchor {  

        let phoneScene = SCNScene(named: "Phone_01.scn")!
        let phoneNode = phoneScene.rootNode.childNode(withName: "parentNode", recursively: true)!

        // rotate the phone node
        let rotationAction = SCNAction.rotateBy(x: 0, y: 0.5, z: 0, duration: 1)
        let inifiniteAction = SCNAction.repeatForever(rotationAction)
        phoneNode.runAction(inifiniteAction)          
        phoneNode.position = SCNVector3(anchor.transform.columns.3.x,anchor.transform.columns.3.y + 0.1,anchor.transform.columns.3.z)              
        node.addChildNode(phoneNode)
    }                 
}

场景在另一个场景的渲染回调中被修改。

所以我将其替换为以下内容:

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {

    if anchor is ARImageAnchor {

        DispatchQueue.global().async {

            let phoneScene = SCNScene(named: "Phone_01.scn")!
            let phoneNode = phoneScene.rootNode.childNode(withName: "parentNode", recursively: true)!

            DispatchQueue.main.async {

                // rotate the phone node
                let rotationAction = SCNAction.rotateBy(x: 0, y: 0.5, z: 0, duration: 1)
                let inifiniteAction = SCNAction.repeatForever(rotationAction)
                phoneNode.runAction(inifiniteAction)
                phoneNode.position = SCNVector3(anchor.transform.columns.3.x,anchor.transform.columns.3.y + 0.1,anchor.transform.columns.3.z) 
                node.addChildNode(phoneNode)
            }  
        }
    }    
}

现在错误消失了,一切正常。我的问题是:这是正确的解决方案吗?我是否应该切换到后台线程来加载场景,然后切换到主线程来添加节点。是否甚至在主线程上添加了节点?

【问题讨论】:

  • 这解决了问题吗?我试过了,它确实删除了控制台中的消息。我的应用程序有时会崩溃,我认为是因为它,但我不确定此解决方案是否能防止进一步崩溃。
  • @Hols Guys,你找到解决问题的正确方法了吗?

标签: ios scenekit arkit


【解决方案1】:

在方法委托中尝试这样的事情。这是一个旧项目的例子。

DispatchQueue.main.async {
        if let imageAnchor = anchor as? ARImageAnchor {

            let plane = SCNPlane(width: imageAnchor.referenceImage.physicalSize.width, height: imageAnchor.referenceImage.physicalSize.height)
            plane.firstMaterial?.diffuse.contents = UIColor(white: 1.0, alpha: 0.5)

            let planeNode = SCNNode(geometry: plane)
            planeNode.eulerAngles.x = -.pi
            node.addChildNode(planeNode)

            ...

        }
    }

【讨论】:

    猜你喜欢
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    • 2014-08-19
    • 2023-03-23
    • 2015-03-09
    • 2015-10-25
    相关资源
    最近更新 更多