我正在以编程方式创建一个
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)
}
}
无论如何,谢谢你的帮助。我已经找到根本原因了,以防有人遇到类似问题。
所以,请注意,我只将
cameraNode
分配给 sceneView.pointOfView
,结果你还应该将相机插入 rootNode。
至于我点击屏幕后才起作用,我不知道。
sceneView.pointOfView = cameraNode
sceneView.scene.rootNode.addChild(cameraNode)