概述
本部分内容是针对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的视图了。
//常规序列化
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。
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
实例,而是经过 ARView
的 scene
特点来拜访与视图关联的唯一场景。要向视图的场景增加内容,首要创立并增加一个或多个 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