RealityKit深入浅出之ARView

概述

本部分内容是针对RealityKit的研究,旨在了解RealityKit的模型绘制过程,熟悉API的使用。本篇内容是针对ARView的初始化过程的探索,对过程解析,相关代码可以移步Github下载code -> github案例链接

ARView介绍

ARView是一个用于增强现实(AR)应用程序开发的视图组件。使用ARView实例来向用户显示渲染的3D图形。通常,会在应用程序storyBoard中添加一个视图,然后在代码中提供该视图的输出口。或者,可以在运行时以编程的方式创建并并添加一个视图到视图层次结构中,就像创建其他的视图一样。

视图具有一个只读的scene属性,通过它可以访问一个Scene实例。可以向的Scene实例添加一个或多个AnchorEntity实例,这些实例告诉视图的AR会话如何将内容关联到现实世界的某个物体上。对于每个锚点,可以附加一个包含场景内容的其他Entity实例的层次结构。此外,可以使用该视图完成以下操作:

  • 配置渲染选项、环境特性和相机模式。

  • 处理平台使用的用户交互,例如鼠标、键盘和手势输入。

  • 在视图中找到特定点处的实体。

  • 访问统计数据和可视化工具,帮助调试你的应用程序。

ARView的结构

我这里分为三部分来切割的ARView的数据额结构,其中ARView继承ARViewBase。public typealias ARViewBase = UIView 是Swift中的一个类型别名(type alias)的声明。它将 ARViewBase定义为 UIView的别名,这意味着在代码中使用ARViewBase时,它将被视为 UIView 类型的一个别名,完全等同于UIView。

Property

initialization

Functions

init(frame:) 初始化

因为我在SwiftUI中做的案例,所以将ARView包装成SwiftUI的视图了。

Swift 复制代码
//常规序列化
struct FFARViewContainer: UIViewRepresentable {
    func makeUIView(context: Context) -> some UIView {
        //初始化ARView
        let arView = ARView(frame: .zero)
        //创建一个scene实例
        let scene = arView.scene
        //在scene中创建一个entity
        let entity = ModelEntity(mesh: .generateBox(size: 0.25), materials: [SimpleMaterial(color: .green, isMetallic: false)])
        //创建AnchorEntity并将ModelEntity添加到其中。
        let anchorEntity = AnchorEntity(world: [0,0,-0.5])
        anchorEntity.addChild(entity)
        //将anchorEntity添加到场景的锚点集合中
        scene.anchors.append(anchorEntity)
        return arView
    }
    
    func updateUIView(_ uiView: UIViewType, context: Context) {
        
    }
}

struct FFARView: View {
    var body: some View {
        //init(frame:):创建具有制定尺寸、相机模式和会话配置状态的AR视图
        VStack {
            Text("ARView Above")
            FFARViewContainer()
                .frame(width: 300, height: 400)
            Text("ARView Below")
        }
    }
}

调试结果

指定更多参数序列化 init(frame:cameraMode:automaticallyConfigureSession:)

指定具体参数初始化:

  • frame:视图帧矩形,以点(point)为单位来测量
  • camerMode:指示是否使用设备的摄像头或虚拟摄像头
  • automaticallyConfigureSession:指示是否使用具有根据摄像头模式和场景锚点自动更新的配置的AR会话。如果想要手动使用自己的配置来运行会话,将此Bool值设置为false。
Swift 复制代码
struct FFARViewArgumentContainer: UIViewRepresentable {
    func makeUIView(context: Context) -> some UIView {
        //初始化ARView
        let arView = ARView(frame: .zero, cameraMode: .ar, automaticallyConfigureSession: true)
        //创建一个scene实例
        let scene = arView.scene
        //在scene中创建一个entity
        let entity = ModelEntity(mesh: .generateBox(size: 0.5), materials: [SimpleMaterial(color: .red, isMetallic: false)])
        //创建AnchorEntity并将ModelEntity添加到其中。
        let anchorEntity = AnchorEntity(world: [0,0,-0.5])
        anchorEntity.addChild(entity)
        //将anchorEntity添加到场景的锚点集合中
        scene.anchors.append(anchorEntity)
        return arView
    }
    
    func updateUIView(_ uiView: UIViewType, context: Context) {
        
    }
}

struct FFARViewArgument: View {
    var body: some View {
        //参数说明:
        //- frameRect: 视图的帧矩形,以点(point)为单位来测量
        //- camerMode: 指示是否使用设备的摄像头或虚拟摄像头。
        //- automaticallyConfigureSession:指示是否使用具有根据摄像头模式和场景猫店自动更新的配置的AR会话。如果想要手动使用自己的配置来运行会话,将此值设置为false
        VStack {
            Text("ARView Above")
            FFARViewArgumentContainer()
                .frame(width: 300, height: 300)
            Text("ARView Below")
        }
    }
}

调试结果

Scene

ARView自带一个只读属性的Scene实例,scene属性是用于描述ARView所呈现和模拟的3D场景的属性。这个场景是用于显示AR内容的关键部分,通过向场景的anchors集合中添加AnchorEntity实例来提供场景的内容。上述的例子就是这样操作的,添加流程为

ModelEntity -> AnchorEntity -> anchors -> scene -> ARView -> 呈现页面

本部分内容仅解析Scene相关部分,ModelEntity与AnchorEntity后续会详细解析。

数据结构

它用于存储AR视图中渲染的虚拟实体,通常情况下不需要直接创建 Scene 实例,而是通过 ARViewscene 属性来访问与视图关联的唯一场景。要向视图的场景添加内容,首先创建并添加一个或多个 AnchorEntity 实例到场景的 RealityKit/Scene/anchors 集合中。Scene 类是RealityKit中的一个关键组件,用于管理AR视图中渲染的虚拟实体集合。可以使用它来添加、删除锚点、搜索实体以及管理AR场景中的内容。

通过这幅图再来理解scene就非常简单了,scene的本身就是一张表,属性上标注了表名(name),还有表内元素(anchors)。剩下的函数就是表的增删改查了。推测下层结构scene是一张表。

ARView的实例构成

要将内容添加到视图的场景中,首先创建一个或多个 AnchorEntity 实例并将其添加到场景的锚点集合中。 锚点告诉 RealityKit 如何将虚拟内容固定到现实世界的对象,例如平面或图像。 然后,可以向每个锚点添加其他实体实例的层次结构,以指示 RealityKit 应在给定锚点处呈现的几何图形和行为。

说明:此张图搬运来自Apple

总结

关于ARView的内容,是一个视图容器,使它具有此功能的是scene属性。scene不需要自己创建,ARView初始化自带。如果想向视图中添加虚拟对象,首先要创建Entity,然后在创建AnchorEntity,她的作用是标记entity在空间的位置,也就是AnchorEntity(world: [0,0,-0.5])此行代码,[0,0,-0.5] -> [x,y,z],到此,anchorEntity就被标记为一个锚点,然后将其添加到scene这个锚点集合的容器中scene.anchors.append(anchorEntity),最后被呈现在视图中了。

这个过程是最为简易的AR视图的绘制。

参考资料

RealityKit - https://developer.apple.com/documentation/realitykit

相关推荐
大熊猫侯佩12 小时前
由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(五)
swiftui·swift·apple watch
大熊猫侯佩2 天前
由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(三)
数据库·swiftui·swift
大熊猫侯佩2 天前
由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(二)
数据库·swiftui·swift
大熊猫侯佩2 天前
用异步序列优雅的监听 SwiftData 2.0 中历史追踪记录(History Trace)的变化
数据库·swiftui·swift
大熊猫侯佩2 天前
由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(一)
数据库·swiftui·swift
season_zhu2 天前
iOS开发:关于日志框架
ios·架构·swift
大熊猫侯佩2 天前
SwiftUI 中如何花样玩转 SF Symbols 符号动画和过渡特效
swiftui·swift·apple
大熊猫侯佩2 天前
SwiftData 共享数据库在 App 中的改变无法被 Widgets 感知的原因和解决
swiftui·swift·apple
大熊猫侯佩2 天前
使用令牌(Token)进一步优化 SwiftData 2.0 中历史记录追踪(History Trace)的使用
数据库·swift·apple
大熊猫侯佩2 天前
SwiftUI 在 iOS 18 中的 ForEach 点击手势逻辑发生改变的解决
swiftui·swift·apple