我正在使用ARKit图像跟踪配置,一旦检测到图像,就会在图像上弹出3D场景。
但是当我设置两个不同的图像来触发两个不同的场景文件时,一个图像始终在同一图像上弹出两个不同的场景文件。我很确定图像是不同的,名称是不同的,场景文件是不同的,场景的内容也是不同的。
一旦检测到图像,控制台中还将弹出以下错误消息: [SceneKit]错误:在另一个场景()的渲染回调中修改了场景。这是不允许的,并且可能导致崩溃
此错误的任何原因和解决方案?
非常感谢。
答案 0 :(得分: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)
...
}
}
答案 1 :(得分:0)
我收到此错误的原因是我正在调用scene.isPaused = false
,并且删除该行摆脱了控制台错误。
您是否要对SCNScene
进行任何修改?那将是一个开始隔离错误源的好地方。
答案 2 :(得分:0)
如果您按如下所示进行编码,则会弹出错误。
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)
}
这是因为您在渲染器方法中调用了新的SCNScene(初始化新的SCNScene)。
在viewDidLoad
或其他位置初始化SCNScene。
如果是这样,错误可能会消失。