SCNTransaction 不会在场景加载时运行,除非先点击场景

问题描述 投票:0回答:1

我正在以编程方式创建一个

SceneKit
,我想重点关注我使用下面的方法添加的所有节点。并将它们包裹在
SCNTransaction
内以动画化运动。

@objc
func resetCamera() {
    SCNTransaction.begin()
    SCNTransaction.animationDuration = 0.5
    
    sceneView.defaultCameraController.stopInertia()
    sceneView.defaultCameraController.frameNodes(annotationRootNode?.childNodes ?? [])
    
    SCNTransaction.commit()
}

动画预览

它工作得很好,但是,这些代码不会在初始加载时运行。除非我先手动点击屏幕。

如有任何帮助,我们将不胜感激!


我尝试将它们放入

viewDidAppear
dispatchQueue
中,但这个东西仍然无法运行,除非我先点击屏幕。

我还尝试启用 sceneKit 的多个属性,例如

isPlaying = true

我已经通过谷歌、应用程序开发论坛、chatGPT、stackoverflow 进行搜索,但没有发现任何有关此问题的信息。


我如何设置

SceneView

func setupViews() {
    ...
    view.addSubview(viewContainer)
    viewContainer.addSubview(sceneView)
    
    viewContainer.snp.makeConstraints { make in
        make.edges.equalTo(view.safeAreaLayoutGuide).inset(Constants.defaultInset)
    }
    
    sceneView.snp.makeConstraints { make in
        make.edges.equalToSuperview()
    }
    
    sceneView.scene = scene
    sceneView.delegate = self
    sceneView.overlaySKScene = annotationScene
    
    sceneView.defaultCameraController.automaticTarget = true
    sceneView.defaultCameraController.delegate = self
    sceneView.defaultCameraController.inertiaEnabled = false
    
    camera.usesOrthographicProjection = true
    camera.orthographicScale = 10.0
    cameraNode.camera = camera
    cameraNode.eulerAngles = SCNVector3(-45.0 * .pi / 180, 45.0 * .pi / 180.0, .zero)
    sceneView.pointOfView = cameraNode        
    sceneView.backgroundColor = .clear
    sceneView.allowsCameraControl = true
    ...
}

我如何设置场景

func loadAnnotations(with nodes: [NodesData]) {
    annotationRootNode = SCNNode()
    for node in nodes {
        let geometry: SCNGeometry = SCNSphere(radius: 1.0)
        let child: SCNNode = SCNNode(geometry: geometry)
        child.name = node.name
        child.position = node.position
        child.position.y = Float(node.level) * 5.0
        
        if levelNodesDict[node.level] == nil {
            let currLevelNode: SCNNode = SCNNode()
            currLevelNode.addChildNode(child)
            levelNodesDict[node.level] = currLevelNode
        }
        else {
            levelNodesDict[node.level]?.addChildNode(child)
        }
    }
    
    for node in levelNodesDict.values {
        annotationRootNode?.addChildNode(node)
    }
    
    if let annotationRootNode {
        scene.rootNode.addChildNode(annotationRootNode)
        scene.rootNode.worldPosition = .init(x: .zero, y: .zero, z: .zero)
    }
}
ios swift uikit scenekit scntranscaction
1个回答
0
投票

无论如何,谢谢你的帮助。我已经找到根本原因了,以防有人遇到类似问题。

所以,请注意,我只将

cameraNode
分配给
sceneView.pointOfView
,结果你还应该将相机插入 rootNode。

至于我点击屏幕后才起作用,我不知道。

sceneView.pointOfView = cameraNode
sceneView.scene.rootNode.addChild(cameraNode)
© www.soinside.com 2019 - 2024. All rights reserved.