VisionOS入门:创建一个简单AR的项目

5,383 阅读8分钟

visionOS是由苹果公司推出的一款全新操作系统,专为增强现实(AR)和虚拟现实(VR)设备设计。它将苹果在iOS和macOS方面的优势与最新的沉浸式技术相结合,为开发者和用户提供了一个强大且灵活的平台。本文将介绍visionOS的关键特性、开发工具以及开发应用的基本步骤。

visionOS的关键特性

  1. 高性能图形处理
    • visionOS支持Metal框架,允许开发者利用设备的图形处理单元(GPU)创建高质量的3D图形和特效。
    • 通过优化的渲染管线,visionOS能够提供流畅的视觉体验,即使在处理复杂场景时也能保持高帧率。
  2. 空间音频
    • visionOS支持空间音频技术,能够根据用户的位置和环境生成逼真的音效。
    • 开发者可以使用苹果的音频框架创建沉浸式的听觉体验,增强用户的沉浸感。
  3. 手势和眼动追踪
    • visionOS内置手势识别和眼动追踪技术,允许用户通过自然的手势和眼神来与应用互动。
    • 开发者可以利用这些输入方式设计更加直观和自然的用户界面。
  4. 高效的电源管理
    • 由于AR/VR应用通常需要高性能的计算和渲染,visionOS特别注重电源管理,延长设备的使用时间。
    • 开发者可以通过系统提供的API监控和优化应用的电源消耗。

开发工具

为了帮助开发者在visionOS上创建应用,苹果提供了一整套开发工具和框架:

  1. Xcode

    • Xcode是苹果官方的集成开发环境(IDE),支持visionOS应用的开发和调试。
    • 它提供了丰富的模板和示例项目,帮助开发者快速上手。
  2. RealityKit

    • RealityKit是一个高层次的框架,用于创建AR/VR体验。
    • 它简化了3D模型的加载、场景管理和物理模拟,允许开发者专注于应用逻辑和用户体验。
  3. ARKit

    • ARKit是苹果提供的增强现实框架,支持面部追踪、平面检测和光照估算等功能。
    • visionOS中的ARKit扩展了这些功能,使其更加适用于沉浸式体验。
  4. Swift和SwiftUI

    • Swift是苹果推荐的编程语言,语法简洁、性能优越,适合开发visionOS应用。
    • SwiftUI是一个声明式的UI框架,允许开发者使用简洁的代码构建复杂的用户界面。

创建第一个visionOS程序

截屏2024-07-29 16.32.42.png

  1. 下载最新版本的Xcode

WechatIMG193.jpg

  • 下载完成后,在xcode中创建新项目,File--New--Project
  • 选择visionOS--App

其他的几个选项跟创建普通的iOS项目一样,下面介绍一下其他几个选项

  • Initial Scence:初始化场景,有两个选项 Window 和 Volume,如果展示 2D 内容,选择 Window,3D 内容则是 Volume。
  • Immersive Space Renderer:沉浸式空间渲染器,也就是选择渲染引擎,有三个选项 None、RealityKit 和 Metal。
  • Immersive Space:沉浸式空间,包括 Mixd 、 Progressive 和 Full 。对应代码中 的selection
    • Mixd:风格将您的内容与透视融合在一起。这使您可以将虚拟物体放置在人的周围环境中。
    • Progressive:风格完全取代了部分显示中的透视效果。您可以使用这种风格让人们脚踏实地地融入现实世界,同时展示另一个世界的视角。
    • Full:样式仅显示您的内容,并关闭直通功能。这样您就可以完全控制视觉体验,就像您想将人们带入一个新世界一样。
DEMOApp: App {  

		var body: some Scene {

		WindowGroup {
			ContentView()
		}
		ImmersiveSpace(id: "ImmersiveSpace") {
			ImmersiveView()
		}.immersionStyle(selection: .constant(.full), in: .full)

		}

}

空间计算

空间计算是visionOS的核心技术之一,它使设备能够理解和互动周围的物理环境,从而为用户提供沉浸式的增强现实(AR)和虚拟现实(VR)体验。本文将详细介绍visionOS的空间计算技术,包括其工作原理、主要功能和开发应用的最佳实践。

  1. IMU(惯性测量单元) 包括加速度计、陀螺仪和磁力计,用于跟踪设备的运动和方向变化,提供精确的姿态数据。
  2. 摄像头 用于捕捉周围环境的图像和视频,帮助设备理解空间布局和物体位置。
  3. 深度传感器 测量物体与设备之间的距离,生成环境的深度图,有助于准确地定位和识别物体。

1. Immersive Space

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

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()

    }

    }

    }

    }

2. SwiftUI

SwiftUI为visionOS开发带来了强大的功能和便利,简化了用户界面和交互的创建过程。通过掌握SwiftUI的关键功能和开发技巧,开发者可以充分利用visionOS的优势,打造出引人入胜的AR和VR应用。无论是构建游戏、教育工具还是商业应用,SwiftUI都提供了一个高效且灵活的解决方案。

以下是一个简单的SwiftUI示例,展示了如何在visionOS中创建一个交互式的AR体验:

import SwiftUI
import RealityKit
import ARKit

struct ContentView: View {
    var body: some View {
        ARViewContainer().edgesIgnoringSafeArea(.all)
    }
}

struct ARViewContainer: UIViewRepresentable {
    func makeUIView(context: Context) -> ARView {
        let arView = ARView(frame: .zero)
        
        let configuration = ARWorldTrackingConfiguration()
        configuration.planeDetection = [.horizontal, .vertical]
        arView.session.run(configuration)
        
        let boxAnchor = try! Experience.loadBox()
        arView.scene.anchors.append(boxAnchor)
        
        return arView
    }
    
    func updateUIView(_ uiView: ARView, context: Context) {}
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

3. ARKit

通过设备摄像头为实时视图增添 2D 或 3D 元素,让这些元素看似存在于真实世界中一般,这就是“增强现实 (AR)”所指的用户体验。ARKit 结合运用设备运动跟踪、摄像头场景捕捉、高级场景处理和显示便捷性,简化了打造 AR 体验的工作。你可以使用这些技术,通过 iOS 设备的前置或后置摄像头打造各种不同的增强现实体验。

ARKit的关键功能

  1. 平面检测

    • ARKit能够检测水平和垂直的平面,如地板、桌面和墙壁。开发者可以将虚拟物体放置在这些平面上,从而创建与现实世界互动的AR体验。
  2. 图像和物体识别

    • ARKit支持识别预定义的图像和3D物体。当摄像头捕捉到这些图像或物体时,ARKit可以在其上叠加虚拟内容。
  3. 人脸追踪

    • ARKit能够精确追踪用户的面部表情和动作,适用于创建面部滤镜、动画角色等互动内容。
  4. 运动追踪

    • ARKit利用设备的IMU(惯性测量单元)实时追踪设备的位置和运动,使得虚拟物体可以与用户的移动保持同步。
  5. 环境光估算

    • ARKit能够估算环境的光线强度和方向,并据此调整虚拟物体的光照效果,使其更加真实和自然。

主要组件

  1. ARSession

    • ARSession是ARKit的核心组件,用于管理AR体验的生命周期和配置。开发者可以通过ARSession启动、暂停和停止AR会话,并获取环境数据。
  2. ARConfiguration

    • ARConfiguration用于配置ARSession的设置,如平面检测、图像识别和环境光估算等。常用的配置类包括ARWorldTrackingConfiguration和ARFaceTrackingConfiguration。
  3. ARAnchor

    • ARAnchor表示现实世界中的一个位置或物体。开发者可以创建自定义锚点,或者使用系统自动检测的平面锚点和图像锚点。
  4. ARSCNView和ARSKView

    • ARSCNView是ARKit与SceneKit结合的视图,用于渲染3D内容。ARSKView是ARKit与SpriteKit结合的视图,用于渲染2D内容。

开发示例

以下是一个简单的ARKit示例,展示了如何在visionOS中创建一个基本的AR应用:

import SwiftUI
import ARKit
import RealityKit

struct ContentView: View {
    var body: some View {
        ARViewContainer().edgesIgnoringSafeArea(.all)
    }
}

struct ARViewContainer: UIViewRepresentable {
    func makeUIView(context: Context) -> ARView {
        let arView = ARView(frame: .zero)
        
        // 配置AR会话
        let configuration = ARWorldTrackingConfiguration()
        configuration.planeDetection = [.horizontal, .vertical]
        arView.session.run(configuration)
        
        // 加载RealityKit场景
        let boxAnchor = try! Experience.loadBox()
        arView.scene.anchors.append(boxAnchor)
        
        return arView
    }
    
    func updateUIView(_ uiView: ARView, context: Context) {}
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

ARKit在visionOS中提供了强大的功能,使得开发者可以创建丰富和互动的AR体验。通过理解ARKit的关键功能和主要组件,开发者可以充分利用visionOS的硬件优势,打造出令人惊叹的AR应用。无论是在游戏、教育、医疗还是商业领域,ARKit都有广泛的应用前景,为用户带来前所未有的沉浸式体验。

作者:洞窝-王宁