【问题标题】:"Scene is modified within a rendering callback of another scene." How to fix this error?“场景在另一个场景的渲染回调中被修改。”如何修复此错误?
【发布时间】:2019-01-08 11:56:12
【问题描述】:

我正在使用 ARKit 图像跟踪配置,一旦检测到图像,图像上就会弹出一个 3D 场景。

但是当我设置两个不同的图像触发两个不同的场景文件时,一个图像总是有两个不同的场景文件在同一个图像上弹出。我很确定图像不同,名称不同,场景文件不同,场景内容也不同。

一旦检测到图像,控制台也会弹出以下错误:

[SceneKit] Error: Scene <SCNScene: 0x284ebcfa0> is modified within a rendering callback of another scene (<SCNScene: 0x28099c820>). This is not allowed and may lead to crash

这个错误有什么原因和解决办法吗?

【问题讨论】:

  • 您好,您找到解决问题的方法了吗?

标签: swift scenekit arkit


【解决方案1】:

我在使用 ARKit 2 进行图像跟踪时遇到了同样的错误。经过几个小时的尝试,我找到了解决方案。显然,您需要在后台线程中创建节点才能播放场景。这是我的代码:

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)

            ...
        }
    }

【讨论】:

  • 好吧,如果你正在处理一个没有逻辑的节点创建,它看起来很容易。
【解决方案2】:

如果你像下面这样编码,就会弹出错误。

func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
    guard let imageAnchor = anchor as? ARImageAnchor else {
        return nil
    let buttonNode = SCNScene(named: "art.scnassets/social_buttons.scn")!.rootNode.childNode(withName: "card", recursively: false)
}

这是因为你在渲染器方法中调用了new SCNScene(init new SCNScene)。

viewDidLoad或其他地方初始化SCNScene。 如果是这样,错误可能会消失。

【讨论】:

    【解决方案3】:

    我收到此错误是因为我正在调用 scene.isPaused = false,并且删除该行消除了控制台错误。 您是否对您的SCNScene 进行任何修改?那将是开始隔离错误来源的好地方。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      相关资源
      最近更新 更多