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:
                    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开发学习笔记​​

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何看待Unity新收费模式?

Unity新收费模式的变化主要在于将收费重心从功能分级收费转变为资源使用量收费,这个改变已经引起了一定的争议和反响。以下是我个人的看法: 优点: 更公平的收费方式:新的收费模式将更加公平,用户只需按照实际使用的数…

css取消移动端长按元素背景色

在开发微信小程序的时候,发现有的元素长按之后,出现了讨厌人的背景色,这就很奇怪,就想把它去掉,所以这里教一下方法: 在所在元素添加css样式: // 取消长按的背景色-webkit-tap-highlight-color:…

【Linux】Linux中的基本概念

Linux中的基本概念 1. 路径分隔符/2. 当前目录 .3. 返回上级目录 . .目录结构:多叉树 4. 路径5. 路径 { 绝对路径 相对路径 }6. * 通配符 指定路径下的所有文件7. 同级目录下,不允许存在同名文件,或者同名目录8. 命令的本质就是可执行文件9…

TypeError: expected np.ndarray (got Tensor)解决办法

文章目录 一、错误展示二、错误分析三、解决办法四、其余解决办法总结 一、错误展示 二、错误分析 这个错误表示正在尝试将一个PyTorch的Tensor对象作为numpy的ndarray对象来使用。我们需要使用numpy的ndarray而不是PyTorch的Tensor。 三、解决办法 在我的程序中去掉这一行代…

维格表项目进度同步到钉钉群

企业越来越依赖项目管理工具,以确保项目按时完成、成本控制得当、并实现预期的业务目标。但随着项目变得更加复杂,项目经理和团队需要更高效的方法来跟踪和传达项目进度,以确保团队内部保持一致的理解。 传统的项目管理方法,可能缺…

增速大幅下滑?基础L2博弈成本

在高阶智驾(从ALC到NOA)的光环之下,传统入门级基础L2级辅助驾驶赛道也在发生一些微妙的变化。 高工智能汽车研究院监测数据显示,2023年1-9月,基础L2在中国市场(不含进出口)乘用车前装标配交付45…

为了摆脱 Android ,亚马逊开发基于Linux的操作系统

导读亚马逊一直在开发一种新的操作系统 —— 内部代号为 “Vega”,以便在 Fire TV、智能显示器和其他联网设备上取代 Android 系统。 亚马逊一直在开发一种新的操作系统 —— 内部代号为 “Vega”,以便在 Fire TV、智能显示器和其他联网设备上取代 Andr…

Spring Framework IoC依赖注入-按Bean类型注入

Spring Framework 作为一个领先的企业级开发框架,以其强大的依赖注入(Dependency Injection,DI)机制而闻名。DI使得开发者可以更加灵活地管理对象之间的关系,而不必过多关注对象的创建和组装。在Spring Framework中&am…

bitmap基础介绍+holo实现离线UV计算

bitmap 基础介绍bitmaping 数据结构bitmap计算算子集成二阶段分布式计算:RoaringBitmap构造方案分桶方案建序方案 holo官网 离线UV计算创建用户映射表创建聚合结果表更新用户映射表和聚合结果表更新聚合结果表UV、PV查询 基础介绍 RoaringBitmap主要为了解决UV指标…

力扣 2. 两数相加

Problem: 2. 两数相加 思路与算法 Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this…

实验(四):指令部件实验

一、实验内容与目的 实验要求: 利用CP226实验仪上的小键盘将程序输入主存储器EM,通过指令的执行实现微程序控制器的程序控制。 实验目的: 1.掌握模型机的操作码测试过程; 2.掌握模型机微程序控制器的基本结构以及程序控制的基本原…

设计模式-命令模式-笔记

“行为变化”模式 在组件的构建过程中,组件行为的变化经常导致组件本身剧烈的变化。“行为变化”模式组件的行为和组件本身进行解耦,从而支持组件行为的变化,实现两者之间的松耦合。 经典模式:Command、Visitor 动机&#xff0…

跑出竞价的“内卷怪圈”,三季度京东物流依旧“稳操胜券”?

今年国内的物流企业内卷之势丝毫没有减弱,尽管表面上价格战已经告一段落,但各方之间依旧暗流涌动。顺丰、菜鸟接连赴港IPO,极兔成功“上岸”,新一轮的局势似乎正在形成。 近日,京东物流发布了2023年第三季度财报。从财…

Java并发编程第12讲——cancelAcquire()流程详解及acquire方法总结

上篇文章介绍了AQS的设计思想以及独占式获取和释放同步状态的源码分析,但是还不够,一是感觉有点零零散散,二是里面还有很多细节没介绍到——比如cancelAcquire()方法(重点),迫于篇幅原因,今天就…

909-2014-T3

文章目录 1.原题2.算法思想3.关键代码4.完整代码5.运行结果 1.原题 有n个顶点的无向图,使用邻接矩阵作为存储结构。为减少存储空间,使用数组按照行主映射方式仅保存下三角矩阵。请给出映射公式,并编写算法计算给定顶点的度。叙述算法思想并用…

C# - Opencv应用(2) 之矩阵Mat使用[矩阵创建、图像显示、像素读取与赋值]

C# - Opencv应用(2) 之矩阵Mat使用[矩阵创建、图像显示、像素读取与赋值] 矩阵创建图像显示与保存像素读取与赋值新建sample02项目,配置opencv4相关包,新建.cs进行测试 1.矩阵创建 //创建空白矩阵 var dst new Mat()//创建并赋…

动手学深度学习(二)---线性回归

文章目录 1.线性回归从0实现2.线性回归简洁实现【相关方法】torch.normal() 1.线性回归从0实现 从0开始实现整个方法,包括数据流水线、模型、损失函数和小批量随机梯度下降优化器 (1)导入需要的包 % matplotlib inline import random impor…

GCANet

2019、中科大港科、有代码 Chen D, He M, Fan Q, et al. Gated context aggregation network for image dehazing and deraining[C]//2019 IEEE winter conference on applications of computer vision (WACV). IEEE, 2019: 1375-1383. GitHub - cddlyf/GCANet: Implementation…

力扣每日一题-美化数组的最少删除数-2023.11.21

力扣每日一题:美化数组的最少删除数 开篇 今天的力扣每日一题居然写出来了,好开心,迫不及待地把题目分享出来,希望你也能把它狠狠拿下。 题目链接: 2216.美化数组的最少删除数 题目描述 代码思路 创建一个list集合来保存数组&a…

【Python3】【力扣题】338. 比特位计数

【力扣题】题目描述: 题解:从0到n的整数,逐一统计二进制中1的个数,记录在一个新列表中。 【Python3】代码: 1、解题思路:Python函数。 知识点:bin(...):转为二进制字符串&#xff…