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


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

    1. @main
    2. struct visionOSDemoApp: App {
    3. var body: some Scene {
    4. WindowGroup {
    5. ContentView()
    6. }
    7. }
    8. }

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

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

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

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

    1. import SwiftUI
    2. import RealityKit
    3. import ARKit
    4. @MainActor class ViewModel: ObservableObject {
    5. private let session = ARKitSession()
    6. private let worldTracking = WorldTrackingProvider()
    7. private var contentEntity = Entity()
    8. func setupContentEntity() -> Entity {
    9. let box = ModelEntity(mesh: .generateBox(width: 0.5, height: 0.5, depth: 0.5))
    10. contentEntity.addChild(box)
    11. return contentEntity
    12. }
    13. func runSession() async {
    14. print("WorldTrackingProvider.isSupported: \(WorldTrackingProvider.isSupported)")
    15. print("PlaneDetectionProvider.isSupported: \(PlaneDetectionProvider.isSupported)")
    16. print("SceneReconstructionProvider.isSupported: \(SceneReconstructionProvider.isSupported)")
    17. print("HandTrackingProvider.isSupported: \(HandTrackingProvider.isSupported)")
    18. Task {
    19. let authorizationResult = await session.requestAuthorization(for: [.worldSensing])
    20. for (authorizationType, authorizationStatus) in authorizationResult {
    21. print("Authorization status for \(authorizationType): \(authorizationStatus)")
    22. switch authorizationStatus {
    23. case .allowed:
    24. break
    25. case .denied:
    26. // TODO
    27. break
    28. case .notDetermined:
    29. break
    30. @unknown default:
    31. break
    32. }
    33. }
    34. }
    35. Task {
    36. try await session.run([worldTracking])
    37. for await update in worldTracking.anchorUpdates {
    38. switch update.event {
    39. case .added, .updated:
    40. print("Anchor position updated.")
    41. case .removed:
    42. print("Anchor position now unknown.")
    43. }
    44. }
    45. }
    46. }
    47. }

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

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

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

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

    1. import SwiftUI
    2. import RealityKit
    3. @main
    4. struct visionOSDemoApp: App {
    5. @StateObject var model = ViewModel()
    6. var body: some SwiftUI.Scene {
    7. ImmersiveSpace {
    8. RealityView { content in
    9. content.add(model.setupContentEntity())
    10. }
    11. .task{
    12. await model.runSession()
    13. }
    14. }
    15. }
    16. }

    注意因为这里导入了​​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开发学习笔记​

  • 相关阅读:
    【RabbitMQ】常用消息模型详解
    java任务跟踪系统
    添砖Java之路(其六)——通过集合制作的学生信息管理系统
    排序算法-选择排序
    【云享·人物】华为云AI高级专家白小龙:AI如何释放应用生产力,向AI工程化前行?
    Javascript知识【validation插件重写表单注册校验】
    Object.assign()使用
    微服务--Seata(分布式事务)
    7、如何使用Flink中的窗口(Window算子)
    服务器(Linux)配置node环境及运行ts文件(express框架)
  • 原文地址:https://blog.csdn.net/ardor123/article/details/134545039