swiftui - 如何使 SceneView 的背景透明?

标签 swiftui scenekit

我想打开一个 3D 模型并使其背景透明,以便我可以看到 SceneView 后面的 UI。我试过这段代码,但sceneView变成白色,不透明。


struct ModelView: View {
    var body: some View {
        ZStack {
            Text("Behind Text Behind Text Behind Text")
            SceneView(
                scene: { () -> SCNScene in
                    let scene = SCNScene()
                    scene.background.contents = UIColor.clear
                    return scene
                }(),
                pointOfView: { () -> SCNNode in
                    let cameraNode = SCNNode()
                    cameraNode.camera = SCNCamera()
                    cameraNode.position = SCNVector3(x: 0, y: 0, z: 10)
                    return cameraNode
                }(),
                options: [
                    .allowsCameraControl,
                    .temporalAntialiasingEnabled,
                ]
            )
        }
    }
}
我使用 XCode 12.5 和 iPhone 8。
编辑 1:
感谢下面的评论,我决定尝试新的方法,但它们仍然不起作用。
方法#1
首先,我尝试通过 UIViewRepresentable 使用 SCNView 创建一个 MySceneView:
struct MySceneView: UIViewRepresentable {
    typealias UIViewType = SCNView
    typealias Context = UIViewRepresentableContext<MySceneView>

    func updateUIView(_ uiView: UIViewType, context: Context) {}
    func makeUIView(context: Context) -> UIViewType {
        let view = SCNView()
        view.allowsCameraControl = true
        view.isTemporalAntialiasingEnabled = true
        view.autoenablesDefaultLighting = true
        view.scene = MySceneView.scene
        return view
    }
    
    static let scene: SCNScene = {
        let scene = SCNScene(named: "art.scnassets/man.obj")!
        scene.background.contents = UIColor.clear
        let cameraNode = SCNNode()
        cameraNode.camera = SCNCamera()
        cameraNode.position = SCNVector3(x: 0, y: 0, z: 10)
        scene.rootNode.addChildNode(cameraNode)
        return scene
    }()
}
方法#2
我尝试使用 SpriteView,这是代码:
        ZStack {
            Text("Behind Text Behind Text Behind Text")
            SpriteView(scene: { () -> SKScene in
                let scene = SKScene()
                scene.backgroundColor = UIColor.clear
                let model = SK3DNode(viewportSize: .init(width: 200, height: 200))
                model.scnScene = MySceneView.scene
                scene.addChild(model)
                return scene
            }(), options: [.allowsTransparency])
}

最佳答案

更新:
一个更简单的解决方案是使用 UIViewRepresentable,创建 SCNView 并将 backgroundColor 设置为 clear
老的:
谢谢 George_E,你对 SpriteKit 的想法很完美。这是代码:

SpriteView(scene: { () -> SKScene in
    let scene = SKScene()
    scene.backgroundColor = UIColor.clear
    let model = SK3DNode(viewportSize: .init(width: 200, height: 200))
    model.scnScene = {
        let scene = SCNScene(named: "art.scnassets/man.obj")!
        scene.background.contents = UIColor.clear
        let cameraNode = SCNNode()
        cameraNode.camera = SCNCamera()
        cameraNode.position = SCNVector3(x: 0, y: 0, z: 10)
        scene.rootNode.addChildNode(cameraNode)
        return scene
    }()
    scene.addChild(model)
    return scene
}(), options: [.allowsTransparency])

关于swiftui - 如何使 SceneView 的背景透明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67557700/

相关文章:

ios - SceneKit:允许相机节点沿 X 轴和 Y 轴平移

swiftui - 如何在 SwiftUI 中 View 消失时关闭 PKToolPicker?

ios - 从托管 View Controller 委托(delegate) SwiftUI View

SwiftUI:隐藏 NavigationLink 目标上的状态栏

ios - 旋转 SCNNode.pivot 后 SceneKit projectPoint 不正确

3d - 将图像映射到 3D 面部网格

swift - 使用 MVVM-Pattern 处理 SwiftUI 和 CoreLocation

macos - SwiftUI 2.0 在 macOS 上禁用窗口的缩放按钮

快速添加按钮到 SCNNode

swift - SceneKit 粒子系统未出现