Highlight
ARKit 5 扩展了位置锚点的支持区域、新增 App Clip Code 追踪、支持 iPad Pro 超广角前置摄像头的人脸追踪,并提升了动作捕捉的精度和距离范围。
核心内容
位置锚点:从室内走向户外
(01:31)
ARKit 4 引入的位置锚点(Location Anchors)让 AR 内容可以绑定到真实世界的经纬度坐标。这在室内 AR 已经很好用了,但户外场景才是它真正的舞台。ScavengAR 应用就用它创建了虚拟公共艺术装置,iOS 15 的地图应用也用它实现了 AR 步行导航。
今年位置锚点的支持区域从美国 5 个大都市扩展到了 25 个以上,还首次增加了美国以外的城市:伦敦。对于不在支持区域的开发者,ARKit 提供了录制和回放功能,可以用 Reality Composer 在户外录制场景数据,然后在 Xcode 中回放调试。
引导用户完成定位:GeoTracking Coaching Overlay
(05:06)
位置锚点需要设备在户外扫描建筑物立面来完成定位。这个过程中用户不知道该怎么操作,容易放弃。
ARKit 5 新增了 .geoTracking 目标的 ARCoachingOverlayView,它会显示动画引导用户将设备对准建筑物。这个 UI 和地图应用中的引导界面一致,用户已经有认知基础。开发者只需要设置 goal: .geoTracking 就能启用。
App Clip Code:AR 内容的精确入口
(09:10)
App Clip Code 去年随 App Clips 一起推出,用户扫码就能启动轻量应用。今年 ARKit 5 新增了对 App Clip Code 的追踪能力。
ARAppClipCodeAnchor 包含三个关键属性:嵌入的 URL、解码状态(.decoding / .decoded / .failed)和码的物理半径。解码 URL 需要时间,开发者可以在解码过程中显示占位内容,给用户即时反馈。
Primer 应用展示了实际用法:用户扫描瓷砖样品上的 App Clip Code,App Clip 启动后直接在墙上预览该瓷砖的 AR 效果,无需下载完整应用。
人脸追踪:超广角视野
(17:29)
新款 iPad Pro 配备了超广角前置摄像头,视野比普通前置摄像头大很多。ARKit 5 支持在这颗摄像头上运行人脸追踪,但需要开发者主动选择。
通过遍历 supportedVideoFormats,检查 captureDeviceType 是否为 .builtInUltraWideCamera,然后将选中的格式设置到 ARFaceTrackingConfiguration 上即可启用。注意超广角摄像头不提供深度数据,capturedDepthData 会为空。
动作捕捉:更远的距离和更大的动作范围
(18:59)
在 A14 芯片设备(如 iPhone 12)上,ARKit 5 的动作捕捉支持更宽的身体姿态范围。旋转精度更高,适合追踪运动动作。摄像头可以从更远的距离追踪身体关节,肢体活动的追踪范围也大幅增加。这些改进不需要修改代码,iOS 15 上的所有动作捕捉应用自动受益。
详细内容
检查位置锚点支持并创建 GeoTracking 会话
import ARKit
import CoreLocation
func startGeoTrackingSession() {
// 检查设备是否支持
guard ARGeoTrackingConfiguration.isSupported else {
print("Geo tracking requires A12+ with cellular and GPS")
return
}
// 检查当前位置是否可用
ARGeoTrackingConfiguration.checkAvailability { available, error in
guard available else {
print("Geo tracking not available at this location")
return
}
let configuration = ARGeoTrackingConfiguration()
let session = ARSession()
session.delegate = self
session.run(configuration)
}
}
// 添加位置锚点
func addGeoAnchor(at coordinate: CLLocationCoordinate2D, altitude: CLLocationDistance? = nil) {
let geoAnchor: ARGeoAnchor
if let altitude = altitude {
geoAnchor = ARGeoAnchor(coordinate: coordinate, altitude: altitude)
} else {
geoAnchor = ARGeoAnchor(coordinate: coordinate)
}
session.add(anchor: geoAnchor)
}
关键点:
ARGeoTrackingConfiguration.isSupported检查设备硬件条件(A12+、蜂窝网络、GPS)checkAvailability异步检查当前地理位置是否在支持区域内ARGeoAnchor可以用经纬度创建,也可以额外指定海拔高度- 添加锚点时设备距离目标位置应在 50 米以内,以获得更精确的高度数据
使用 GeoTracking Coaching Overlay
import ARKit
import UIKit
class ViewController: UIViewController, ARSessionDelegate {
@IBOutlet var arView: ARView!
override func viewDidLoad() {
super.viewDidLoad()
let coachingOverlay = ARCoachingOverlayView()
coachingOverlay.session = arView.session
coachingOverlay.goal = .geoTracking
coachingOverlay.translatesAutoresizingMaskIntoConstraints = false
arView.addSubview(coachingOverlay)
NSLayoutConstraint.activate([
coachingOverlay.leadingAnchor.constraint(equalTo: arView.leadingAnchor),
coachingOverlay.trailingAnchor.constraint(equalTo: arView.trailingAnchor),
coachingOverlay.topAnchor.constraint(equalTo: arView.topAnchor),
coachingOverlay.bottomAnchor.constraint(equalTo: arView.bottomAnchor)
])
}
}
关键点:
ARCoachingOverlayView的goal设为.geoTracking会显示针对位置锚点的引导动画- 引导完成后 overlay 自动消失,应用可以开始放置 AR 内容
- 建议同时监听
session(_:didChange:)中的 geo tracking 状态,获取更详细的定位信息
追踪 App Clip Code
import ARKit
class ViewController: UIViewController, ARSessionDelegate {
var session: ARSession!
func startAppClipCodeTracking() {
guard ARAppClipCodeAnchor.isSupported else {
print("App Clip Code tracking requires A12+")
return
}
let configuration = ARWorldTrackingConfiguration()
configuration.appClipCodeTrackingEnabled = true
session.run(configuration)
}
func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {
for anchor in anchors.compactMap({ $0 as? ARAppClipCodeAnchor }) {
switch anchor.urlDecodingState {
case .decoding:
// 显示占位内容,提示用户正在解码
showPlaceholder(at: anchor)
case .decoded:
// URL 解码成功,加载对应内容
if let url = anchor.url {
loadContent(for: url, at: anchor)
}
case .failed:
// 解码失败,提示用户
showDecodingError(at: anchor)
@unknown default:
break
}
}
}
}
关键点:
ARAppClipCodeAnchor.isSupported检查设备是否支持(A12+)appClipCodeTrackingEnabled必须在配置中显式开启- 解码状态分三种:
.decoding(正在解码)、.decoded(成功)、.failed(失败) anchor.radius提供码的物理半径,可用于精确放置内容
启用 iPad Pro 超广角人脸追踪
import ARKit
func enableUltraWideFaceTracking() -> ARFaceTrackingConfiguration? {
guard ARFaceTrackingConfiguration.isSupported else { return nil }
let configuration = ARFaceTrackingConfiguration()
// 查找超广角摄像头格式
for format in ARFaceTrackingConfiguration.supportedVideoFormats {
if format.captureDeviceType == .builtInUltraWideCamera {
configuration.videoFormat = format
break
}
}
return configuration
}
关键点:
- 超广角格式需要主动遍历
supportedVideoFormats查找 - 设置
videoFormat后运行会话即可启用超广角人脸追踪 - 超广角模式下没有深度数据,依赖深度数据的功能需要回退到普通前置摄像头
核心启发
-
做什么:在城市景点或商业区部署基于位置的 AR 导览 为什么值得做:位置锚点让 AR 内容精确绑定到真实地理坐标,用户走到特定位置自动触发内容 怎么开始:用
ARGeoTrackingConfiguration创建会话,通过ARGeoAnchor在目标位置放置虚拟内容 -
做什么:为零售商品添加 App Clip Code,实现扫码即看 AR 效果 为什么值得做:用户无需下载完整应用,扫码就能预览家具、瓷砖、装饰品在自己空间中的效果 怎么开始:在商品包装上印刷 App Clip Code,App Clip 中启用
appClipCodeTrackingEnabled,扫描后加载对应 3D 模型 -
做什么:开发一款舞蹈或健身教学 App,实时评估用户动作 为什么值得做:ARKit 5 的动作捕捉支持更远距离和更大动作范围,适合家庭健身场景 怎么开始:使用
ARBodyTrackingConfiguration,从ARFrame中提取skeleton3D,计算关节角度并与标准动作比对 -
做什么:在 iPad Pro 上构建多人 AR 面具或表情应用 为什么值得做:超广角前置摄像头可以容纳更多人的面部,适合多人互动场景 怎么开始:选择
.builtInUltraWideCamera格式启动人脸追踪,为检测到的每个ARFaceAnchor叠加虚拟内容
关联 Session
- Dive into RealityKit 2 — RealityKit 2 的新特性,与 ARKit 5 配合构建沉浸式 AR 体验
- Explore advanced rendering with RealityKit 2 — RealityKit 2 的高级渲染能力,增强 AR 内容视觉效果
- Create 3D models with Object Capture — 用 Object Capture 创建 3D 模型,作为 ARKit 场景的内容素材
评论
GitHub Issues · utterances