如何将多个 SCNScene 添加到一个 SCNScene?

How to add multiple SCNScenes to one SCNScene?

我正在尝试创建一个允许放置 3d 对象的应用程序。我能够编写一些有效的代码,但仅限于几何对象。我需要在一个场景中添加多个 SCNScenes。我该如何实施?

我是如何尝试的:

let sceneView = SCNView()
sceneView.scene = SCNScene()
sceneView.allowsCameraControl = true
sceneView.autoenablesDefaultLighting = true
sceneView.backgroundColor = .gray
    
let firstScene = SCNScene(named: "Earth.usdz")!
let firstSceneNode = firstScene.rootNode.childNode(withName: "Earth", recursively: true)!
firstSceneNode.rotate(by: .init(0, 0, 0, 0), aroundTarget: SCNVector3(0, -30, 10))
sceneView.scene?.rootNode.addChildNode(firstSceneNode)
    
let secondScene = SCNScene(named: "Venus.usdz")!
let secondSceneNode = secondScene.rootNode.childNode(withName: "Venus", recursively: true)!
sceneView.scene?.rootNode.addChildNode(secondSceneNode)

当我删除 secondScene 时,一切都适用于一个模型。

谢谢!

简单地从每个子场景中取出你想要的节点(在这种情况下,看起来你想要每个星球场景中的根节点)并且 add 它们每个都作为你所在场景中的子节点将要呈现(即太阳系场景)。

在 SceneKit 中,每个 SCNScene 可以包含多个 SCNNodes 连接到场景的 root 节点。正如您在图像上看到的,这些节点不仅可以是几何体,还可以是灯具、相机或粒子系统。

您可以轻松地从任何 SCNScene 树中检索任何所需的 SCNNode 和相应的材质,并将其粘贴到其他场景中(在本例中为空场景)。

import SwiftUI
import SceneKit

struct ContentView: View {
    
    var body: some View {
        SceneKitView().ignoresSafeArea()
    }
}

struct SceneKitView: UIViewRepresentable {
    
    let sceneView = SCNView(frame: .zero)

    func makeUIView(context: Context) -> SCNView {
        
        sceneView.allowsCameraControl = true
        sceneView.autoenablesDefaultLighting = true
        sceneView.backgroundColor = .black
        sceneView.scene = SCNScene()
        
        let scene01 = SCNScene(named: "Earth.usdz")!
        let scene02 = SCNScene(named: "Mars.usdz")!
        let scene03 = SCNScene(named: "Sun.usdz")!

        let earthNode = scene01.rootNode.childNode(withName: "earthPlanet", 
                                                recursively: true)!
        earthNode.position.x = -1.0

        let marsNode = scene02.rootNode.childNode(withName: "marsPlanet", 
                                               recursively: true)!
        marsNode.position.x = 0.2

        let sunNode = scene03.rootNode.childNode(withName: "sunStar", 
                                              recursively: true)!
        sunNode.position.x = 1.5
        
        sceneView.scene?.rootNode.addChildNode(earthNode)
        sceneView.scene?.rootNode.addChildNode(marsNode)
        sceneView.scene?.rootNode.addChildNode(sunNode)
        return sceneView
    }
    func updateUIView(_ uiView: SCNView, context: Context) { }
}

P.S.

但是您不能将多个 SCNScene 加载到单个 SCNScene.