visionOS空间计算实战开发教程Day 4 初识ImmersiveSpace

news2024/11/14 2:25:18

细心的读者会发现在在​​Day1​​​和​​Day2​​​的示例中我们使用的都是​​WindowGroup​​。

@main
struct visionOSDemoApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

本节我们来认识在visionOS开发中会经常用到的另一个概念​​ImmersiveSpace​​。

沉浸式空间为内容提供了一个无界的区域,可在空间内控制内容的大小和摆放位置。在获取用户的授权后,我们还可以使用开启了沉浸空间的ARKit来将内容集成到周遭环境中。例如,可以使用ARKit场景重建来获取家具的网格(mesh)及其附近的对象,让内容可以与网格进行交互。

visionOS空间计算实战开发教程Day 4 初识ImmersiveSpace

首先我们需要创建一个​​ViewModel.swift​​文件用于进行内容的相关配置。

import SwiftUI
import RealityKit
import ARKit

@MainActor class ViewModel: ObservableObject {
    private let session = ARKitSession()
    private let worldTracking = WorldTrackingProvider()
    private var contentEntity = Entity()
    
    func setupContentEntity() -> Entity {
        let box = ModelEntity(mesh: .generateBox(width: 0.5, height: 0.5, depth: 0.5))
        contentEntity.addChild(box)
        return contentEntity
    }
    
    func runSession() async {
        print("WorldTrackingProvider.isSupported: \(WorldTrackingProvider.isSupported)")
        print("PlaneDetectionProvider.isSupported: \(PlaneDetectionProvider.isSupported)")
        print("SceneReconstructionProvider.isSupported: \(SceneReconstructionProvider.isSupported)")
        print("HandTrackingProvider.isSupported: \(HandTrackingProvider.isSupported)")
        
        Task {
            let authorizationResult = await session.requestAuthorization(for: [.worldSensing])
            
            for (authorizationType, authorizationStatus) in authorizationResult {
                print("Authorization status for \(authorizationType): \(authorizationStatus)")
                switch authorizationStatus {
                case .allowed:
                    break
                case .denied:
                    // TODO
                    break
                case .notDetermined:
                    break
                @unknown default:
                    break
                }
            }
        }
        
        Task {
            try await session.run([worldTracking])
            
            for await update in worldTracking.anchorUpdates {
                switch update.event {
                case .added, .updated:
                    print("Anchor position updated.")
                case .removed:
                    print("Anchor position now unknown.")
                }
            }
        }
    }
}

在​​setupContentEntity​​​方法中,我们通过​​ModelEntity​​​创建了一个模型实体,其中对​​mesh​​​参数使用​​MeshResource.generateBox​​创建了一个立方体,可使用参数的说明如下:

  • mesh: 定义模型几何形状的网格。
  • materials: 定义模型外观的材质资源。
  • collisionShape: 定义合成碰撞开关的形状资源集合。
  • mass: 按公斤计的模型质量。

另一个异步方法​​runSession​​​用于进行配置和授权的处理,其中包含两个​​Task​​。

通常我们会创建一个​​ImmersiveView​​来显示沉浸空间的效果,但本例我们都放到了入口文件中:

import SwiftUI
import RealityKit

@main
struct visionOSDemoApp: App {
    @StateObject var model = ViewModel()
    
    var body: some SwiftUI.Scene {
        ImmersiveSpace {
            RealityView { content in
                content.add(model.setupContentEntity())
            }
            .task{
                await model.runSession()
            }
        }
    }
}

注意因为这里导入了​​RealityKit​​​,所以为避免歧义我们使用了​​SwiftUI.Scene​​​,然后在主体内容中是一个​​RealityView​​​,其中添加了我们在​​ViewModel​​​中所创建的立方体,同时使用异步任务去执行授权部分的​​runSession()​​方法。

代码部分就是这么多,但在运行应用前我们还要配置一下​​Info.plist​​​文件,我们需要将​​Preferred Default Scene Session Role​​​选项修改为​​Immersive Space Application Session Role​​:

Immersive Space Application Session Role

这时运行应用就会看到本文前面显示的效果,最后我们再来了解一个调试的工具,在代码区下方点击图标即可打开Visualizations弹窗,通过显示检测到表面、遮挡和锚点等来辅助我们的开始,我们的示例图片便是勾选了​​Surfaces​​之后的效果。

Xcode visualizations

示例代码:​​GitHub仓库​​

其它相关内容请见​​虚拟现实(VR)/增强现实(AR)&visionOS开发学习笔记​​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1237492.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

跑步耳机哪种好?运动耳机什么牌子好?无线运动耳机品牌排行

​运动健身已经成为当下最热门的运动健康项目,越来越多的人开始加入到这个行列中来。而在运动的过程中,佩戴一款适合自己的运动耳机听歌,不仅可以增加运动的乐趣,还能帮助我们更好地集中注意力,提高运动效果。然而&…

Talk | PSU助理教授吴清云:AutoGen-用多智能体对话开启下一代大型语言模型应用

本期为TechBeat人工智能社区第548期线上Talk! 北京时间11月21日(周二)20:00,宾夕法尼亚州立大学助理教授—吴清云的Talk已准时在TechBeat人工智能社区开播! 她与大家分享的主题是: “ AutoGen:用多智能体对话开启下一代大型语言模…

安卓毕业设计基于安卓android微信小程序的大学生心理测试系统

运行环境 开发语言:Java 框架:ssm JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包&a…

7.5寸电子会议桌牌

银色外框设计,高端大气~ 超低功耗,常规使用寿命3-5年! 点阵电子纸屏幕,实现完全无纸化,循环使用,绿色环保! 四色/七色清晰显示,内容更丰富。 一次投入,省时省力更省事&#xff0…

2023年中国工业炉分类、产量及市场规模分析[图]

工业炉是指在工业生产中利用燃料燃烧或电能等转换产生的热量,将物料或工件进行熔炼、熔化、焙(煅)烧、加热、干馏、气化等的热工设备;广泛应用于机械、冶金、化工及陶瓷等国民经济的各行各业,具有生产效率高、产品质量…

开发上门按摩系统对技师如何管理,薪资结构怎么设计

开发完上门按摩系统平台上线之后,对技师的管理和薪资结构是非常重要的环节,关乎着平台的服务能力和服务质量,那么应该如何去管理和设计薪资结构呢 首先说技师管理: 一、培训和认证:平台应对技师进行全面的培训&#xf…

2023年中国感应电炉产业链、产量、销量及市场规模分析[图]

感应电炉行业定义是指使用电磁感应原理,通过感应电流使金属工件在短时间内达到预定温度的工业设备。广泛应用于冶金、机械、汽车、航空、航天、船舶、电子、医疗器械等领域。 感应电炉行业产业链 资料来源:共研产业咨询(共研网) …

docker部署jdk21的镜像

docker Docker是一种开放源代码软件,可以帮助开发人员更轻松地创建、部署和运行应用程序。它是一种容器化技术,可以将应用程序及其依赖项打包在一个容器中,从而使应用程序更加便携和可移植。Docker将操作系统、应用程序和硬件虚拟化进行了彻底…

CRM中线索的概念和使用技巧

CRM中线索是什么?如何管理线索?CRM系统中线索通常指通过展会、线上、广告等方式获取到的原始客户信息。这些潜在的客户信息经过市场培育、SDR筛选,进而成为一个合格商机。下面我们从3个方面介绍什么是线索管理。 1.线索来源 线索来源渠道非…

HC32L110小华半导体SWD模式切换的问题

在将SWD配置为普通引脚并配置为输出后,如果需要重新配置为SWD,需要将其配置为输入才行,如下: Clk_SetFunc(ClkFuncSwdPinIOEn, TRUE); //配置SWD引脚为普通引脚模式 Gpio_InitIOExt(SWCLK_PORT, SWCLK_PIN, GpioDirOut, TRUE,…

2023年中国雷达设备市场规模及市场份额分析[图]

雷达设备行业是一种利用无线电波对目标进行探测和定位的技术,也被称为无线电探测和定位。雷达通过发射电磁波对目标进行照射并接收其回波,经波形处理后获取目标的位置和速度等信息。雷达具有探测距离远,测定精度高,不受天气和地形…

MP3音频文件体积怎么缩小?压缩的方法有哪些?

压缩音频文件可减小文件的大小,从而更轻松地上传到其他平台,或轻松的通过电子邮件进行分享。除此之外,压缩音频文件还可以节省硬盘上的储存空间。那MP3音频文件体积怎么缩小呢?继续阅读可查看压缩的详细流程。 什么是音频文件压缩…

孟德尔随机化(MR)入门介绍和分章分享(暂时不解读)

大家好,又见生信小博士 孟德尔随机化简介: 孟德尔随机化是一种实验设计和数据分析方法,也被称为随机分组设计或随机化对照试验。它由奥地利科学家格里高利孟德尔在19世纪中期首次应用于遗传学实验,用于研究植物遗传性状的传递。 …

C语言--输入三角形的三边,输出三角形的面积

一.题目描述 输入三角形的三边,输出三角形的面积。比如:输入三角形的三边长度是3,4,5.输出6 二.思路分析 利用海伦公式可以很好解决 海伦公式的表达式如下: s (a b c) / 2 面积 sqrt((s * (s - a) * (s - b) * (…

关键性进展! 小米造车露真容 预计明年上市

大家好,我是极智视界,欢迎关注我的公众号,获取我的更多前沿科技分享 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码和资源下载,链接:https://t.zsxq.com/0aiNxERDq 小米在各种不同的产品上都在不断打上自己的品牌,这绝对不止于智能手机,而是有智能…

HT5169 单声道D类音频功放 I2S输入

HT5169是一款内置BOOST升压模块的D类音频功率放大器。内置的BOOST升压模块可通过外置电阻调节升压值,即使是锂电池供电,在升压至7.5V,2Ω负载条件下则能连续输出 11W功率。其支持外部设置调节BOOST输出电压。 HT5169是一颗单声道D类音频功放&…

Oracle数据库安装踩坑记录

Oracle数据库安装踩坑记录 踩坑目录 可能会用到的教程1. 管理员用户(sys)登录oracle命令2. 默认密码:三个 如果忘记改密码参考 1. 登录后修改密码3. 查看账号密码:只有sys用户登录后才能查看4. sqldeveloper 连接oracle数据库5. o…

华为云cce健康检查有什么用?配置需要注意什么?

华为云cce健康检查 如上图,华为云健康检查可用来探测cce的实例运行状态,必要时cce会自动重启实例,达到cce持续服务。 但是配置时需要注意一下几个方面,否则cce的状态总是有些不正常。 1、http探查比较友好。因为我们的在cce里面…

HT560 30W 过温限幅 D类音频功率放大器

HT560具有过温限幅功能,当芯片内部温度达到过温限幅点,HT560自动降低增益,使其IC能够连续播放而不间断。另外,HT560具有功率限制功能,一种是限幅功能,在输出端限制一定的输出幅度,使其不损坏喇叭…