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

本文主要是介绍visionOS空间计算实战开发教程Day 4 初识ImmersiveSpace,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

细心的读者会发现在在​​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:breakcase .denied:// TODObreakcase .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 incontent.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开发学习笔记​​

这篇关于visionOS空间计算实战开发教程Day 4 初识ImmersiveSpace的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/416460

相关文章

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

CSS实现元素撑满剩余空间的五种方法

《CSS实现元素撑满剩余空间的五种方法》在日常开发中,我们经常需要让某个元素占据容器的剩余空间,本文将介绍5种不同的方法来实现这个需求,并分析各种方法的优缺点,感兴趣的朋友一起看看吧... css实现元素撑满剩余空间的5种方法 在日常开发中,我们经常需要让某个元素占据容器的剩余空间。这是一个常见的布局需求

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

Nexus安装和启动的实现教程

《Nexus安装和启动的实现教程》:本文主要介绍Nexus安装和启动的实现教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Nexus下载二、Nexus安装和启动三、关闭Nexus总结一、Nexus下载官方下载链接:DownloadWindows系统根

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件

CnPlugin是PL/SQL Developer工具插件使用教程

《CnPlugin是PL/SQLDeveloper工具插件使用教程》:本文主要介绍CnPlugin是PL/SQLDeveloper工具插件使用教程,具有很好的参考价值,希望对大家有所帮助,如有错... 目录PL/SQL Developer工具插件使用安装拷贝文件配置总结PL/SQL Developer工具插

Java中的登录技术保姆级详细教程

《Java中的登录技术保姆级详细教程》:本文主要介绍Java中登录技术保姆级详细教程的相关资料,在Java中我们可以使用各种技术和框架来实现这些功能,文中通过代码介绍的非常详细,需要的朋友可以参考... 目录1.登录思路2.登录标记1.会话技术2.会话跟踪1.Cookie技术2.Session技术3.令牌技

基于Python开发一个有趣的工作时长计算器

《基于Python开发一个有趣的工作时长计算器》随着远程办公和弹性工作制的兴起,个人及团队对于工作时长的准确统计需求日益增长,本文将使用Python和PyQt5打造一个工作时长计算器,感兴趣的小伙伴可... 目录概述功能介绍界面展示php软件使用步骤说明代码详解1.窗口初始化与布局2.工作时长计算核心逻辑3