RealityKit之创建一个AR应用

使用模板创建 AR 项目

使用 Xcode创建一个 AR 项目时,直接选择Augmented Reality App模板:

接着,项目的配置选择SwiftUIRealityKit

项目创建好后,运行项目。注意RealityKit构建的项目无法直接在预览或者模拟器中查看效果,需要将项目运行在 iPad 或者 iPhone的真实设备上。

默认项目运行情况如下:

初始默认的项目中,通过实现UIViewRepresentable协议来显示一个UIKit中的视图。这个协议必须要是实现两个方法makeUIViewupdateUIView,前者用来构建和返回一个 UIView类型的视图;后者根据SwiftUI中的状态变量变化时来更新UIView

RealityKit 层次结构介绍

上面的图为官方文档中提供的层次结构图。

RealityKit中,最上层是一个ARView,用来向用户展示一个渲染的 3D 图形。一个ARView都有一个单一的Scene,这是一个Entity集合的容器。在Scene上,我们可以添加一个或者多个AnchorEntity,这个实例可以让 ARView知道如何将内容显示在真实的世界中。对于每一个AnchorEntity,我们可以在上面添加多个和多层次的Entity用来构建场景内容。

现在,我们来看看初始项目中的makeUIView方法,它的实现步骤如下:

  1. 创建一个ARView实例:
1
let arView = ARView(frame: .zero)
  1. 创建一个ModelEntity的实例,并添加一些基础的材质。这里是创建了一个长宽高均为 0.1m,圆角 0.005m的正方体:
1
2
3
let mesh = MeshResource.generateBox(size: 0.1, cornerRadius: 0.005)
let material = SimpleMaterial(color: .gray, roughness: 0.15, isMetallic: true)
let model = ModelEntity(mesh: mesh, materials: [material])
  1. 创建一个AnchotEntity实例,并将上面创建ModelEntity添加到这个实例上:
1
2
let anchor = AnchorEntity(.plane(.horizontal, classification: .any, minimumBounds: SIMD2<Float>(0.2, 0.2)))
anchor.children.append(model)
  1. 将创建的AnchorEntity实例添加到ARViewScene上:
1
arView.scene.anchors.append(anchor)
  1. 最后就是返回ARView的实例。

场景追踪和辅助层添加

在一个 AR 的场景中,我们需要对当前的场景变化进行实时的场景追踪,例如识别到水平面后才放置 3D 对象。要想实现场景的追踪,需要用到ARKit,所以我们首先需要导入这个模块:

1
import ARKit

然后删除makeUIView中除了ARView实例创建的代码:

1
2
3
4
5
6
func makeUIView(context: Context) -> ARView {
let arView = ARView(frame: .zero)

// TODO: 待添加
return arView
}

接着就是在TODO部分实现场景追踪的代码:

1
2
3
4
let session = arView.session // 获取 ARView中的 session
let config = ARWorldTrackingConfiguration() // 世界追踪配置
config.planeDetection = [.horizontal] // 水平面追踪
session.run(config) // AR的session根据这个配置进行运行

AR 的 session 用来支持视图的渲染,它是ARSession的实例。在RealityKit中会自动创建一个默认的session来管理视图。

如果此时运行项目,它已经能够实时的追踪当前场景中的平面了,为了更加直观的看到这种追踪的效果,可以在ARView中添加一个辅助层视图。

1
2
3
4
5
6
// 辅助视图
let coachingOverlay = ARCoachingOverlayView()
coachingOverlay.autoresizingMask = [.flexibleWidth, .flexibleHeight]
coachingOverlay.session = session
coachingOverlay.goal = .horizontalPlane // 目标为水平
arView.addSubview(coachingOverlay) // 将赋值视图作为子视图添加到 ARView 上

另外,当 AR 追踪到平面时可以让它显示特征点或者锚点:

1
arView.debugOptions = [.showFeaturePoints, .showAnchorOrigins, .showAnchorGeometry]

此时项目运行后的效果如下:

当 AR 场景中识别到水平面之后,就会显示水平面的特征点、一个锚点坐标轴锚点的几何形状。另外我们注意到AR 场景会识别到多个不同的水平面。

从 Reality Composer 中获取.usdz格式的模型

从 iPad 或者 iPhone 的 App Store 中搜索下载Reality Composer这个软件。Reality Composer可以让我们简单快速的构建、调整和模拟一个 AR 场景。

Xcode 15.0之前集成了这个工具,但是目前最新版的Xcode 已经移除。

除此之外,还需要下载 **Reality Converter **,它可以帮助我们在 Mac 上查看、自定义以及转换不同格式的 3D 模型。

下载链接Creation tools for spatial apps - Augmented Reality - Apple Developer

点击放置物体对象

未完待续!!