如何在 SwiftUI 中清除 SceneView 3D 对象的背景

fel*_*ode 5 xcode swift scnscene sceneview swiftui

有谁知道如何清除 SceneView 3D 对象的背景?我正在尝试使用 UIColor.clear,但它使它变成白色。[这应该是清晰的,但它是白色的]

import SwiftUI
import SceneKit

struct TestView: View {
    var body: some View {
    
        ZStack{
                    Color.green
                    SceneView(
                        scene: {
                            let scene = SCNScene(named: "Earth.scn")!
                            scene.background.contents = UIColor.clear
                            return scene
                        }(),
                        options: [.autoenablesDefaultLighting,.allowsCameraControl]
                    )
                    .frame(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height/2, alignment: .center)
                
                }
    }
}

struct TestView_Previews: PreviewProvider {
    static var previews: some View {
        TestView()
    }
}
Run Code Online (Sandbox Code Playgroud)

K K*_*K B 0

这是一个对我有用的解决方案,主要是从这里的答案中采用的:

import SceneKit
import SwiftUI

final class EarthSceneView: UIViewRepresentable {
    typealias UIViewType = SCNView
    typealias Context = UIViewRepresentableContext<EarthSceneView>

    func updateUIView(_ uiView: UIViewType, context: Context) {}
    func makeUIView(context: Context) -> UIViewType {
        let view = SCNView()
        view.backgroundColor = UIColor.clear // this is key!
        view.allowsCameraControl = true
        view.autoenablesDefaultLighting = true
        // load the scene here, could load an .obj file too
        view.scene = SCNScene(named: "Earth.scn")!
        return view
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以在你的视图中使用它:

import SwiftUI

struct TestView: View {
    var body: some View { 
        ZStack{
            Color.green
            EarthSceneView()
                .frame( // set frame as required
                    maxWidth: .infinity,
                    maxHeight: .infinity,
                    alignment: .center
                )
        }
    }
}

struct TestView_Previews: PreviewProvider {
    static var previews: some View {
        TestView()
    }
}
Run Code Online (Sandbox Code Playgroud)