如何将多个 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.
我正在尝试创建一个允许放置 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.