swiftui - 如何使 SceneView 的背景透明?
问题描述
我想打开一个 3D 模型并使其背景透明,以便我可以看到 SceneView 后面的 UI。我试过这段代码,但场景视图变成白色,不透明。
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 设置为清除
老的:
感谢 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])
推荐阅读
- android-studio - Listview 重定向页面
- reactjs - React 'Cannot GET /' 突然出现,代码没有任何变化
- jfreechart - Jfreechart优化X轴标签
- javascript - CrystalLive™ Color 下的卡片与其他卡片的尺寸不同
- python - 问题加载 PYOMO。我不能使用 Pyomo
- react-native - 获取函数响应中无法识别的令牌
- html - 如何使滚动可见
- android - 如何在 Firestore 中获取服务器时间戳?
- node.js - 为什么在 sequelize 的 createTable 函数中忽略了 allowNull (false) 选项
- css - CSS minmax():优先考虑最大值