如何让SceneView的背景透明?

2023-11-25

我想打开一个 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。

EDIT 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])
}

我无法在这里找到完整的工作片段,但是感谢 Arutyun 的回答,我成功地编译了一个工作解决方案,而无需SpriteKit.

import SceneKit
import SwiftUI

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.backgroundColor = UIColor.clear // this is key!
        view.allowsCameraControl = true
        view.autoenablesDefaultLighting = true
        // load the object here, could load a .scn file too
        view.scene = SCNScene(named: "model.obj")!
        return view
    }
}

并像常规视图一样使用它:

import SwiftUI

struct MySceneView: View {
    var body: some View { 
        ZStack{
            // => background views here
            MySceneView()
                .frame( // set frame as required
                    maxWidth: .infinity,
                    maxHeight: .infinity,
                    alignment: .center
                )
        }
    }
}

struct MySceneView_Previews: PreviewProvider {
    static var previews: some View {
        MySceneView()
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让SceneView的背景透明? 的相关文章

  • 如何在 SwiftUI 中管理 AVPlayer 状态

    我有 SwiftUI 中的 URL 列表 当我点击某个项目时 我会呈现一个全屏视频播放器 我有一个 EnvironmentObject它处理一些查看器选项 例如 是否显示时间码 我还有一个显示和隐藏时间码的切换开关 我只在本例中包含了该切换
  • 将相机移动到点击的 SCNNode

    我在用着SceneKit and Swift尝试移动相机 使其 聚焦 在所选节点上 我知道我启用了 defaultCameraController 但我试图通过调整相机的位置dolly rotate and translateInCamer
  • 检查SCNNode SCNAction是否完成

    我创建了一个 SceneKit 3D 迷宫世界 玩家可以在其中移动 有些动作 例如跳跃 涉及上下移动相机 同时在几秒钟的时间内改变视角方向 在此期间 我想忽略用户的点击和滑动 这通常会导致其他类型的运动 例如转身和向前移动 我可以创建一个与
  • 在 swiftUI 中捕获 onLongPressGesture 的 touchDown 位置?

    我正在尝试实现一个自定义上下文菜单 该菜单将在用户触摸的位置长按后出现 我一直无法找到一种方法来捕获 onLongPressGesture 的触地事件的 XY 位置 这就是我开始的地方 struct ExampleView View Sta
  • 返回列表 (SwiftUI) 后,选定的列表行背景保持灰色(选定)。 iOS 14 + Xcode 12

    从详细信息视图返回后 所选行保持灰色 在模拟器和真实设备上都会发生 仅在 iOS 14 上 有谁知道如何删除它 使其行为与 iOS 13 上相同 不保持选中状态 这是项目中唯一的代码 没有其他导航或任何东西 let items item1
  • Swiftui,按钮网格视图

    我在这里检查了有关网格视图的几个问题 但我的问题有点不同 我想为按钮创建一个网格视图 以便每个按钮按下时导航到不同的视图 所以它看起来像这样 这是网格按钮视图 https i stack imgur com Q6WWB jpg 所以我在这里
  • 为什么我的matchedGeometryEffect根据右下点移动?

    我只是尝试使用matchedGeometryEffect 制作一些动画 但是 存在一个错误 即该对象是根据右下点而不是中心进行动画处理的 我使用的代码在这里 import SwiftUI struct Test View Namespace
  • 理解 UIViewRepresentable

    斯威夫特 5 0 iOS 13 尝试了解 UIViewRepresentable 的工作原理 并将这个简单的示例放在一起 几乎就这样了 但也许完全是无稽之谈 是的 我知道 SwiftUI 中已经有一个 tapGesture 这只是一个测试
  • SceneKit unproject Z 文档解释?

    我正在经历一些 SceneKit 概念 而我试图在脑海中巩固的一个概念是 unprojectPoint 我知道该函数将获取 2D 中的一个点并返回 3D 中的一个点 因此具有正确的 Z 值 当我阅读文档时 我读到了以下内容 method u
  • viewController 中的 Sprite 粒子系统动画

    I create a macOS single window application and add a Sprite Particle System file with template Stars and the visual effe
  • 致命错误:在字典中发现“地理编码地标”类型的重复键。 (Mapbox 地理编码器)

    我引用 这通常意味着要么该类型违反了 Hashable 的要求 要么此类字典的成员在插入后发生了变化 我正在使用 Mapbox Geocoder 当发生此运行时错误时 我的 XCode 将我带到线程 1 0 swift runtime on
  • 导航栏隐藏在 SwiftUI 中不起作用

    我有三观 我想隐藏第三个视图中的导航栏 即使我给 navigationBarHidden true 导航栏正在显示 我找不到我哪里做错了 我已在下面附上我的代码和生成的屏幕截图 Xcode 版本 11 1 struct ContentVie
  • 在 WidgetKit 中每分钟更新时间文本标签

    是否可以在小部件中创建显示当前时间并实时更新的文本标签 尝试创建时钟小部件 但小部件每 5 分钟仅更新 1 次 创建时间表没有帮助 使小部件保持最新 不适用于当前时间 仅适用于计时器等 一个可能的解决方案是使用time日期样式 A styl
  • 如何跟踪 SwiftUI 应用程序中的所有触摸

    我正在尝试在 SwiftUI 应用程序中实现锁屏 我需要跟踪每个事件才能重新启动锁定计时器 在 UIKit 应用程序中 我使用了这种方法 重写 UIApplication 它允许了解应用程序中的任何事件 override func send
  • 如何在 SwiftUI 中将变量从一个视图传递到另一个视图

    我正在尝试将一个变量从一个视图传递到 SwiftUI 中的另一个视图 我有一个重置按钮 我想在另一个视图中将变量设置为零 我尝试在视图一中创建一个新结构并在视图2中访问该变量 View 1 State var count MyNumber
  • 带有自定义 init 的 SwiftUI 视图

    假设我正在制作一个如下所示的自定义输入元素 struct CustomInput View Binding var text String var name String var body some View TextField name
  • 如何将 SCNPlane 颜色更改为透明颜色

    我正在开发一个 ARKit 项目 在水平面上点击时需要波纹动画效果 为此 我采用了 UIView 对象并将其作为 SCNPlane 对象材料的内容传递 我已将波纹动画添加到 UIView 对象 一切正常 但我无法将 SCNPlane 颜色更
  • SwiftUI - 使用“ObservableObject”和@EnvironmentObject 有条件地显示视图

    我想在我的应用程序中有条件地显示不同的视图 如果某个布尔值为 true 则将显示一个视图 如果为 false 将显示不同的视图 该布尔值位于 ObservableObject 类中 并根据将要显示的视图之一进行更改 PracticeStat
  • Godot 接管了 Xcode 中的 .scn 文件 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 最近安装了Godot 现在 Xcode 将不会预览 scn 文件 我无法将类型更改回 SceneKit 因为它在下拉列表中不可用 尝试这个
  • SwiftUI 从一个列表拖动到另一个列表

    我正在尝试在列表之间拖放 我尝试过的 我找到了一个在 UIKIt 中执行此操作并使用 UIViewControllerRepresentable 的解决方案 但这不是我想要的 另一个解决方案是在列表上使用 onDrag 但这在 iPad 上

随机推荐

  • 转义 hstore 包含 JDBC 准备语句中的运算符

    我正在使用带有 hstore 的 PostgreSQL 9 1 4 和PostgreSQL 的 JDBC驱动程序 9 1 901 jdbc4 我正在尝试使用包含运算符 在PreparedStatement中 但是 字符被解析为变量占位符 是
  • Webdriver.io 因 NoSessionIdError 崩溃

    我正在尝试让 webdriver io 和 Jasmine 工作 下列的他们的例子 我的脚本位于test specs first test2 js 根据配置 并包含 var webdriverio require webdriverio d
  • moment-duration-format.d.ts 定义不扩展 Moment 模块

    知道为什么这不起作用或者如何扩展持续时间接口以支持格式功能吗 declare module moment interface Duration format template string precision string settings
  • 导入错误:没有名为 win32api 的模块

    我正在使用 Python 2 7 并且我想使用pywin32 214在 Windows 7 上 我安装了pywin32 214通过使用 MSI 安装程序 但是当我导入时win32api在我的 Python 脚本中 它抛出错误 no modu
  • 如何将多行插入到 SQL Server 并行数据仓库表中

    我使用的是带有 SQL Server 2012 服务器的 PDW AU5 我有一个空的复制表 我正在尝试将数据加载到其中 我只加载 2 条记录 所以 我正在做 INSERT INTO dbo some table Col1 Col2 Col
  • TFS API - 有没有办法获取工作项类型的转换列表?

    我正在尝试从状态 A 到达状态 X 有一些过渡阻止我直接进入 X 我可以将 WorkItemType 导出为 XML 并进行处理 但在这样做之前 我想先问问是否有办法通过 API 获取转换 呜呜 没有多少人需要 WorkItemType 的
  • 如何使用 C API 设置 MySQL 查询超时

    我知道这里有很多类似的问题 当我用谷歌搜索时也有很多结果 但没有一个回答我的问题 我读this this this and this但它们都不适合我 我不谈论任何锁 我不想使用 MySQL C 连接器 只想使用 C API 来做到这一点 另
  • 如何保护 Sitecore 内容树中的整个分支?

    我的内容树中有一个部分 我想拒绝除特定角色之外的所有权限 这似乎是一个非常明显的任务 但我在安全管理员食谱中没有看到它的示例 并且我无法找到使用安全工具来完成此操作的简单方法 我一定错过了一些明显的东西 假设我有这个 sitecore co
  • 如何使用 C# 从字符串中获取特定字符位置

    这是非常基本的问题 但我无法找到特定角色的位置 例如 string a ABCDE 我想要上面字符串中 E 的位置 Use IndexOf var pos a IndexOf E
  • Intellij idea插件开发-热重载?

    我正在为 intellij idea 创建一些插件 每次更改代码时 我都需要重新运行应用程序 有类似热重载或类似的东西吗 或者更有效的方法 我相信您正在寻找运行 gt 重新加载更改的类 通常只要进行一些小的改变就可以很好地工作
  • 使用 Jquery 进行时间验证

    我在用jquery 验证插件验证我的表格 要验证文本输入 我所做的就是编写class required 在属性中 它为我进行验证 现在我正在尝试验证用户必须输入时间 如 02 45 00 AM 的输入 但我正在使用的插件没有任何时间验证功能
  • 如何在 DropWizard 中维护用户会话?

    我正在寻找一个持久会话管理器 它将会话保存在可与 DropWizard 一起使用的文件系统 如 PHP 上 我看到有一个Environment getSessionHandler 但我没有看到任何相关文档 我可以自己写 但我希望能吃到一顿熟
  • 尽快将PageTransformer应用到PagerView

    我将 PageTransfomer 应用于 ViewPager 效果很好 但我想在将 PageTransformer 设置为 ViewPager 后立即启动页面的转换 我已经尝试过 设置当前项目 int setCurrentItem int
  • 使用 Python 时,这段代码中的“wb”是什么意思?

    Code file pinax media a jpg wb 文件模式 写入和二进制 由于您正在编写 jpg 文件 因此看起来不错 但是如果你想读取 jpg 文件 你需要使用 rb 更多信息 在 Windows 上 b 附加到模式后 以二进
  • 将 JTextArea 复制为“text/html”DataFlavor

    我有一个JTextArea我正在使用Highlighter按照下面的 SSCCE 对我的某些文本应用一些语法突出显示 import java awt import java awt event import javax swing impo
  • 如何在 Activity 和 widget 之间共享数据?

    我阅读了 hellowidget 教程和开发指南的应用程序小部件 然后我知道如何创建一个包含按钮或文本或其他内容的小部件 但我真正想做的是让它与我的应用程序交互 例如 我想创建一个具有文本视图的小部件 当我单击它时 它会向我的活动发送一个
  • 查找已安装的 JDBC 驱动程序

    我正在用 Java 编写一个数据库验证工具 并具有首选项屏幕 以便用户可以定义他们的数据库连接 该工具至少应该能够处理 DB2 Oracle Postgresql 和 Mysql 我真正想要的是能够向用户展示他们已安装的 jdbc 驱动程序
  • 如何在 iOS 9 中的 UIAlertController 中添加按钮

    我们如何使用UIAlertView在 iOS 9 中以及如何添加按钮UIAlertController UIAlertController alert UIAlertController alertControllerWithTitle T
  • 为什么 Eclipse 的 Android 设备选择器不显示我的 Android 设备?

    我正在使用 Eclipse 的 Android 插件 当我尝试通过真实设备运行我的程序时Android 设备选择器 我的手机未列为设备 我已经更新了 Eclipse 所有 Android 软件包和 USB 驱动程序 但它仍然没有显示 我的手
  • 如何让SceneView的背景透明?

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