我有一个名为
navigation.scn
的文件,其中有 3 个模型 spaceship.usdz
earth.usdz
和 moon.usdz
。我目前用我的代码看不到任何一个。 3.我还在我想看到的地方放置了一个相机。也许我需要照亮那里?
代码:
struct SCNViewWrapper: UIViewRepresentable {
func makeUIView(context: Context) -> SCNView {
let sceneView = SCNView()
if let scene = SCNScene(named: "navigation.scn") {
sceneView.scene = scene
let lightNode = SCNNode()
lightNode.light = SCNLight()
lightNode.light!.type = .omni
lightNode.position = SCNVector3(x: 0, y: 10, z: 10)
scene.rootNode.addChildNode(lightNode)
}
sceneView.allowsCameraControl = true
return sceneView
}
func updateUIView(_ uiView: SCNView, context: Context) {
// Update code if needed
}
}
struct ContentView: View {
var body: some View {
VStack {
SCNViewWrapper()
}
}
}
由于您使用
omni
光源作为场景中的主光源,因此它需要比定向光源高得多的强度值。除此之外,omni
比 directional
光的计算成本更高,因为它是由 6 个多向聚光灯组成的照明装置。请记住,directional
灯的位置并不重要。只有它的方向很重要。
lightNode.light = SCNLight()
lightNode.light?.type = .omni
lightNode.light?.intensity = 50_000 // 50 times more powerful
SceneKit 中所有光源的默认值为 1000 流明。此外,作为场景的辅助照明,使用强度值非常低的“环境”光是有意义的。除此之外,您应该检查场景的比例:在我看来,光源放置在模型内部(从 3D 创作应用程序导入模型时,厘米会转换为米,因此模型的比例变为 100倍大)。
scene.rootNode.scale = SCNVector3(0.01, 0.01, 0.01)